Macros 在CommonLisp中,如何定义一个扩展为零(而不是“nil”)的宏?

Macros 在CommonLisp中,如何定义一个扩展为零(而不是“nil”)的宏?,macros,common-lisp,Macros,Common Lisp,我想定义一个可以注释s表达式的宏,例如: 我希望 (list 1 2 (comment-macro (something))) -> (1 2) 但是如果我这样定义宏 (defmacro comment-macro (x)) 上述形式的结果实际上是 (1 2 nil) 使用常规宏无法完成所需的操作,因为它的主值(如果没有返回值,则为nil)将始终使用 但是,有两种常见的选择: 评论:-一般文本 功能表达式:或-用于(暂时?)禁用代码 您还可以使用和定义自己的宏。在Common Lis

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

我希望

(list 1 2 (comment-macro (something))) -> (1 2)
但是如果我这样定义宏

(defmacro comment-macro (x))
上述形式的结果实际上是

(1 2 nil)

使用常规宏无法完成所需的操作,因为它的主值(如果没有返回值,则为
nil
)将始终使用

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

  • 评论:-一般文本

  • 功能表达式:或-用于(暂时?)禁用代码


  • 您还可以使用和定义自己的宏。

    在Common Lisp中,无法定义扩展为零的宏。从宏(即)返回的总是插入到宏调用的位置。

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

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

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

    (删除nil'(12(注释宏(x)俬俬))

    但它可能在任何时候都不起作用

    最好的方法是使用以下条件:

    (aif(注释宏(x))
    (列表1和列表2)
    (列表12))


    对于我遇到的条件,我只是将“我必须让它不返回任何东西”的情况改为“有适当的条件,我构造适当的代码”。我希望这能起作用。

    #|
    实际上也是读卡器宏,它们也是更好的选择,因为条件读取器宏是用于功能的。我真的很想要一个读取宏。我认为如果我能快速打开/关闭s表达式会很方便。但我只是不知道如何将它们展开为零。读取宏还是常规宏?读宏由读取器扩展,常规宏由编译器/解释器扩展。但如何定义自己的读宏?我知道如何定义分派宏,但它不起作用(总是返回
    nil
    )@SaltyEgg,您可以看看。此外,请参见HyperSpec中的说明,“函数要么返回已解析的对象,要么不返回任何值以指示函数扫描的字符被忽略(例如,在注释的情况下)。”如果要指示注释,返回零值。@AdamBurry这个问题更多的是关于编辑器对多行注释的支持,尽管关于
    #=(and)
    #+(or)
    是相关的(并且包括它们)。这在技术上是正确的,但是@SaltyEgg在其他注释中阐明了需要读取宏,并且这些宏可以类似于注释(例如,
    | |…|#
    宏)。对;我的答案适用于问题的最初陈述。同意。我只是为任何遇到后者的读者强调区别,特别是在问题被编辑以更好地符合OP的愿望的情况下。