【发布时间】:2014-03-23 09:09:50
【问题描述】:
我开始阅读/研究 clojure,为此我开始同时阅读“Programming Clojure”和“Practical Clojure”书籍。我在那里看到了一个惰性序列如何工作的示例,对我来说非常清楚以了解惰性序列的工作原理,但不幸的是它不起作用,或者至少不是我期望的那样。
示例如下:
(defn square[x]
(do
(println "[current.elem=" x "]")
(* x x))
)
(def var-00 (map square '(1 2 3 5 6 4)))
当我打电话时:
var-00
,我希望控制台(REPL)上不会打印任何消息,但我得到了以下结果:
([current.elem= 1 ][current.elem= 2 ]1 [current.elem= 3 ]4 [current.elem= 5 ]9 [current.elem= 6 ]25 [current.elem= 4 ]36 16)
这意味着函数 map 被调用了,即使我认为不会发生任何事情,因为 'var-00' 只是对函数 'map' 的引用;如果我打电话,从我的角度来看更尴尬:
(nth var-00 2)
我明白了:
[current.elem= 1 ][current.elem= 2 ][current.elem= 3 ]9
,如果我再打电话:
(nth var-00 3)
我明白了:
[current.elem= 1 ][current.elem= 2 ][current.elem= 3 ][current.elem= 5 ]25;
previous elements(1,2,3) 再次计算我认为这些元素应该在第一次调用时被“缓存”,现在只应该计算元素 5。我是不是做错了什么,或者我没有完全理解惰性序列在 clojure 中的工作原理?顺便提一下,我使用 IntellijIDEA 和 LaClojure 插件来运行程序。
谢谢索林。
【问题讨论】:
标签: clojure