逗号不在反引号内

Comma not inside a backquote

我一直在关注 http://www.gigamonkeys.com/book/。 在 http://www.gigamonkeys.com/book/practical-building-a-unit-test-framework.html 一章中有一个名为 check 的宏,其定义如下。

(defmacro check (form)
  `(report-result ,form ',form))

根据我对宏的理解,我认为上面的代码等同于下面的代码

(defmacro check (form)
  `(report-result ,form form))

但它抛出 Comma not inside a backquote.

如果您想象 form 被计算为符号 test,那么这是真的:

`(report-result ,form ',form))
==> (report-result test 'test)

所以 ' 留在扩展中,以便在评估中引用替换的形式。但是您的 "equivalent" 这样做:

`(report-result ,form form)
==> (report-result test form)

在这里您看到 form 从未被替换,所以现在您需要有一个名为 form 的变量,否则您会收到错误消息。