这是我编写的用于测试素数的宏:
(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
发生了什么事?
答案 0 :(得分:4)
你应该使用一个函数。宏用于生成代码。这里的问题是LET
的{{1}}绑定在运行时发生,而不是在宏扩展期间发生。
作为函数的代码看起来像这样。
*PRIMES*