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