感谢common lisp: how can a macro define other methods/macros with programmatically generated names?上的先前答案我有一个定义辅助函数的宏(实际上我有一个宏,我最喜欢的lisp-newbie-hammer)。但是在这个宏中,有一些东西可以决定辅助函数是否需要接受特定的参数。所以我有一个带有几乎相同分支的if语句 - 在一个分支中,我将var放在生成函数的lambda列表中。在另一个分支中,我省略了var。 (我正在为非程序员编写DSL,所以我不希望他们看到像& optional这样的东西)
有没有办法避免在这里有基本重复的代码?如果我将var设置为“”,那么“”会出现在我生成的defuns的lambda列表中。如果我将var设置为nil,则会出现NIL。
是否有一个我可以使用的值,var完全没有任何评价,眨眼不存在? (哲学上的兴趣,不应该有吗?)
答案 0 :(得分:5)
一种选择是使用,@var
,如果应该使用,则将您的值设为列表,如果不应该使用nil
。例如:
(let ((used `((frob 1 2 3)))
(unused nil))
`(progn ,@unused ,@used))
=> (PROGN (FROB 1 2 3))
unused
值已消失。