代码错误 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
我正在尝试编写一个 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