後で、さまざまなデータ型で実装できる関数を定義するために、両方の関数を使用できるようです。 AFAIKの大きな違いは、defmulti
が地図上で動作し、defprotocol
がレコード上で動作することです。defmulti v defprotocol?
他にどのような違いがありますか?どちらか一方を使用する利点は何ですか?
後で、さまざまなデータ型で実装できる関数を定義するために、両方の関数を使用できるようです。 AFAIKの大きな違いは、defmulti
が地図上で動作し、defprotocol
がレコード上で動作することです。defmulti v defprotocol?
他にどのような違いがありますか?どちらか一方を使用する利点は何ですか?
短いバージョン:defmulti
ははるかに柔軟で一般的ですが、defprotocol
は優れたパフォーマンスを示します。
少し長いバージョン:
defprotocol
は、ほとんどの主流のプログラミング言語における多型のようである、タイプのディスパッチをサポートしています。
defmulti
は、1つのタイプ以外のものにディスパッチできるより一般的なメカニズムです。この柔軟性には、パフォーマンス上のペナルティが伴います。
モチベーションをカバーするだけでほか、corvuscoraxの答えはうまくorigional質問をカバーしています。
はもともとClojureのは唯一マルチメソッドを持っていたし、非常に早い段階で多くの考えに非常によく、すべてのケースを扱うことができるし、提供する抽象化の制限を回避彼らの抽象化を構築するために人々を強制しないでしょうディスパッチ抽象化を構築するに入りました言語によって
Clojureのは、ここで、少なくともJavaとプロトコルためこうして必要により製造することができ、任意のバイトコードを生成することができる理論、より発送抽象にすることを必要と抽象化「のClojureでのClojure」を作成する意欲を成熟したようネイティブJavaによく似ています。
Clojureは強力な「あなたのプラットフォームを抱いて」理想的であり、プロトコルはこの考え方に適しています。
私は参照してください。では、ClojureにClojureを書く利点は何ですか? – wrongusername
理由の1つは、Clojureをより抽象度の高いレベルで記述できることです。アセンブリの代わりに、CでCコンパイラを書くのと同じようなものです。これにより、ClojureScriptのようなことがより簡単になり、ClojureのCLRポートをJVMバージョンと同期させることが容易になります。さらに、それはGödel、Escher、Bach-ishの方法でクールでエレガントです:-) – corvuscorax
ああ、ありがとう! 'extend-type'のように、関数を一緒に宣言する必要はないようです。これは正しいです? – wrongusername
プロトコルはJavaインタフェースと考えることができます。だから、 'defprotocol'では関数を一緒に宣言する必要があります。マルチメソッドの宣言は一つのことですが、 'defmethod'の定義は一緒である必要はありません。 – corvuscorax
私は参照してください。ありがとうございました:) – wrongusername