下面是我编写的一个宏,用于测试一个数字的原始性:
(defmacro primep (num)
`(not (or ,@(loop for p in *primes* collecting `(= (mod ,num ,p) 0)))))*primes*是一个动态变量,它包含迄今生成的素数列表(上下文是“下一个素数生成器”函数)。以下是几个早期编辑语句的结果:
(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怎么一回事?
发布于 2016-06-25 11:45:02
您应该为此使用一个函数。宏用于生成代码。这里的问题是,用于*PRIMES*的*PRIMES*绑定是在运行时进行的,而不是在宏扩展过程中发生的。
您的代码作为一个函数应该是这样的。
(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))
;=> Thttps://stackoverflow.com/questions/38028002
复制相似问题