Clojure Expression Problemまとめ
主にデータと操作の抽象を扱う.
Clojureでは,
- データ抽象として
- deftype
- defrecord
- 操作の抽象として
- defprotocol
- multimethod
という仕組みが用意されている.
Clojureにおける大きなテーマのひとつなので必要に応じてサブメモにわける.
- 単純な条件分岐: 📝Clojure 条件分岐
- 言語で定義されたマクロはこっち Reader Macros
- 汎用マクロはこっち 📝Clojure Macros
- マルチメソッドはこっち 📝Clojure マルチメソッド
- レコードはこっち 📝Clojure: レコード | Records
- プロトコルはこっち 📝Clojure: プロトコル | Protocols
cf. Javaではデータ抽象としてクラス, 操作の抽象としてインタフェースがある.
Clojure: Data Types
Clojure データ型. Java クラスの代替.
protocolで規定された抽象化の実装を作るのに使う.
ref: Clojure - Datatypes: deftype, defrecord and reify
話題がおおきいのでレコードはこっちへ.
Topics
💡マルチメソッド/プロトコルよりもシンプルなif/cond/caseで処理できるか見極める
条件分岐の複雑さを解くための抽象が必要かどうかをまず見極める. 必要がなければif/cond/caseあたりのより簡単なシンタックスで済ます.
ref. Clojure条件分岐(if/when)
条件分岐としては基本的な文法で十分であることをここで強調したい.
分岐もたいした複雑さがないならばポリモーフィズムは導入するべきでない. 個人開発でさくっとプロトタイプをつくるときなどこりすぎても多様さが不必要なことがおおい. 🏷YAGNI
cf. if文やswitch文のおばけをウンコードという.
💡Clojure multimehod vs protocols 比較
どちらもExpression Problemのための操作抽象であり, 同じことが実現できるところがややこしいところなのでココで整理しておく.
基本方針としてはたいていはprotocolsでいい, multimethodはより表現力があるもののコストがかかるので必要なときに限りmultimethodを選ぶ.
—
ref. Clojure multimethods vs. protocols - Stack Overflow-
protocolsははじめの引数の型によるdispatch, multimethodはそれより汎用的な複数の引数や型に応じたdispatch.
Protocols provide efficient polymorphic dispatch based on the type of the first argument. Because the is able to exploit some very efficient JVM features, protocols give you the best performance.
Multimethods enable very flexible polymorphism which can dispatch based on any function of the method’s arguments. Multimethods are slower but very flexible.
In general, my advice is to use protocols unless you have a specific case that requires multimethods.
protocolsでたいていは十分でありmultidispatchは複数条件による分岐が必要なとき.
use protocols when they are sufficient but if you need to dispatch based on the phase of the moon as seen from mars then multimethods are your best choice.
🔦Rich Hickeyはパターンマッチよりもポリモーフィズム(multimethods)が好き
なぜClojureにはパターンマッチがないのか?
それはClojureとRich Hickeyの設計思想だから. brittleとは, こわれやすい, もろい, という意味.
Polymorphism is a good thing
- Switch statements, structural matching etc yield brittle systems
- Polymorphism yields extensible, flexible systems
- Clojure multimethods decouple polymorphism from OO and types
- Supports multiple taxonomies
- Dispatches via static, dynamic or external properties, metadata, etc
またClojureでは引数にMapがよく使われるのでMap構造のココの場合を元に条件分岐という処理が多いからかもしれない.
- https://www.reddit.com/r/Clojure/comments/gee6m5/just_found_out_why_clojure_doesnt_have_pattern/
- https://clojure.org/about/rationale#_polymorphism_is_a_good_thing
- 📐Clojure Way
- 📝Clojure マルチメソッド(multimethod)
👉Related
- tags: 🔖Expression Problem