(take 2 (for [x (range 10)
:let [_ (println x)]
:when (even? x)] x))
>> (* 0
* 1
* 2
* 3
* 4
* 5
* 6
* 7
* 8
* 9
0 2)
我以为我只是非常密集。但不,事实证明 Clojure 实际上评估了任何惰性序列的前 32 个元素(如果可用)。哎哟。
我for
在:let
. 我很好奇为什么计算似乎是以广度优先而不是深度优先的方式进行的。似乎计算(虽然,公平地说,不是内存)正在爆炸,因为我一直在递归树的所有上层分支。Clojure 的 32 个分块强制进行广度优先评估,尽管代码的逻辑意图是深度优先。
无论如何,有没有简单的方法来强制 1 块而不是 32 块的惰性序列?