Macros 使用hygenic宏展平语法树
是否可以编写一个R5RS宏来“展平”任意深度的语法树?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语法可用,则应该很容易定义 这里对我来说最具挑战性的部分是语法规则-唯一的限制,但是如果您有语法案例解决方案,请也发布它 我在这个问题上的进展在这一点上停滞不前: (定义语法展平语法帮助
例如:
(扁平语法(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)))