5

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

我希望

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

但是如果我这样定义宏

(defmacro comment-macro (x))

上面表格的结果其实是

(1 2 nil)
4

3 回答 3

8

您无法使用常规宏完成您想要的操作,因为它的主值(或者nil如果没有返回值)将始终被使用。

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

  1. 评论:#| ... |#- 用于一般文本

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

您还可以使用和定义自己的读取宏set-macro-characterset-dispatch-macro-character

于 2013-09-10T14:52:06.527 回答
3

在 Common Lisp 中,没有办法定义一个扩展为空的宏。从宏(即宏函数)返回的主要值总是插入到宏调用的位置。

于 2013-09-10T15:06:04.303 回答
0

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

首先我考虑在宏的最后一句中使用(值),但在 SBCL 中不起作用——它似乎等于(值)与 nil。

更简单的思考方式是使用 remove:

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

但它可能无法随时工作。

最好的方法是使用条件:

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

对于我遇到的条件,我只是将“我必须让它什么都不返回”的情况变成“在适当的条件下我构造了适当的代码”。我希望这有效。

于 2018-09-21T06:48:53.037 回答