Macros 球拍宏-配对

Macros 球拍宏-配对,macros,scheme,racket,define-syntax,Macros,Scheme,Racket,Define Syntax,我刚刚开始深入研究球拍宏,并试图制作一个简洁的宏定义宏。我想展开这样一个表达式: (macro id (param) replacement1 (params ...) replacement2) (define-syntax id (syntax-rules () ((id param) replacement1) ((id params ...) replacement2))) 变成这样: (macro id (param)

我刚刚开始深入研究球拍宏,并试图制作一个简洁的宏定义宏。我想展开这样一个表达式:

(macro id
    (param) replacement1
    (params ...) replacement2)
(define-syntax id
    (syntax-rules ()
        ((id param) replacement1)
        ((id params ...) replacement2)))
变成这样:

(macro id
    (param) replacement1
    (params ...) replacement2)
(define-syntax id
    (syntax-rules ()
        ((id param) replacement1)
        ((id params ...) replacement2)))
因此,原始表达式的cddr被转换成成对的表达式(用于语法规则体),并且id被插入到每对表达式的car中

当我只使用语法规则提供的模式匹配时,我很难进行递归思考(我一直希望像处理普通列表一样操作表达式)。我应该使用什么样的图案?或者,我是否可以将其作为普通列表进行操作,然后取消引用结果以在展开中使用

非常感谢

编辑-暂定解决方案,由Taymon的答案通知

我好奇的一部分是关于去掉那些成对的括号。我研究了语法情况,但有点困惑,所以尝试纯粹使用模式匹配子语言。最后,我将Taymon的宏与另一个宏结合使用,对给定的模板进行“配对”(其行为有点像累加器函数):


可以构建一个宏扩展器,将语法表达式作为常规Racket数据进行操作。然而,在这种情况下,这并不是真正必要的

我建议您稍微修改一下语法,这样每个模式替换对都用括号括起来。像这样:

(macro id
  [(param) replacement1]
  [(params ...) replacement2])
完成后,您可以使用常规模式匹配宏。以下是我对它的看法:

(define-syntax-rule (macro id [(param ...) replacement] ...)
  (define-syntax id
    (syntax-rules ()
      [(id param ...) replacement] ...)))

Taymon是对的,但也可以使用省略号来完成,而无需使用括号中的模式替换对,使用
语法/parse
中的
~seq

(require syntax/parse/define)
(define-simple-macro (macro id (~seq (param ...) replacement) ...)
  (define-syntax id
    (syntax-rules ()
      [(id param ...) replacement] ...)))
可以像您最初想要的那样使用:

(macro id
  (param) replacement1
  (params ...) replacement2)

谢谢在看到您的示例之前,我并不完全了解省略号是如何在模式中工作的,并且在一个试探性的解决方案中使用了您的规则。