Common Lisp中的素数

时间:2016-01-23 06:15:02

标签: common-lisp

嗯,我只是对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没有值

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

1 个答案:

答案 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本质上是全局变量。