一致が見つからない場合に引数を返すことを除いて、match-rewriter
基本的には関数を作成しました。match-lambda
(define-syntax match-rewriter
(syntax-rules ()
((_ (patt body) ...)
(λ (x) (match x (patt body) ... (_ x))))))
match-rewriter
ここで、ソース コードを表す文字列を取得let*
し、ネストされた unary として書き直すために使用したいと思います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 (+ ab))) (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
テキストとして出力するだけでなく、 への呼び出しが実行されると便利です。