Scheme重写让*作为嵌套的一元允许

我写了一个函数
match-rewriter
,基本上是
match-lambda
,但如果没有找到匹配则返回它的参数:
(define-syntax match-rewriter
  (syntax-rules ()
    ((_ (patt body) ...)
      (λ (x) (match x (patt body) ... (_ x))))))
现在我想用
match-rewriter
取代表
let*
源代码的字符串,并将其重写为嵌套的一元
lets
(define let*→nested-unary-lets
  (match-rewriter (`(let*((,<var> ,<val>) ...) ,<expr1> ,<expr2> ...)
我真的很难过如何模式匹配这个。我需要回复:
`(let((,<var1> ,<val1>)) let((,<var2> ,<val2>)) let((...)) ... )...) ,<expr1> . ,@<expr2>)
但是筑巢让我很难过。任何建议表示赞赏。 好的,这是我最好的尝试:
(define let*→nested-unary-lets
  (match-rewriter
   (`(let* (()) ,<expr1> ,<expr2> ...)
   (`(let () ,<expr1> . ,<expr2>)))
   (`(let* ((,<var1> ,<val1>) (,<var2> ,<val2>) ...) ,<expr1> ,<expr2> ...)
    `(let ((,<var1> ,<val1>) (let*→nested-unary-lets 
                               '(let* ((,<var2> ,<val2>) ...) ,<expr1> . ,<expr2>)))))
   ))
但这就是它的表现:   (让*→nested-unary-lets'(让*((a 1)(b(+ a 1))(c(+ a b)))(displayln c)))   '(让((1)          (让*→巢式一元,让           '(let *(((b c)((+ a 1)(+ a b)))                   ...)              (displayln c))))) 我对参数的顺序感到困惑:
(let* (((b c) ((+ a 1) (+ a b)))
在我看来它应该是:
(let* ((b (+ a 1)) (c (+ a b)))
此外,如果调用
let*→nested-unary-lets
执行而不是仅仅作为文本打印,那将会很好。     
已邀请:
是的,你可以这样做;它应该不会太难。具体来说,您需要的关键想法是不要尝试一次处理整个列表。相反,你的模式应该将第一个绑定与其余绑定分开,然后将一个绕过递归调用包围让* - > nested-unary-lets。 如果您在制定此问题时遇到问题,请与我们联系。     
以下是类似
syntax-rules
的伪代码中的
let*
的定义,您可以使用它来编写自己的版本:
(let* ((a b) (c d) ...) body ...) === (let ((a b)) (let* ((c d) ...) body ...))
(let* () body ...) === body
您应该可以使用
match
将其转换为函数,或使用
syntax-rules
将其转换为宏。     

要回复问题请先登录注册