lisp(素数)代码不工作

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")

这是一个接受输入并打印是否为素数的代码 最后一个如果总是打印“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")
    (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"))