2012-01-18 7 views
4

後で、さまざまなデータ型で実装できる関数を定義するために、両方の関数を使用できるようです。 AFAIKの大きな違いは、defmultiが地図上で動作し、defprotocolがレコード上で動作することです。defmulti v defprotocol?

他にどのような違いがありますか?どちらか一方を使用する利点は何ですか?

答えて

10

短いバージョン:defmultiははるかに柔軟で一般的ですが、defprotocolは優れたパフォーマンスを示します。

少し長いバージョン:

defprotocolは、ほとんどの主流のプログラミング言語における多型のようである、タイプのディスパッチをサポートしています。

defmultiは、1つのタイプ以外のものにディスパッチできるより一般的なメカニズムです。この柔軟性には、パフォーマンス上のペナルティが伴います。

More on protocols

More on multimethods

+0

ああ、ありがとう! 'extend-type'のように、関数を一緒に宣言する必要はないようです。これは正しいです? – wrongusername

+1

プロトコルはJavaインタフェースと考えることができます。だから、 'defprotocol'では関数を一緒に宣言する必要があります。マルチメソッドの宣言は一つのことですが、 'defmethod'の定義は一緒である必要はありません。 – corvuscorax

+0

私は参照してください。ありがとうございました:) – wrongusername

5

モチベーションをカバーするだけでほか、corvuscoraxの答えはうまくorigional質問をカバーしています。

はもともとClojureのは唯一マルチメソッドを持っていたし、非常に早い段階で多くの考えに非常によく、すべてのケースを扱うことができるし、提供する抽象化の制限を回避彼らの抽象化を構築するために人々を強制しないでしょうディスパッチ抽象化を構築するに入りました言語によって

Clojureのは、ここで、少なくともJavaとプロトコルためこうして必要により製造することができ、任意のバイトコードを生成することができる理論、より発送抽象にすることを必要と抽象化「のClojureでのClojure」を作成する意欲を成熟したようネイティブJavaによく似ています。
Clojureは強力な「あなたのプラットフォームを抱いて」理想的であり、プロトコルはこの考え方に適しています。

+1

私は参照してください。では、ClojureにClojureを書く利点は何ですか? – wrongusername

+2

理由の1つは、Clojureをより抽象度の高いレベルで記述できることです。アセンブリの代わりに、CでCコンパイラを書くのと同じようなものです。これにより、ClojureScriptのようなことがより簡単になり、ClojureのCLRポートをJVMバージョンと同期させることが容易になります。さらに、それはGödel、Escher、Bach-ishの方法でクールでエレガントです:-) – corvuscorax

関連する問題