代码有什么问题吗?看起来binding
似乎无法使用iterate
?
(def ^:dynamic *step* 1) (defn incr [n] (+ n *step*)) (take 3 (binding [*step* 2] (iterate incr 1)))
给出
'(1 2 3)
不
'(1 3 5)
答案 0 :(得分:7)
问题是iterate
返回一个懒惰的序列。因此,当您尝试打印序列时,第一次调用incr
函数会发生在binding
范围之外。
从技术上讲,您的incr
功能不会因为使用^:dynamic
变量而产生副作用。
如果你想使用binding
延迟序列,你应该强制在binding
范围内的某个地方评估你的序列,例如:
(binding [*step* 2]
(doall (take 3 (iterate incr 1))))
; => (1 3 5)