这是一个代码,它接受输入并打印,如果它是素数或不是最后如果总是打印“假”,为什么?
(print "Enter a positive integer")
(setq num (read))
(setq i 2)
(setq prime t)
(loop
(if(=(rem num i)0)(setq prime nil) break)
(incf i)
(when (<= (/ num 2)i)(return t))
)
(if()(print "True")(print "False"))
在Common Lisp中,false值,空列表和符号nil
是相同的。忽略除了最后一行之外的每一行代码基本上是:
(if nil ; nil is false
(print "True")
(print "False"))
所以这里假的总是假的,所以它总会选择替代的(print "False")
。这就是为什么。
其他错误:
setq
变量i
和prime
没有定义它们,因为它们将是特殊的,它们应该被赋予*earmuffs*
,以便你看到它们与词法绑定形成对比。loop
宏在它不使用任何loop
宏关键字的方式上略显奇怪。有一个似乎未定义的变量break
的评估。 loop
宏本身就是一种完全不同的语法和语言,你需要以与lisp相同的方式学习。它的语法不是lispy。(defun primep (num)
(loop :for i :from 2 :to (/ num 2)
:never (zerop (rem num i))))