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))
修复它
前几天看了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))