Common Lisp中的原始宏​​(SBCL)

时间:2016-06-25 11:29:47

标签: macros lisp common-lisp sbcl

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

(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

发生了什么事?

1 个答案:

答案 0 :(得分:4)

你应该使用一个函数。宏用于生成代码。这里的问题是LET的{​​{1}}绑定在运行时发生,而不是在宏扩展期间发生。

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

*PRIMES*