我可以创建一个扩展为多个值的宏吗?
答
正如其他答案所提到的,你不能让一个宏展开为多个值,并将它们拼接到调用上下文中。但是,你可以使用quasiquotation做类似的事情。
假设你的宏适于返回一个列表,而不是,你可以做到这一点(您给出的例子):
`(1 ,@(foo 2 3) 4)
例(在球拍测试):
> `(1 ,@(map sqrt '(2 3)) 4)
'(1 1.4142135623730951 1.7320508075688772 4)
答
目前不可能(而且在不久的将来似乎不太可能改变)。 这是一个thread discussing this。具体见答案由马修·弗拉特:
允许函数调用 子表达式结果的拼接将打破目前由 宏和编译器利用等价。
如果未来读者在寻找Common Lisp答案时发现了这个问题,请参阅[是否可以将宏扩展为多个元素?](http://*.com/q/18886612/1281433)(Common Lisp中的答案为“否”也是)。 –