【问题标题】:inside a macro, can I have ,var evaluate to blank/nothing?在宏中,我可以让 ,var 评估为空白/无吗?
【发布时间】:2011-05-12 16:05:27
【问题描述】:

感谢common lisp: how can a macro define other methods/macros with programmatically generated names? 上的先前答案,我有一个定义辅助函数的宏(实际上我有一个宏,我最喜欢的 lisp-newbie-hammer)。但是在这个宏里面,有一些东西决定了辅助函数是否需要接受一个特定的参数。所以我有一个具有几乎相同分支的 if 语句——在一个分支下,我将 ,var 放在生成函数的 lambda 列表中。在另一个分支下,我省略了 ,var。 (我正在为非程序员编写 DSL,所以我不希望他们看到 &optional 之类的东西)

有没有办法避免在这里出现基本上重复的代码?如果我将 var 设置为“”,那么“”会出现在我生成的 defun 的 lambda 列表中。如果我将 var 设置为 nil,则会出现 NIL。

是否有一个我可以使用的值,使得 ,var 评估为完全没有,眨眼不存在? (出于哲学兴趣,不应该有一个吗?)

【问题讨论】:

    标签: macros common-lisp argument-passing


    【解决方案1】:

    一种选择是使用,@var,如果应该使用,则将值设置为列表,如果不使用,则使用nil。例如:

    (let ((used `((frob 1 2 3)))
          (unused nil))
      `(progn ,@unused ,@used))
    => (PROGN (FROB 1 2 3))
    

    unused 值已消失。

    【讨论】:

    • 谢谢!代码 4:1 减少,现在逻辑都在一个地方(我实际上有多个分支)
    猜你喜欢
    • 2018-03-05
    • 1970-01-01
    • 2014-09-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多