[解決済み] なぜClojureではクラスを定義する方法が1つではなく、5つあるのですか?
質問
Clojureにはgen-class、reify、proxy、そして新しいクラスのようなデータ型を定義するためのdeftypeとdefrecordがあります。構文の単純さに価値を置き、不必要な複雑さを嫌う言語にとって、それは異常なことのように思えます。 なぜそうなのか、どなたか説明していただけないでしょうか。Common Lispスタイルのdefclassで十分だったのでしょうか?
どのように解決するのですか?
これは3つの異なる要因が混在しているのです。
- jvm の特定の型システム
- 型を定義する際に、異なるユースケースに対してわずかに異なるセマンティックスの必要性
- 言語の進化に伴い、これらのいくつかは先に開発され、いくつかは後に開発されたという事実。
ではまず、これらが何をするものなのかを考えてみましょう。 デフタイプ と 遺伝子クラス は、どちらも先読みコンパイルのために名前付きクラスを定義するという点で似ています。 gen-classが最初に来て、clojure 1.2ではdeftypeがそれに続きました。 deftypeはより好まれ、より良いパフォーマンス特性を持っていますが、より制限的です。 deftypeクラスはインターフェイスに適合することができますが、他のクラスを継承することはできません。
Reify そして プロキシ はどちらも実行時に動的に匿名クラスのインスタンスを生成するために使われます。 Proxyが最初に来て、reifyはclojure 1.2でdeftypeとdefrecordと一緒に来ました。 Reifyは、deftypeがそうであるように、セマンティクスがあまりに制限的でない場合に、好まれます。
それは、なぜdeftypeとdefrecordの両方が同じ時期に登場し、同じような役割を持つのかという疑問を残します。 ほとんどの目的のために、私たちはdefrecordを使いたいと思うでしょう: それは、私たちが知っていて愛する様々なclojureの良さをすべて持っています。 Deftypeは他のデータ構造を実装するための低レベルのビルディングブロックとして使用することを意図しています。 それは通常のclojureインタフェースを含んでいませんが、ミュータブルフィールドのオプションがあります(これはデフォルトではありませんが)。
さらなる読書のために、チェックしてください。
関連
-
[解決済み] clojureの "let "の例を理解しようとすること
-
[解決済み】ClojureでWebアプリケーションを作るには?[クローズド]
-
[解決済み] clojureプロトコルの簡単な説明
-
[解決済み] Clojure、Scheme/Racket、Common Lispの違いは何ですか?
-
[解決済み] なぜClojureには "シンボル "の他に "キーワード "があるのですか?
-
[解決済み] Clojureのブロックコメント
-
[解決済み] Clojureのdoseqとforの違いについて
-
[解決済み] Lisp-1とLisp-2の違いは何ですか?
-
[解決済み] Clojureと他のLispsの比較 [終了しました]。
-
[解決済み] ベクトル中のある項目のインデックスを見つけるにはどうすればよいですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] clojureの "let "の例を理解しようとすること
-
[解決済み] REPLでclojureファイルを再読み込みする方法
-
[解決済み] 実社会で活躍するLisp【クローズド
-
[解決済み] clojureプロトコルの簡単な説明
-
[解決済み] Clojure、Scheme/Racket、Common Lispの違いは何ですか?
-
[解決済み] Lisp-1とLisp-2の違いは何ですか?
-
[解決済み] Clojureで遅延シーケンスを非遅延シーケンスに変換する方法
-
[解決済み] Clojureと他のLispsの比較 [終了しました]。
-
[解決済み] Clojureのフューチャーとプロミスはどう違うのか?
-
[解決済み] ベクトル中のある項目のインデックスを見つけるにはどうすればよいですか?