Common Lisp - 无限循环中的 SLIME

Common Lisp - SLIME in infinte loop

前几天看了Peter Seibel的书,开始学习Common Lisp。我已经为 Windows 下载了 lispbox-0.7,并尝试了 SLIME REPL 中的一些概念。

现在我在第 7 章。宏和标准控制结构/循环,我发现第 11 个斐波那契数的这个有趣的do表达式

(do ((n 0 (1+ n))
 (cur 0 next)
 (next 1 (+ cur next)))
((= 10 n) cur))

我定义了以下函数

(defun fib (n) (do ((i 1 (1+ i)) (cur 0 next) (next 1 (+ cur next))) ((= n i) cur)))

该函数符合我的预期,return是第 n 个斐波那契数。现在出于好奇,我尝试使用 dotimes 循环对前 10 个斐波那契数求和

(let ((sum 0)) (dotimes (k 10) (setf sum (+ sum (fib k)))) sum)

但是这个表达式无限期地运行,我不明白为什么。也许这是另一个我不知道的概念。我尝试了一个更简单的例子,比如

(dotimes (k 10) (fib k))

应该 return NIL。但这也无限期地运行。有人可以向我解释我错过了什么吗?

感谢

好吧,没关系,不够小心。代码尝试评估 fib 0,但无法满足 do 中的测试条件。这就是它无限期运行的原因

通过 (fib (+ k 1))

修复它