`binding`是否适用于`iterate`?

时间:2015-03-31 09:28:02

标签: clojure

代码有什么问题吗?看起来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)

1 个答案:

答案 0 :(得分:7)

问题是iterate返回一个懒惰的序列。因此,当您尝试打印序列时,第一次调用incr函数会发生在binding范围之外。

从技术上讲,您的incr功能不会因为使用^:dynamic变量而产生副作用。

如果你想使用binding延迟序列,你应该强制在binding范围内的某个地方评估你的序列,例如:

(binding [*step* 2]
  (doall (take 3 (iterate incr 1))))
; => (1 3 5)