0

一致が見つからない場合に引数を返すことを除いて、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テキストとして出力するだけでなく、 への呼び出しが実行されると便利です。

4

2 に答える 2

2

はい、できます。あまり難しくないはずです。具体的には、ここで必要な重要なアイデアは、リスト全体を一度に処理しようとしないことです。代わりに、パターンは最初のバインディングを残りから分離し、let*->nested-unary-lets への再帰呼び出しを 1 つの let でラップする必要があります。

これを作成するのに問題がある場合はお知らせください。

于 2011-02-25T01:44:15.443 に答える