私は、Clojureで与えられた述語を満たすシーケンスの最初の要素の最後を見つけようとしています。Clojureで与えられた述語を満たすシーケンスの最初の要素の最後を見つける方法はありますか?
は、私は、現時点で次のコードを使用します。
(last (take-while pred (gimme-potentially-infinite-seq ...)))
残念ながら、(take-while ...)
は、いくつかのケースでは、メモリ不足の私を引き起こして、頭の上に成り立ちます。
私はそれを解決するためにloop/if/recur
コンボを使用することができましたが、正確にはclojure.coreにいくつかの機能(または機能の組み合わせ)がありますか?
更新:last
のように頭にかかっているのはtake-while
ではありません。
更新2:私はこの(->> (range) (take 10000000) last)
をClojure REPLとClojureScript REPL(Planck 2.0.0とLumo 1.1.0)でテストしました。プランク(2GBのRAM)とLumo(1.5GB)では大きなヒープの成長が見られますが、JVM(200〜300MB)ではヒープの成長がわずかです。
私は何かが不足しているかもしれませんが、*無限*シーケンスで述語を満たす最後の要素を見つける方法はありますか?結果を得るには、シーケンス全体をスキャンする必要があります。 –
「最後」が頭の上にあると思う理由を説明できますか?あなたの呼び出しは、一定のヒープ使用(無制限の成長なし)で私のために働きます。 – glts
@gltsそれはClojureScriptのようです(上記の私の更新を見てください)。 – sickill