这是一个接受输入的代码,如果它是素数则打印 最后如果总是打印“假”,为什么?
(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"))
答案 0 :(得分:1)
在Common Lisp中,false值,空列表和符号nil
是相同的。忽略除了最后一行之外的每一行代码基本上都是:
(if nil ; nil is false
(print "True")
(print "False"))
因此,false始终为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))))