Common lisp 公共Lisp中的素数

Common lisp 公共Lisp中的素数,common-lisp,Common Lisp,我对Common Lisp编程语言完全陌生,我从昨天开始自学这门语言,也是出于兴趣。现在,当我遇到函数和循环时,在学习了它们之后,我开始用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)) ) )

我对Common Lisp编程语言完全陌生,我从昨天开始自学这门语言,也是出于兴趣。现在,当我遇到函数和循环时,在学习了它们之后,我开始用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)
)
现在,我在这段代码中面临的问题是,每当我试图执行这段代码时,我得到的错误如下:

(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没有值


但我已经向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))
如您所见,您的
(if(=c1)(从prime num返回))
只是超出了
prime
函数的范围,当它作为加载文件的一部分进行求值时,它会尝试求值
c
,这实际上是未绑定的,因为这超出了
c
绑定的任何范围

您可能希望使用能够高亮显示括号对的编辑器,以便更容易地避免这些问题


另一方面,您可能希望使用
(let)
而不是
(setq)
,以提供适当的词汇绑定。当前编写程序的方式,
c
a
基本上都是全局变量。

在任何编程语言中,您都需要格式化和缩进代码以使其可读。也用Lisp。请不要质疑未格式化的代码。@user242453
(setq a(+1 a))
,可以替换为
(incf a)
。还有一个
1+
函数,用于编写
(+1)