好吧,我只是全新的Common Lisp编程语言,我已经从昨天开始自己学习这种语言,这也是出于兴趣.现在当我遇到函数和循环时,在了解它们之后我开始开发Prime数字Common Lisp中的问题.我的代码如下:
(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)
)
Run Code Online (Sandbox Code Playgroud)
现在我遇到这个代码的问题是,每当我尝试执行此代码时,我得到的错误如下:
***IF:变量C没有值
但是我已经宣布了它的价值已经出现了.所以我想知道的是,即使我已经宣布了这个错误,为什么会出现这个错误.
当要求Emacs根据括号深度重新编写代码时,错误的原因立即显而易见:
(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))
Run Code Online (Sandbox Code Playgroud)
正如您所看到的,您(if (= c 1) (return-from prime num))只是在prime函数之外,当它作为加载文件的一部分被eval'd时,它会尝试eval c,这确实是未绑定的,因为它超出了c绑定的任何范围.
您可能希望使用可以突出显示括号对的编辑器,以便更轻松地避免这些问题.
另一方面,您可能希望使用(let)而不是(setq),为您提供适当的词法绑定.该方式程序正在写的,c并且a基本上是全局变量.