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