Clojure “binding”与“iterate”一起使用吗?

Clojure “binding”与“iterate”一起使用吗?,clojure,Clojure,代码有问题吗?看起来绑定与迭代不兼容 (def ^:dynamic *step* 1) (defn incr [n] (+ n *step*)) (take 3 (binding [*step* 2] (iterate incr 1))) (定义^:动态*步骤*1) (定义增量[n](+n*步骤*) (第3步(绑定[*步骤*2](迭代增量1))) 给予 '(1 2 3) 不是 '(1 3 5) 问题是,iterate返回一个惰性序列。因此,当您试图打印序列时,对incr函数的第一次调用发生在

代码有问题吗?看起来
绑定
迭代
不兼容

(def ^:dynamic *step* 1) (defn incr [n] (+ n *step*)) (take 3 (binding [*step* 2] (iterate incr 1))) (定义^:动态*步骤*1) (定义增量[n](+n*步骤*) (第3步(绑定[*步骤*2](迭代增量1))) 给予

'(1 2 3) 不是

'(1 3 5)
问题是,
iterate
返回一个惰性序列。因此,当您试图打印序列时,对
incr
函数的第一次调用发生在
binding
范围之外

从技术上讲,您的
incr
函数并非仅仅因为使用
^:dynamic
变量就没有副作用

如果要对惰性序列使用
绑定
,则应强制对
绑定
范围内的某个位置的序列求值,例如:

(绑定[*步骤*2]
(doall(取3(迭代增量1)))
; => (1 3 5)
'(1 2 3) '(1 3 5)