[Clojure]Programming Clojureの感想
Programming Clojureを読んだのでその感想、の前に、Clojureの特徴など。
Clojureとは
私見ですが、Clojureの特徴を紹介します。
Lispの方言
Common LispやSchemeの仕様とは互換性はない。Common Lispに比べてなじみやすい関数名になっていたり、Lisp-2ではなくLisp-1だったりする。Schemeに比べればCommon Lispに近い*1機能を持ったdefmacroが用意されている。
JavaVM上で動く
関数型プログラミングへの誘導
ミュータブルな操作は可能だが、自然にプログラムを組んでいれば関数型のプログラムになるように注意深く設計されている。
どういうことかというと、使いやすいところにイミュータブルなデータ構造が置かれていて、ミュータブルなオブジェクトを扱うときには専用のAPIを通さないといけないようになっているから。で、そのAPIがErlangプロセスやScalaアクターと同じくマルチコア時代対応(?)仕様になっているので、自然と別スレッドに対する考慮をプログラマに意識させるようになっている。
- ミュータブルなデータ構造を扱うAPI
トランザクションの制御方法は、STM (Software Transactional Memory)というアイデアを使っている。
周辺ライブラリ
初出が2006年ということもあり、周辺ライブラリはまだまだかなーと思いきや、、、結構使えるのが既にそろっている。
Web/DBシステムを作るのに必要な、DBアクセス(ClojureQLなど)、Webフレームワーク(Compojureなど)があって、ダウンロードして配置するだけであっさり動いてくれた。
デバッグ
JavaVM上で動作する非Java言語にありがちなのが、スタックトレースが意味不明という現象。
Clojureにはclojure.stacktraceというJavaVMスタックトレースをClojure仕様に翻訳してくれるライブラリがあり、ある程度緩和はされている。しかし、Eclipse上のデバッガではJavaVMの生のstacktraceが出るため、だいぶわかりづらい。無名関数を多用しているコードはただでさえスタックトレースを追いづらい上に、Clojureのライブラリ層がスタックのいたるところに出てくる。
あと、Lispのプログラムは横に長くなる傾向があるので、スタックトレースにソースコードの行数だけでなく、桁数も表示できればと思うんだけど、Java APIの仕様を見ている限りにおいてはできなさそう。
まあ、Clojureに限らず言えることですかね。