Common Lisp中的素数

adi*_*305 -3 common-lisp

好吧,我只是全新的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没有值

但是我已经宣布了它的价值已经出现了.所以我想知道的是,即使我已经宣布了这个错误,为什么会出现这个错误.

Dol*_*000 8

当要求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基本上是全局变量.