有没有办法定义球拍宏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)