clojureでdefrecordはどこで使うべきですか?
2023-10-21 19:30:30
質問
私はclojureプログラムの中で多くのマップと構造体を使用しています。これらをdefrecordsに変換することの利点は(パフォーマンスとは別に)何でしょうか?
どのように解決するのですか?
構造体は事実上非推奨と考えるので、全く使っていません。
多くのマップインスタンスで使用されるよく知られたキーの固定セットを持っている場合、私は通常レコードを作成します。大きな利点は
- パフォーマンス
- 生成されたクラスは、マルチメソッドやその他の状況で切り替えることができる型を持っています。
- defrecordの周りにマクロを追加することで、フィールドバリデーションやデフォルト値など、必要なものを取得することができる。
- レコードは任意のインターフェイスやプロトコルを実装できる(マップはできない)
- レコードはほとんどの場合、マップとして機能する
- キーとバルは安定した(作成ごとの)順序で結果を返します。
レコードのいくつかの欠点。
- レコードは(Clojureマップではなく)Javaクラスインスタンスなので、構造的な共有がなく、同じレコード構造は、おそらく変更された同等のマップ構造よりも多くのメモリを使用することになります。 また、レコードを変更すると、より多くのオブジェクトの作成/破棄がありますが、JVM は、この種の短命のゴミを汗をかかずに食べるように特別に設計されています。
- 開発中にレコードを変更する場合、それらの変更をピックアップするために、おそらく REPL をより頻繁に再起動する必要があります。 これは、通常、開発の狭いビットの間だけの問題です。
- 多くの既存のライブラリは、レコードをサポートするように更新されていません (postwalk、zip、matchure などなど)。 私たちは必要に応じてこのサポートを追加しました。
関連
-
[解決済み】ClojureでWebアプリケーションを作るには?[クローズド]
-
[解決済み] javaからclojureを呼び出す
-
[解決済み] clojureプロトコルの簡単な説明
-
[解決済み] Clojure: リデュース vs. アプライ
-
[解決済み] Clojureのdoseqとforの違いについて
-
[解決済み] コンポジュール・ルートの "ビッグ・アイデア "とは?
-
[解決済み] Lisp-1とLisp-2の違いは何ですか?
-
[解決済み] Clojureのフューチャーとプロミスはどう違うのか?
-
[解決済み] コマンドラインインターフェースでClojureアプリを作る?
-
Clojure - 名前付き引数
最新
-
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 "の例を理解しようとすること
-
[解決済み] useとrequireの違い
-
[解決済み] Lispに関するPaul Grahamの指摘を説明してください [closed].
-
[解決済み] コンポジュール・ルートの "ビッグ・アイデア "とは?
-
[解決済み] Clojureはどんなことに使えるの?[クローズド]
-
[解決済み] Lisp-1とLisp-2の違いは何ですか?
-
[解決済み] Clojureで遅延シーケンスを非遅延シーケンスに変換する方法
-
[解決済み] Clojureのフューチャーとプロミスはどう違うのか?
-
[解決済み] 関数型プログラミングはWeb制作に適しているか?[クローズド]
-
Clojure - 名前付き引数