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



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

(list 1 (foo 2 3) 4)

扩展到

(list 1 2 3 4)

目前这是不可能的(而且似乎在不久的将来不太可能改变)。这是一个讨论这个问题的线程。特别参见马修·弗拉特(Matthew Flatt)的回答:

允许在函数调用中拼接结果 子表达式将破坏当前被 宏和编译器。

正如其他答案所提到的,您不能将宏扩展到多个值,并将其拼接到调用上下文中。但是你可以使用准报价做类似的事情。

假设您的宏适合返回列表,您可以这样做(对于给定的示例):

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

示例(在球拍中测试):

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

最新更新