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