Lisp 代码错误Lambda表达式

Lisp 代码错误Lambda表达式,lisp,common-lisp,Lisp,Common Lisp,我正在尝试编写一个lisp函数来测试一个数字是否为素数。我收到lambda表达式错误(我已经搜索了之前回答的与此相关的问题),但我找不到解决方案 (defun prime(n) ( (defvar '(*ok* nil) (*i* nil) (*d* nil) (setf *ok* 1) (loop for *i* from 1 to (sqrt n) do ( (if (= (mod n *d*) 0) (setf

我正在尝试编写一个lisp函数来测试一个数字是否为素数。我收到lambda表达式错误(我已经搜索了之前回答的与此相关的问题),但我找不到解决方案

(defun prime(n) 
(    
  (defvar '(*ok* nil) (*i* nil) (*d* nil)  
  (setf *ok* 1)
     (loop for *i* from 1 to (sqrt n) do
       ( 
    (if (= (mod n *d*) 0)
            (setf *ok* 0))  
       )
     )
     (if (= *ok* 1)
            (format t "Numarul prim")
            (format t "Numarul nu este prim")
         )
 )

)

我无意听起来粗鲁,但你确实需要阅读一本像样的通用Lisp教程;您的代码更像是“您可以用任何语言编写C代码”,并加入了一些“我没有得到动态变量的东西”

为了向您展示您真正想要的东西,下面是我将如何编写您的逻辑:

(defun prime (n)
  (if (loop
         for i from 2 to (sqrt n)
         when (zerop (mod n i)) return nil
         finally (return t))
      "Numarul prim"
      "Numarul nu este prim"))
测试:

CL-USER> (loop
   for i from 2 to 20
   do (format t "~a ~a~%" i (prime i)))
2 Numarul prim
3 Numarul prim
4 Numarul nu este prim
5 Numarul prim
6 Numarul nu este prim
7 Numarul prim
8 Numarul nu este prim
9 Numarul nu este prim
10 Numarul nu este prim
11 Numarul prim
12 Numarul nu este prim
13 Numarul prim
14 Numarul nu este prim
15 Numarul nu este prim
16 Numarul nu este prim
17 Numarul prim
18 Numarul nu este prim
19 Numarul prim
20 Numarul nu este prim
NIL

编辑1-使用局部变量:

(defun prime (n)
  (let ((is-prime t))
    (loop
       for i from 2 to (sqrt n)
       when (zerop (mod n i))
       do (setf is-prime nil))
    (if is-prime
       "Numarul prim"
       "Numarul nu este prim")))

编辑2-“我如何对所有这些素数求和”

让我们回到一个真函数——在本例中,一个谓词指示一个数字是素数(返回
t
)还是非素数(返回
nil
):

以及第二个函数,该函数将上界和下界之间的所有素数收集到一个列表中:

(defun primes (pfrom pto)
  (loop
     for i from pfrom to pto
     when (prime i) collect i))

CL-USER> (primes 2 20)
(2 3 5 7 11 13 17 19)
那你只需要

CL-USER> (reduce '+ (primes 2 20))
77

好啊谢谢你的回答,但我需要像c风格的算法一样,当你只找到一个除法器时,不需要制动程序,我还需要在程序的末尾包含if测试,但我没有在lispIn c中得到它,你也会
中断
出循环IIRC。我已经根据你的描述添加了一个版本,但我不会这样做。我如何将所有这些素数的和求和?请参阅我的更新。在StackOverflow上,你不应该时不时地扩展你的问题,而应该创建新的问题。此外,如果您的初始问题已得到答复,请通过点击复选标记来考虑。如果没有,请告诉我们遗漏了什么。这是一本很好的Lisp介绍书。免费下载PDF:
CL-USER> (reduce '+ (primes 2 20))
77