2
代碼有問題嗎?看起來像binding
不適用於iterate
?`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)
代碼有問題嗎?看起來像binding
不適用於iterate
?`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)