我想要一个可以扩展为my-macro
而不是1 2 3
的宏(1 2 3)
,以便
(list (my-macro) 4 5) -> (1 2 3 4 5)
这可能吗?
答案 0 :(得分:6)
不,宏不能扩展为多个值。当您需要宏来扩展到多个代码片段时,典型的做法是将返回值包装在progn
中。
在你的评论示例中,看起来好像你使用的宏不是语法抽象,而是作为廉价和开朗的函数优化,通常的反应是“请不要这样做,这是错的并且实际上并没有做你想做的事。“
答案 1 :(得分:4)
没有
在Common Lisp中,宏和读取宏都不能做到这一点。
唯一的解决方案是,如果你真的需要这个,就是自己写一个完整的阅读器,你完全不使用read
(问题是read
将递归调用自己,而不是你的版本)。
完全兼容的阅读器是一件非常复杂的事情,但如果您只需要一部分功能而不需要使用它来阅读其他人编写的Common Lisp代码,那么它可以很简单。 / p>