Macros 我可以创建一个扩展为多个值的宏吗?

Macros 我可以创建一个扩展为多个值的宏吗?,macros,scheme,racket,Macros,Scheme,Racket,有没有办法定义球拍宏foo,以便 (list 1 (foo 2 3) 4) 扩展到 (list 1 2 3 4) ?这目前是不可能的(而且似乎不太可能在不久的将来改变)。 这里有一个。具体见Matthew Flatt的答案: 允许在函数调用中拼接结果 子表达式将破坏当前被 宏和编译器 正如其他答案所提到的,不能将宏扩展为多个值,并将其拼接到调用上下文中。但是你可以用准旋转做类似的事情 假设宏已调整为返回列表,则可以执行此操作(对于给定示例): 示例(在球拍中测试): 如果将来的读者在寻找公共

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

(list 1 (foo 2 3) 4)
扩展到

(list 1 2 3 4)

这目前是不可能的(而且似乎不太可能在不久的将来改变)。 这里有一个。具体见Matthew Flatt的答案:

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


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

假设宏已调整为返回列表,则可以执行此操作(对于给定示例):

示例(在球拍中测试):


如果将来的读者在寻找公共Lisp答案时发现了这一点,请参阅(公共Lisp中的答案也是“否”)。
`(1 ,@(foo 2 3) 4)
> `(1 ,@(map sqrt '(2 3)) 4)
'(1 1.4142135623730951 1.7320508075688772 4)