2011-08-22 3 views

答えて

82

これは、3つの異なる要因の組み合わせである:

  • のいくつかの事実をタイプを定義する際に、JVM
  • の特定のタイプのシステム異なるユースケースのためにわずかに異なる意味論の必要性

    1. これらは早期に開発され、言語の進化に伴って後に開発されました。

    まず、これらが何をするかを考えてみましょう。 deftypeおよびgen-classは、両方とも、事前コンパイルのための名前付きクラスを定義している点で類似しています。ジェネラルクラスが最初に来て、clojure 1.2でdeftypeが続きました。 Deftypeが好まれ、パフォーマンス特性は優れていますが、より制限的です。 deftypeクラスはインタフェースに準拠できますが、別のクラスから継承することはできません。

    具体化プロキシは、両方の実行時に動的に匿名クラスのインスタンスを作成するために使用されています。プロキシが最初に来て、refeはdeftypeとdefrecord with clojure 1.2と一緒に来ました。セマンティクスがあまり制限的ではない、デフトタイプと同じように、Reifyが好まれます。

    deftypeとdefrecordの両方が同じ時刻に表示され、同様の役割を果たしているため、その理由が問われます。ほとんどの目的のために、私たちはdefrecordを使いたいと思っています。それは、われわれが知っていて愛しているさまざまな善良さ、順序性などすべてを持っています。 Deftypeは、他のデータ構造を実装するための低レベルビルディングブロックとしての使用を意図しています。通常のclojureインターフェイスは含まれていませんが、これはデフォルトではありませんが、変更可能なフィールドのオプションがあります。

    さらに読書のためにチェックアウト:

    The clojure.org datatypes page

    The google group thread where deftype and reify were introduced

  • +1

    Googleグループのスレッドは非常に貴重でした。私の理解は、java-interopプロキシのためであり、gen-classはreifyとdeftypeを主に取り入れています。私は今、タイプを定義するための「推奨される」方法が少なくなったことをうれしく思っています。 – Salil

    +1

    偉大な答えは、スレッドのリンクに感謝します。 –

    +0

    申し訳ありませんが、「連続性」とはどういう意味ですか? Googleがサポートしていない... – Trylks

    42

    短い答えは、彼らがすべて異なると有用な目的を持っているということです。複雑さは、基盤となるJVMのさまざまな機能と効果的に相互運用する必要があるためです。

    の場合、Javaの相互運用性は不要です。時間の99%は、defrecordまたは単純なClojureマップを使用することをお勧めします。

    • 使用defrecordあなたは、そうでない場合のプロトコル
    • を使用したい場合は、通常のClojureのマップで、おそらく最も簡単で理解しやすい

    ニーズがより複雑な場合は、次のフローチャートは、のための素晴らしいツールです。あなたが他の人の上にこれらのオプションのいずれかを選択する理由を説明する:

    http://cemerick.com/2011/07/05/flowchart-for-choosing-the-right-clojure-type-definition-form/

    Flowchart for choosing the right clojure type definition form

    +1

    フローチャートへのリンクに感謝します。このブログは、O'reilly's - Programming Clojureの共著者によるものです。私はこの意思決定がかなり複雑だと思う。インタフェースと具象クラスの違いや静的メソッドの定義の必要性、または名前付きの型や匿名型は膨大なため、異なる言語構造が必要ですか? – Salil

    +3

    違いは広大ではありませんが、達成しようとしている点では哲学的に違いがあります。私はClojureの複数のアプローチがこれらの根本的な違いを反映していると考えています。なぜなら、異なる名前を付けなければならない理由があります。 – mikera

    +0

    +1。前のフローチャートを見ていなかった、それは素晴らしいです。 –

    関連する問題