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

Sal*_*Egg 5 macros common-lisp

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

我希望

(list 1 2 (comment-macro (something))) -> (1 2)
Run Code Online (Sandbox Code Playgroud)

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

(defmacro comment-macro (x))
Run Code Online (Sandbox Code Playgroud)

实际上,上述形式的结果

(1 2 nil)
Run Code Online (Sandbox Code Playgroud)

sds*_*sds 8

使用常规宏无法实现所需的功能,因为nil将始终使用其主值(或者如果未返回任何值).

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

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

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

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

  • @SaltyEgg你可能会看一下[On Lisp Chapter 17. Read Macros](http://dunsmor.com/lisp/onlisp/onlisp_21.html).另请参阅HyperSpec中的[2.1.4.4宏字符](http://www.lispworks.com/documentation/HyperSpec/Body/02_add.htm),其中说"该函数要么返回已解析的对象,要么返回没有值表示该函数扫描的字符被忽略(例如,在评论的情况下)." 如果要表示注释,请使用[`(values)`]返回零值(http://www.lispworks.com/documentation/lw51/CLHS/Body/f_values.htm). (3认同)