回答:
doall
は、あなたが必要とすることすべてです。seq
hasタイプLazySeq
があるからといって、保留中の評価があるという意味ではありません。Lazy seq
は結果をキャッシュするため、すべてを強制するためにLazyをseq
1回歩くだけで(そうするように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