lisp(素数)代码不起作用
lisp (prime number) code not working
这是一个接受输入并打印它是否为素数的代码
最后一个 if 总是打印 "false" ,为什么?
(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中的假值、空列表和符号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))))
这是一个接受输入并打印它是否为素数的代码 最后一个 if 总是打印 "false" ,为什么?
(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中的假值、空列表和符号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))))