Clojure Expression Problemまとめ

主にデータと操作の抽象を扱う.

Clojureでは,

  • データ抽象として
    • deftype
    • defrecord
  • 操作の抽象として
    • defprotocol
    • multimethod

という仕組みが用意されている.

Clojureにおける大きなテーマのひとつなので必要に応じてサブメモにわける.

cf. Javaではデータ抽象としてクラス, 操作の抽象としてインタフェースがある.

Clojure: Data Types

Clojure データ型. Java クラスの代替.

protocolで規定された抽象化の実装を作るのに使う.

ref: Clojure - Datatypes: deftype, defrecord and reify

話題がおおきいのでレコードはこっちへ.

📝Clojure: レコード | Records

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構造のココの場合を元に条件分岐という処理が多いからかもしれない.


up: 📂Clojure Core Languages