gpt4 book ai didi

macros - Common Lisp (SBCL) 中的素数宏

转载 作者:太空宇宙 更新时间:2023-11-03 18:51:40 24 4
gpt4 key购买 nike

这是我编写的用于测试素数的宏:

(defmacro primep (num)
`(not (or ,@(loop for p in *primes* collecting `(= (mod ,num ,p) 0)))))

*primes* 是一个动态变量,其中包含到目前为止生成的素数列表(上下文是“下一个素数生成器”函数)。以下是一些 eval-ed 语句的结果:

(let ((*primes* (list 2 3)))
(primep 6))
-> T

(let ((*primes* (list 2 3)))
(macroexpand-1 '(primep 6))
-> (NOT (OR (= (MOD 6 2) 0) (= (MOD 6 3) 0)))
-> T

(NOT (OR (= (MOD 6 2) 0) (= (MOD 6 3) 0)))
-> NIL

这是怎么回事?

最佳答案

你应该为此使用一个函数。宏用于生成代码。这里的问题是 *PRIMES*LET 绑定(bind)发生在运行时,而不是在宏展开期间。

作为函数的代码看起来像这样。

(defparameter *primes* (list))

(defun primep (num)
(not (loop for p in *primes* thereis (zerop (mod num p)))))

(let ((*primes* (list 2 3)))
(primep 6))
;=> NIL

(let ((*primes* (list 2 3)))
(primep 7))
;=> T

关于macros - Common Lisp (SBCL) 中的素数宏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38028002/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com