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

Fen*_*eng 2 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)

Leo*_*tny 7

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

从技术上讲,你的incr功能并不是因为它使用^:dynamic变量而没有副作用.

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

(binding [*step* 2]
  (doall (take 3 (iterate incr 1))))
; => (1 3 5)
Run Code Online (Sandbox Code Playgroud)