(defn seq-trial
[]
(map #(do (println "hello " %) (inc %)) (range 10)))
(take 3 (seq-trial))
评估时上面的代码snippt打印出以下内容 -
(你好0 你好1 你好2 你好3 你好4 你好5 你好6 你好7 你好8 你好9 1 2 3)
因为map返回了一个懒惰的序列,我希望它只能打印 -
(你好0 你好1 你好2 1 2 3)
为什么在这里评估整个清单?
答案 0 :(得分:8)
这是因为称为分块的性能优化。本质上,序列是在称为块的 n 项的组中实现的。这意味着您需要注意映射函数中的任何副作用。最终结果是正确的,你仍然得到一个返回正确长度的序列
默认的块大小为32,因此如果您将范围增加到大于该值的值,您将了解更好的内容:
user> (defn seq-trial
[]
(map #(do (println "hello " %) (inc %)) (range 100)))
user> (take 3 (seq-trial))
hello 0 ; 32 item 'chunk' realized...
hello 1
...
hello 30
hello 31
(1 2 3) ; the expected returned value
如果您需要避免分块,请options available