我可以创建一个扩展为多个值的宏吗?

问题描述:

有没有办法来定义一个宏球拍foo使我可以创建一个扩展为多个值的宏吗?

(list 1 (foo 2 3) 4) 

扩展到

(list 1 2 3 4) 

+2

如果未来读者在寻找Common Lisp答案时发现了这个问题,请参阅[是否可以将宏扩展为多个元素?](http://*.com/q/18886612/1281433)(Common Lisp中的答案为“否”也是)。 –

正如其他答案所提到的,你不能让一个宏展开为多个值,并将它们拼接到调用上下文中。但是,你可以使用quasiquotation做类似的事情。

假设你的宏适于返回一个列表,而不是,你可以做到这一点(您给出的例子):

`(1 ,@(foo 2 3) 4) 

例(在球拍测试):

> `(1 ,@(map sqrt '(2 3)) 4) 
'(1 1.4142135623730951 1.7320508075688772 4) 

目前不可能(而且在不久的将来似乎不太可能改变)。 这是一个thread discussing this。具体见答案由马修·弗拉特:

允许函数调用 子表达式结果的拼接将打破目前由 宏和编译器利用等价。