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
执行而不是仅仅作为文本打印,那将会很好。
没有找到相关结果
已邀请:
2 个回复
瞥同忙接
缮记箔
的伪代码中的
的定义,您可以使用它来编写自己的版本:
您应该可以使用
将其转换为函数,或使用
将其转换为宏。