Recursion 递归处理列表参数的Racket宏

Recursion 递归处理列表参数的Racket宏,recursion,macros,scheme,racket,Recursion,Macros,Scheme,Racket,我试图编写一个宏,递归地将列表中的值“展开”为单个值。例如,unwrap'(1 2 3))将(单独)产生: (car'(1233));1. (car(cdr)(1 2 3));2 (car)(cdr(1,2,3); 这将像(+(unwrap'(1 2 3)))==>(+1 2 3)(我知道你可以使用标准库来申请,但我正在尝试编写自己的版本) 我的问题是,在编写宏时,我不知道如何递归处理传递到“展开”宏中的列表参数。以下是我尝试过的: (定义语法(展开stx) (语法大小写stx() [(uls

我试图编写一个宏,递归地将列表中的值“展开”为单个值。例如,
unwrap'(1 2 3))
将(单独)产生:

(car'(1233));1.
(car(cdr)(1 2 3));2
(car)(cdr(1,2,3);
这将像
(+(unwrap'(1 2 3)))
==>
(+1 2 3)
(我知道你可以使用标准库来申请,但我正在尝试编写自己的版本)

我的问题是,在编写宏时,我不知道如何递归处理传递到“展开”宏中的列表参数。以下是我尝试过的:

(定义语法(展开stx)
(语法大小写stx()
[(ulst)
#`(begin(car lst);由于(car’())无效,最后一步出错
(展开(cdr lst)))]

(定义语法(展开stx)
(语法大小写stx()
[(ulst)
#`(如果(空?lst)
'()
(car(展开(cdr lst)));无限循环
这两种方法显然都是错误的,但本质上我不知道如何编写一个宏来检查输入列表的值(或与空列表模式相匹配),并在这两种情况下返回不同的结果。也有可能我完全错误地处理了这一问题,因此非常感谢您的帮助。谢谢!

您想要什么

(+ (unwrap '(1 2 3))) ==> (+ 1 2 3)
但这是不可能的。您要求
unwrap
将宏扩展为三种不相连的形式,这是不允许的。任何宏都必须扩展为一种形式。因此,正如您在问题中所说的,例如您给出的示例,
apply
是正确的答案


对于其他可能的用法,答案是备份一个步骤,并询问您为什么认为此
展开
功能会有用:您希望在哪些情况下使用它?然后设计一个不同的解决方案,在语言的限制范围内工作。

我明白了。我感觉不可能以这种方式展开,但我不知道enoug关于宏来证实我的怀疑。谢谢。