【发布时间】:2012-05-20 08:22:35
【问题描述】:
(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 个元素(如果可用)。哎哟。
我在:let 中有一个带有递归调用的for。我很好奇为什么计算似乎是以广度优先而不是深度优先的方式进行的。似乎计算(虽然,公平地说,不是内存)正在爆炸,因为我一直在递归树的所有上层分支。 Clojure 的 32 个分块强制进行广度优先评估,尽管代码的逻辑意图是深度优先。
无论如何,有没有简单的方法来强制 1-chunking 而不是 32-chunking 的惰性序列?
【问题讨论】:
标签: clojure list-comprehension lazy-evaluation