我想定义一个可以注释 s 表达式的宏,例如:
我希望
(list 1 2 (comment-macro (something))) -> (1 2)
但是如果我这样定义宏
(defmacro comment-macro (x))
上面表格的结果其实是
(1 2 nil)
我想定义一个可以注释 s 表达式的宏,例如:
我希望
(list 1 2 (comment-macro (something))) -> (1 2)
但是如果我这样定义宏
(defmacro comment-macro (x))
上面表格的结果其实是
(1 2 nil)
您无法使用常规宏完成您想要的操作,因为它的主值(或者nil
如果没有返回值)将始终被使用。
但是,有两种常见的选择:
评论:#| ... |#
- 用于一般文本
特征表达式:#+(or) ...
或#-(and) ...
- 用于(暂时?)禁用代码
您还可以使用和定义自己的读取宏。set-macro-character
set-dispatch-macro-character
简短的回答是你不能,但仍有许多其他方法可以解决它。
首先我考虑在宏的最后一句中使用(值),但在 SBCL 中不起作用——它似乎等于(值)与 nil。
更简单的思考方式是使用 remove:
(remove nil '(1 2 (comment-macro (x)))))
但它可能无法随时工作。
最好的方法是使用条件:
(aif (comment-macro (x))
(list 1 2 it)
(list 1 2))
对于我遇到的条件,我只是将“我必须让它什么都不返回”的情况变成“在适当的条件下我构造了适当的代码”。我希望这有效。