2

パターン マッチング関数を既存のスキーム メタ循環エバリュエーターに追加しようとしています(これは宿題です)。指示の文言に少し迷っています。この点でより熟練した誰かが私がこれを解釈するのを手伝ってくれることを望んでいました.

match の構文は次のようになります。(match a ((p1 v1) (p2 v2) (p3 v3)))

そして、次のように長さを見つけるために使用できます。

(define length (lambda (x)
   (match x (('() 0)
             (('cons a b) (+ 1 (length b))))))

関数内のパターン言語には、数値定数、引用符で囲まれた定数、変数、およびコンスが含まれている必要があります。一致が見つからずにパターンが使い尽くされた場合は、エラーがスローされます。

パターン マッチングの概念は理解できたと思いますが、この方法で関数に実装すると、少し気が遠くなります。この関数が何をすべきかをよりよく理解できるように、上記の構文が何をしているのか (具体的には、上記の長さで match がどのように使用されているのか) を説明してくれる人はいますか?

4

2 に答える 2

1
(match x (('() 0)
          (('cons a b) (+ 1 (length b)))))

このコードを拡張する必要があるものを検討することが最も役立つ場合があります。パターンごとに、一致させようとしているオブジェクトが一致するかどうかを判断するためのテストが必要であり、変数をそのサブパーツにバインドする方法を理解するためのコードが必要です。この場合、大まかに次のような展開が必要になります。

(if (equal? '() x)
    0
    (if (pair? x)
        (let ((a (car x))
              (b (cdr x)))
          (+ 1 (length b)))
        ;; indicate failure to match
        'NO-MATCH))

もちろん、 condでそれを書くこともできますが、これを手続き的に拡張する必要がある場合は、ネストされたifフォームを使用する方が簡単かもしれません。

これを実際に関数として実装している (マクロ (つまり、ソース変換) としてではなく) 場合は、環境などを操作する方法を正確に指定する必要があります。

于 2015-02-25T21:59:18.467 に答える
1

The Implementation of Functional Languagesの第 4 章、Structured Types and the Semantics of Pattern Matchingを読むことをお勧めします。この章は、Simon L. Peyton Jones と Philip Wadler によって書かれました。

于 2015-02-25T19:49:42.780 に答える