lisp(素数)代码不起作用

问题描述 投票:0回答:1

这是一个代码,它接受输入并打印,如果它是素数或不是最后如果总是打印“假”,为什么?

(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"))
lisp primes
1个回答
1
投票

在Common Lisp中,false值,空列表和符号nil是相同的。忽略除了最后一行之外的每一行代码基本上是:

(if nil             ; nil is false
    (print "True")
    (print "False"))

所以这里假的总是假的,所以它总会选择替代的(print "False")。这就是为什么。

其他错误:

  1. 在这个代码中是setq变量iprime没有定义它们,因为它们将是特殊的,它们应该被赋予*earmuffs*,以便你看到它们与词法绑定形成对比。
  2. loop宏在它不使用任何loop宏关键字的方式上略显奇怪。有一个似乎未定义的变量break的评估。 loop宏本身就是一种完全不同的语法和语言,你需要以与lisp相同的方式学习。它的语法不是lispy。
  3. 你应该抽象。使功能更好地工作。在你的代码中使用它们。以下是我想要做的事情:
(defun primep (num)
  (loop :for i :from 2 :to (/ num 2)
        :never (zerop (rem num i))))
© www.soinside.com 2019 - 2024. All rights reserved.