我可以制作一个扩展为多个值的宏吗?

时间:2013-10-05 06:47:41

标签: macros scheme racket

有没有办法定义球拍宏foo以便

(list 1 (foo 2 3) 4)

扩展为

(list 1 2 3 4)

2 个答案:

答案 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)