我编写了一个函数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>)))))
))
但这就是它的行为方式:
(let*→nested-unary-lets '(let* ((a 1) (b (+ a 1)) (c (+ a 1))) (displayln c))) '(let ((a 1) (let *→nested-unary-lets '(let* (((bc) ((+ a 1) (+ ab))) ...) (displayln c)))))
我对以下参数的顺序感到困惑:
(let* (((b c) ((+ a 1) (+ a b)))
在我看来应该是:
(let* ((b (+ a 1)) (c (+ a b)))
let*→nested-unary-lets
此外,如果执行调用而不是仅打印为文本,那就太好了。