有没有办法定义一个球拍宏foo
,这样
(list 1 (foo 2 3) 4)
扩展到
(list 1 2 3 4)
?
目前这是不可能的(而且在不久的将来似乎不太可能改变)。这是讨论这个的一个线程。特别参见 Matthew Flatt 的回答:
允许在函数调用子表达式中拼接结果会破坏当前被宏和编译器利用的等价性。
正如其他答案所提到的,您不能将宏扩展为多个值,并将其拼接到调用上下文中。但是你可以使用 quasiquotation 来做类似的事情。
假设您的宏适用于返回列表,您可以这样做(对于您给定的示例):
`(1 ,@(foo 2 3) 4)
示例(在 Racket 中测试):
> `(1 ,@(map sqrt '(2 3)) 4)
'(1 1.4142135623730951 1.7320508075688772 4)