好的。我一直在修補Clojure,並且不斷遇到同樣的問題。讓我們的代碼,這個小片段:在Clojure循環中重新定義let'd變量
(let [x 128]
(while (> x 1)
(do
(println x)
(def x (/ x 2)))))
現在我希望這打印出序列與128開始像這樣:
128
64
32
16
8
4
2
相反,它是一個無限循環,反覆印刷128。很明顯,我的預期副作用不起作用。
那麼我該如何在這樣的循環中重新定義x的值呢?我意識到這可能不是Lisp(我可以使用一個匿名函數,它可能是自我遞歸的),但是如果我不知道如何設置變量,我會發瘋的。
我的另一個猜測是使用set !,但是它給出了「無效的賦值目標」,因爲我沒有綁定的形式。
請啓發我如何這應該工作。
感謝。我意識到我的方式不是Lispy,因爲副作用令人不悅。我正在通過一些東西(一個歐拉項目問題)進行黑客攻擊,無法讓這個簡單的測試案例起作用,證明我沒有理解某些東西。謝謝您的幫助。我忘了循環可以保持復發,工作很乾淨(沒有額外的功能做遞歸)。 – MBCook 2009-06-02 18:25:35