lisp(素数)代码不工作
这是一个接受输入并打印是否为素数的代码 最后一个如果总是打印“false”,为什么lisp(素数)代码不工作,lisp,primes,Lisp,Primes,这是一个接受输入并打印是否为素数的代码 最后一个如果总是打印“false”,为什么 (打印“输入正整数”) (设置数量(读取)) (setq i 2) (setq素数t) (环路 (如果(=(rem num i)0)(setq prime nil)中断) (incf i) (当(在Common Lisp中为假值时,空列表和符号nil是相同的。忽略除最后一行之外的每一行代码基本上是: (if nil ; nil is false (print "True")
(打印“输入正整数”)
(设置数量(读取))
(setq i 2)
(setq素数t)
(环路
(如果(=(rem num i)0)(setq prime nil)中断)
(incf i)
(当(在Common Lisp中为假值时,空列表和符号nil
是相同的。忽略除最后一行之外的每一行代码基本上是:
(if nil ; nil is false
(print "True")
(print "False"))
所以这里false总是false,所以它总是选择可选的(打印“false”)
。这就是为什么
其他错误:
在这段代码中,变量是setq
变量i
和prime
,没有定义它们,因为它们是特殊的,所以应该给它们戴上*耳罩*
,这样你就可以看到它们与词汇绑定形成对比
loop
宏有点奇怪,因为它没有使用任何loop
宏关键字。对变量break
的求值似乎未定义。loop
宏本身就是一种完全不同的语法和语言,您需要以与lisp相同的方式学习。它不是lispy这是语法
您应该进行抽象。使函数能够很好地工作。在代码中使用它们。以下是我收集的您想要做的:
(defun primep(num)
(循环:对于i:from 2:to(/num 2)
:从不(zerop(rem num i)))
当我把prime放在if条件下时,它说的是未定义的函数prime,耳罩到底是什么?@ahmedmohamed听起来像是在做(if(prime)…
调用名为prime
的函数,并调查结果,而不是(if prime…)
研究变量prime
的真实性。初学者最常见的错误是添加额外的括号来改变代码的含义。@ahmedmohamed耳罩指的是以*
开头和结尾的变量。就像变量*test*
一样。避免混淆词汇是一种常见的命名约定al和动态变量。在CL中,全局特殊变量是动态的,而不是词汇性的,因此,如果您错误地创建了全局范围,那么使用同一变量的所有其他函数可能会开始行为不正常,这是一个bug,您将很难找到。仅使用一个变量而不声明它,通常会被解释为该变量是动态的,并且它是poiso在所有其他地方,您可能使用了相同的变量名。
(if nil ; nil is false
(print "True")
(print "False"))