好的。我一直在修补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