嗯,我只是对Common Lisp编程语言完全陌生,我已经从昨天起开始学习这种语言,这也是出于兴趣。现在当我遇到函数和循环时,在了解它们之后我开始开发Common Lisp中的Prime Number问题。 我的代码如下:
(defun prime (num)
(setq c 1)
(setq a 2)
(loop
(setq a (+ 1 a))
(if (= (mod num a) 0)
(setq c (+ c 1))
)
(when (> (+ a 1) 17) (return a))
)
)
(if (= c 1)
(return-from prime num)
)
)
(loop for x from 1 to 20
do (prime x)
)
现在我面对这段代码的问题是每当我尝试执行此代码时,我得到的错误如下:
*** IF:变量C没有值
但是我已经宣布了它的值已经出现了。所以我想知道的是,即使我已经宣布了这个错误,为什么会出现这个错误。
答案 0 :(得分:8)
当要求Emacs根据括号深度重新编写代码时,错误的原因显而易见:
<td>
正如您所看到的,您的(defun prime (num)
(setq c 1)
(setq a 2)
(loop
(setq a (+ 1 a))
(if (= (mod num a) 0)
(setq c (+ c 1)))
(when (> (+ a 1) 17) (return a))))
(if (= c 1)
(return-from prime num)))
(loop for x from 1 to 20
do (prime x))
只是在(if (= c 1) (return-from prime num))
函数之外,当它作为加载文件的一部分被评估时,它会尝试评估prime
,确实是未绑定的,因为它超出了绑定c
的任何范围。
您可能希望使用能够突出显示括号对的编辑器,以便更轻松地避免这些问题。
另一方面,您可能希望使用c
而不是(let)
来为您提供正确的词法绑定。当前编写程序的方式(setq)
和c
本质上是全局变量。