2015-03-31 75 views
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) 

回答

7

的問題是,iterate返回一個懶惰的序列。因此,當您嘗試打印序列時,incr函數的第一次調用發生在binding範圍之外。

從技術上講,incr函數不會因爲使用^:dynamic變量而產生副作用。

如果你想使用binding懶序列,你應該迫使你的序列的評價某處binding範圍內,例如:

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