在Common Lisp中,如何定义一个扩展为空的宏(而不是`nil`)?

时间:2013-09-10 14:32:25

标签: macros common-lisp

我想定义一个可以对s表达式进行注释的宏,例如:

我希望

(list 1 2 (comment-macro (something))) -> (1 2)

但是,如果我像这样定义宏

(defmacro comment-macro (x))

上述表格的结果实际上是

(1 2 nil)

3 个答案:

答案 0 :(得分:8)

使用常规宏无法实现您想要的效果,因为它的主要值(如果没有返回值,则为nil)将始终使用。

但是,有两种常见的选择:

  1. 评论:#| ... |# - 一般文字

  2. 功能表达式:#+(or) ...#-(and) ... - 用于(暂时?)禁用代码

  3. 您还可以使用read macrosset-macro-character定义自己的set-dispatch-macro-character

答案 1 :(得分:3)

在Common Lisp中,没有办法定义一个扩展为空的宏。始终插入从宏返回的primary value(即macro function)代替宏调用。

答案 2 :(得分:0)

简短的答案是你不能,但是仍然有很多其他方法可以解决它。

首先,我想到在宏的最后一句中使用(值),但是在SBCL中不起作用-似乎与nil等于(值)。

更简单的思维方式是使用删除:

(remove nil '(1 2 (comment-macro (x)))))

但它可能随时无法工作。

最好的方法是使用条件:

(aif (comment-macro (x)) (list 1 2 it) (list 1 2))

对于我所遇到的条件,我只是将“我必须让它什么也不会返回”的说法变成“在适当的条件下,我构建适当的代码”。我希望能行得通。