为什么这个 Lisp do 循环的输出与预期不同?
身体:
我有以下 Common Lisp 代码:
(setq x 10)
(setq y 30)
(do ((x 0 (+ 3 x))
(y 20 (- y 2))
(z (- y x) (- z x)))
((> x y) (- x y)) ; Exit condition
(format t "~% z = ~d" z))
(format t "x = ~d y = ~d" x y)
我希望输出是:
z = 20
z = 17
z = 11
z = 2
z = -10
x = 15 y = 10
但是,当我运行这段代码时,编译器告诉我这不是正确的解决方案。我对以下内容感到困惑:
变量 x、y 和 z 在每次迭代期间如何更新? 为什么我的预期输出不正确? 正确的输出是什么以及为什么? 有人可以帮助我理解这段代码的执行流程和实际输出吗?
查看 Common Lisp 超规范中 do* 和 do 之间的区别。