15

ライブラリで clojure プロトコルを見ると、プロトコル メソッドが関数にラップされていることが多く、機能がほとんど追加されていないことがよくあります。例えば:

(defprotocol Pfoo
    (foo-method [this]))

(deftype Atype [x y]
    Pfoo
    (foo-method [this] (do-something)))

(defn foo [arg] (foo-method arg))

また、クライアントは通常、プロトコルの foo メソッドではなく、関数 foo を呼び出すことが期待されます。(この種の具体的な例については、 clojurescript コアの上部にあるプロトコルを参照してください。

では、プロトコルが関数の背後に隠されることが多いのはなぜでしょうか? プロトコル メソッドは、ラッピング機能ではなく、クライアントに面する部分になることができませんでしたか?

4

1 に答える 1

23

プロトコルは、2 種類の具体的なエンティティ間のインターフェイス ポイントを表します。1 つはプロトコルを呼び出すコード (例で呼び出すfooもの)、もう 1 つはそれを実装するコード ( Atype foo-method) です。一方にとって便利なものは、他方にとって便利ではないかもしれません。実装者は完全な最小のインターフェイスを提供したいと考えていますが、呼び出し元はサポートできる最もリッチな API を望んでいます。

あなたはClojureScriptコアについて言及しました。ISeqそこのプロトコルを見てください。これはいくつかのタイプによって実装され、それぞれが および を実装する必要が-firstあり-restます。これらをできるだけ簡単に実装できるようにするために、引数で seq を呼び出す必要はありません。ただし、関連する関数firstrestその顔の呼び出し元は、文字列、ベクトルなどの非 seq の受け渡しをサポートしているため、この共通機能は非プロトコル関数によって提供されます。もちろん、呼び出し元に面する APIはnext、、、、順次分解などはすべて と の上に構築されています。mapfilter-first-rest

プロトコル メソッドをラップする fns によって提供されるその他の一般的な機能には、引数の検証 (アサートなど)、既定の引数、および var-args のサポートが含まれます。

于 2013-03-28T05:11:02.163 に答える