1

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

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

这可能吗?

4

2 回答 2

6

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

在评论中的示例中,看起来好像您不是将宏用作句法抽象,而是用作廉价而愉快的功能优化,对此的通常反应是“请不要这样做,这是错误的,并且没有” t 实际上做你想做的事”。

于 2013-09-19T10:24:59.420 回答
4

不。

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

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

一个完全兼容的阅读器是一件相当复杂的事情,但如果您只需要功能的一个子集并且不需要使用它来阅读其他人编写的 Common Lisp 代码,那么它可能很简单。

于 2013-09-19T10:32:49.813 回答