【クロージャー】

Clojure(クロージャー) とは?

最終更新:
💡 変わらないデータが、並行処理を変える

JVM上で動作するLisp方言の関数型プログラミング言語。イミュータブルデータと並行処理のしやすさが特徴。

📌 このページのポイント
元の値を残し、変わらない部分を共有 元の値[ A B ]更新後の新しい値[ A X ]BAX元の要素共有する部分変更部分参照と共有を示す概念図
更新しても元のコレクションは変わらない。内部では変更のない部分を共有できる。
ひよこ ひよこ
ClojureってLispの仲間なの?括弧が多いね。
ペンギン先生 ペンギン先生
そうだよ。たとえば「(+ 1 2)」は、足し算の関数に1と2を渡して3を得る式。関数と引数を括弧の中に並べる書き方なんだ。JVM上で動き、Javaのライブラリも呼び出せるよ。
ひよこ ひよこ
イミュータブルってなんで大事なの?
ペンギン先生 ペンギン先生
値そのものを書き換えないので、同じコレクションを複数の処理が読んでいても、途中で中身が変わる心配を減らせるんだ。ただし、Javaの変更可能なオブジェクトも扱えるし、変化する状態の管理は別に必要だよ。
ひよこ ひよこ
でもデータが変わらないと、更新はどうするの?
ペンギン先生 ペンギン先生
元の値を残し、変更を反映した新しい値を得るよ。永続データ構造は、変わらない部分を内部で共有することで、毎回すべてをコピーせずに更新できる。「永続」はここでは以前の版も使えるという意味で、ファイルへの保存のことではないんだ。
ひよこ ひよこ
変化する状態は持てないの?
ペンギン先生 ペンギン先生
持てるよ。値と、その時点の値を指す参照を分けて考えるんだ。参照の更新にはClojureが用意する仕組みを使う。不変のコレクションがあるだけで、アプリ全体の並行処理が自動的に安全になるわけではないよ。
ひよこ ひよこ
REPL駆動開発って何をするの?
ペンギン先生 ペンギン先生
式を少しずつ評価し、データを調べたり関数を定義し直したりして、動作を確かめながら開発するよ。REPLはRead・Eval・Print・Loopの略。ClojureScriptでも似た書き方を使えるけれど、実行先はJavaScriptなので、JVM用のJavaライブラリがそのまま使えるわけではないんだ。
ペンギン
まとめ:ざっくりこれだけ覚えればOK!
「Clojure」って出てきたら「JVM上で動き、不変のデータを重視する関数型言語」と思えばだいたいOK!
📖 おまけ:英語の意味
「Clojure」 = closureをもじり、C・L・Jを含めた名称
💬 開発者Rich Hickeyは、closure(クロージャ)と同じ発音にし、C(CLR)・L(Lisp)・J(JVM)を含む名前にしたと説明しているよ。

参考資料

← 用語集にもどる