Common Lisp - 无限循环中的粘液

问题描述

几天前我开始学习 Common Lisp,阅读 Peter Seibel 的书。我已经下载了适用于 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)))

函数按照我的预期执行并返回第 n 个斐波那契数。现在出于好奇,我尝试使用 dotimes 循环对前 10 个斐波那契数进行求和

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

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

(dotimes (k 10) (fib k))

应该返回 NIL。但这也无限期地运行。有人可以向我解释我缺少什么吗?

谢谢

解决方法

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

通过 (fib (+ k 1)) 修复它