2. Clojure の特徴
Clojure には次のような特徴がある。
- Lisp である
- JVM 上の言語
- 関数型言語
- 並列化が容易
Lisp である
Lispの特徴といえば、S式と括弧。
S式(S-expression)
S式とは、内部のデータ構造の表現のことである。SはSymbolの頭文字。LispのコードはLispのデータでもある。例えば、1 + 2 * 10
を画面に表示する場合を考える。PythonとClojureで書くと次のようになる。
Python: print 1 + 2 * 10
Clojure: (println (+ 1 (* 2 10)))
構文を比較すると、Clojureの方は言語の構文木をそのまま表現していることがわかる。「プログラムを生成するプログラム」を作る場合を考えると、前者に比べ後者は演算子の優先順位や結合性を考える必要がないので非常に容易である。
Lisp の中では括弧がわかりやすい
通常、Lisp 系言語では()
のペアのみを用いて構文を表現するが、Clojureの場合、リスト、マップ、セット、ベクタ、メタデータなどのデータ構造について他の記法を提供している。比較的初心者でも構文が見やすい。
JVM 上の言語
JVMの上で動く言語なので、様々なプラットフォーム上で動作させることが可能である。またJava のライブラリがそのまま使用できる。ClojureではJavaの機能が必要なら、Java APIをラッパーで隠さず、直接呼ぶことを推奨している。
関数型言語
関数型言語は基本的にプログラミングする際、次のようなことに注意する。
イミュータブル(immutable)
immutable は「不変」を意味する。一度定義した値は書き換えられない。例えば一部内容が異なるデータが欲しい場合、コピーを作って内容を変更したものを返すような処理を定義し、元の値はそのまま保持する。
参照透過性
関数に同じ値の引数を与えれば結果はいつも同じ。
副作用を起こさない
本来すべきこと以外の作用を伴いう処理は行わないようにする。上記のイミュータブル・参照透過性も副作用を起こさないことに関連する。入出力も副作用なので、実用的なプログラムを書く際に完全に排除するのは困難だが、無くせる場所は無くす。
高階関数
関数を引数に出来る、また関数返す関数を作れる。
並列化が容易
関数型言語は基本的に並列プログラミングに強い。副作用がないものは他のスレッドを心配する必要がなくなる。その上、 Clojure の場合明示的なロックを使わなくても、変更可能なデータに対してスレッドセーフなアクセス方法が存在する(ソフトウェアトランザクショナルメモリ: STM)。