以下是我的宏定义:

*(defmacro run-test (test)
   `(format t "Run test ~a ... ~a" ',test ,test))
*(run-test (= 1 1))
Run test (= 1 1) ... T
NIL

现在一切正常,所以我定义了第二个宏(运行多个测试):
*(defmacro run-tests (&body body)
   `(loop for tc in ',body
      do (run-test tc)))
* (run-tests (= 2 (1+ 1)) (= 1 1))
Run test TC ... (= 2 (1+ 1) Run test TC ... (= 1 1)

这个结果不是我想要的,我想要用sexp替换tc的每个值,并在运行测试中对该值进行评估我试着换线
          do (run-test tc)


          do (run-test ,tc)

但这意味着一个错误
未定义变量:TC
我怎样才能改变这个来得到正确的结果?

最佳答案

看看扩展,例如(run-tests (= 1 1))

(loop for tc in '((= 1 1)) do (run-test tc))

如您所见,代码尝试调用(run-test tc)但是run-test操作窗体;当传递包含窗体的变量时,它将不起作用。
如果将代码更改为(run-test ,tc),则试图在宏扩展期间引用tc变量,但它仅在运行时绑定。
一种解决方案是在宏扩展时执行更多操作:
(defmacro run-tests (&body body)
  `(progn ,@(loop for tc in body collect `(run-test ,tc))))

关于macros - 在宏中取消引用时 undefined variable ,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/19373134/

10-12 12:53