Macros 使用hygenic宏展平语法树

Macros 使用hygenic宏展平语法树,macros,syntax-error,scheme,racket,metaprogramming,Macros,Syntax Error,Scheme,Racket,Metaprogramming,是否可以编写一个R5RS宏来“展平”任意深度的语法树? 例如: (扁平语法(a(b(cd))e))=>(a(b(cd))e) 我的最终目标是有另一个宏可以这样工作: (声明树(a(b(cd))e)) => (开始(定义a#f)(定义b#f)(定义c#f)(定义d#f)(定义e#f)) 但是如果flatten语法可用,则应该很容易定义 这里对我来说最具挑战性的部分是语法规则-唯一的限制,但是如果您有语法案例解决方案,请也发布它 我在这个问题上的进展在这一点上停滞不前: (定义语法展平语法帮助

是否可以编写一个R5RS宏来“展平”任意深度的语法树?
例如:

(扁平语法(a(b(cd))e))=>(a(b(cd))e)
我的最终目标是有另一个宏可以这样工作:

(声明树(a(b(cd))e))
=> 
(开始(定义a#f)(定义b#f)(定义c#f)(定义d#f)(定义e#f))
但是如果
flatten语法可用,则应该很容易定义

这里对我来说最具挑战性的部分是
语法规则
-唯一的限制,但是如果您有
语法案例
解决方案,请也发布它

我在这个问题上的进展在这一点上停滞不前:

(定义语法展平语法帮助器
(语法规则()
((buf(x.xs))
(展平语法助手)
(展平语法助手buf x)xs)
((buf())
buf)
((buf x)
(十、buf)
(定义语法规则(我的展平语法T)
(展平语法帮助器()T))

guile
,expand(我的展平语法(a(b(c d))e))
导致语法错误“无法匹配我的展平语法中的任何模式”。

以下是我的快速尝试:

#lang racket

(define-syntax reverse-macro
  (syntax-rules ()
    [(_ () (result ...)) '(result ...)]
    [(_ (x xs ...) (result ...)) (reverse-macro (xs ...) (x result ...))]))

(define-syntax flatten-syntax-aux
  (syntax-rules ()
    [(_ ((xs ...) ys ...) (result ...))
     (flatten-syntax-aux (xs ... ys ...) (result ...))]
    [(_ (x xs ...) (result ...))
     (flatten-syntax-aux (xs ...) (x result ...))]
    [(_ () (result ...))
     (reverse-macro (result ...) ())]))

(define-syntax-rule (flatten-syntax xs)
  (flatten-syntax-aux xs ()))

(flatten-syntax (a (b (c d)) e)) ;=> '(a b c d e)
实际上,您可以通过稍微调整
flant syntax
来创建
declare tree
,但直接定义
declare tree
实际上要容易得多,这可能会让您感到惊讶:

#lang racket

(define-syntax declare-tree
  (syntax-rules ()
    [(_ ((xs ...) ys ...))
     (begin (declare-tree (xs ...))
            (declare-tree (ys ...)))]
    [(_ (x xs ...))
     (begin (define x #f)
            (declare-tree (xs ...)))]
    [(_ ())
     (begin)]))

(declare-tree (a (b (c d)) e))
(list a b c d e) ;=> '(#f #f #f #f #f)
这是因为
declare tree
实际上不需要展平结构。它可以生成嵌套的
开始
,如:

(begin
  (begin (define a #f)
         (define b #f))
  (begin (define c #f)
         (define d #f)))