代码错误 Lambda 表达式

Code bug Lambda expression

我正在尝试编写一个 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")
         )
 )

)

我并不是有意显得粗鲁,但你确实需要阅读一本不错的 Common Lisp 教程;您的代码更像是 "you can code C in any language",其中包含一些 "I didn't get the dynamic variable stuff"。

为了向您展示您真正想要的,我将按照以下方式编写您的逻辑:

(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 - "how can I sum all these prime numbers"

让我们回到一个真正的函数——在本例中,一个谓词表明一个数是质数 (returns t) 还是非质数 (returns nil):

(defun prime (n)
  (loop
     for i from 2 to (sqrt n)
     when (zerop (mod n i)) return nil
     finally (return t)))

CL-USER> (prime 2)
T
CL-USER> (prime 3)
T
CL-USER> (prime 4)
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