我想定义一个可以对s表达式进行注释的宏,例如:
我希望
(list 1 2 (comment-macro (something))) -> (1 2)
但是,如果我像这样定义宏
(defmacro comment-macro (x))
上述表格的结果实际上是
(1 2 nil)
答案 0 :(得分:8)
使用常规宏无法实现您想要的效果,因为它的主要值(如果没有返回值,则为nil
)将始终使用。
但是,有两种常见的选择:
评论:#| ... |#
- 一般文字
功能表达式:#+(or) ...
或#-(and) ...
- 用于(暂时?)禁用代码
您还可以使用read macros和set-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))
对于我所遇到的条件,我只是将“我必须让它什么也不会返回”的说法变成“在适当的条件下,我构建适当的代码”。我希望能行得通。