Answers:
doall是你所需要的全部。仅仅因为seqhas类型LazySeq并不意味着它具有待处理的评估。Lazy seq缓存它们的结果,因此您需要做的就是seq一次(像doall这样)对Lazy进行遍历,以强制全部执行,从而使其变为非Lazy。seq并没有强制整个集合进行评估。
realized?。
realize进行匹配操作realized?。
contains?并不关心您是否意识到了惰性序列,因此这可以回答所询问的特定问题,而对问题的标题的回答则较少。
这在某种程度上是分类学的问题。 惰性序列只是列表,向量或图谱的一种类型。因此,答案当然是“这取决于您要获得哪种类型的非延迟序列:
从以下选项中进行选择:
(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]
(.getClass (into '() (take 3 (repeatedly rand))))
doall