是否可以将宏扩展为几个元素?

时间:2013-09-19 05:11:02

标签: macros common-lisp

我想要一个可以扩展为my-macro而不是1 2 3的宏(1 2 3),以便

(list (my-macro) 4 5) -> (1 2 3 4 5)

这可能吗?

2 个答案:

答案 0 :(得分:6)

不,宏不能扩展为多个值。当您需要宏来扩展到多个代码片段时,典型的做法是将返回值包装在progn中。

在你的评论示例中,看起来好像你使用的宏不是语法抽象,而是作为廉价和开朗的函数优化,通常的反应是“请不要这样做,这是错的并且实际上并没有做你想做的事。“

答案 1 :(得分:4)

没有

在Common Lisp中,宏和读取宏都不能做到这一点。

唯一的解决方案是,如果你真的需要这个,就是自己写一个完整的阅读器,你完全不使用read(问题是read将递归调用自己,而不是你的版本)。

完全兼容的阅读器是一件非常复杂的事情,但如果您只需要一部分功能而不需要使用它来阅读其他人编写的Common Lisp代码,那么它可以很简单。 / p>