回答:
doallは、あなたが必要とすることすべてです。seqhasタイプLazySeqがあるからといって、保留中の評価があるという意味ではありません。Lazy seqは結果をキャッシュするため、すべてを強制するためにLazyをseq1回歩くだけで(そうするようにdoall)、Lazyをレンダリングします。コレクション全体の評価を強制seqしません。
realized?。
realize一致する操作があるはずrealized?です。
contains?は、怠惰なシーケンスを実現したかどうかを気にしないので、これは質問どおりに特定の質問に答えますが、質問のタイトルには答えません。
これはある程度分類法の問題です。レイジーシーケンスは、リスト、ベクトル、またはマップと同様に、1種類のシーケンスにすぎません。したがって、答えはもちろん「取得したい非レイジーシーケンスのタイプによって異なり
ます。以下から選択してください。
(doall ... ) (apply list (my-lazy-seq)) OR (into () ...) (vec (my-lazy-seq)) ほとんどのスイートは、どのタイプのシーケンスでも必要に応じて持つことができます。
(vec (my-lazy-seq))次のような状況ではそれほど良くありません: (vec (json/parse-string "{\"foo\":\"bar\"}")) ;; => [["foo" "bar"]]からcheshireレイジー(json/parse-string)
(json/parse-string-strict)
この裕福な男は彼の陰謀を知っているようで、絶対に正しいです。
しかし、あなたの例を使用したこのコードスニペットは、この質問を補足するのに役立つと思います。
=> (realized? (take 3 (repeatedly rand)))
false
=> (realized? (doall (take 3 (repeatedly rand))))
true
確かに型は変わっていませんが、実現は
realized?に戻す必要がないことに注意してくださいtrue。例えば(let [r (range) r? (realized? r)] (doall (take 1 r)) [r? (realized? r)]) => [false true]
doall