プログラミングClojureを読むという企画

と言うことで本題の,書籍プログラミングClojureの書評である.

プログラミングClojure

プログラミングClojure

オーム社の森田さん経由で献本をいただいてしまったので,最低でも3400円分すなわち私の単価から時間に換算してXXX分間くらいは書こう...(←と,こういうことを書き散らすとサラリーマン的にまずい)

まず言いたいのは...

でも、あるついてない日に、benchの中で使っているのとぶつかるstartなんて名前をローカル変数にうっかりつけてしまうかもしれない。

(let [start 1 end 2]
  (bench (+ start end))
  • > {:result 3, :elapsed 1228277342451783002}}

(構造体の終わり括弧が一つ余計なのは別にしても)これって捕捉された版の意味としては

user> (let [start 1 end 2]
	   (let [start (System/nanoTime)
	         result (+ start end)]
	       {:result result :elapsed (- (System/nanoTime) start)}))
{:result 226944040961353, :elapsed 71517}

となるんじゃないのかな... つまり返り値のうち間違うのは :elapsed じゃなくて :result だと思うんだけど.

じゃなくて,私の書評の目的

... いやいや,まず言いたいのは,上記のような重箱の隅ではなくて,「この書評の目的」である.既に幾人かの方々がプログラミングClojureの書評をwebに公開してらっしゃるので(↑のshiroさんによるサポートページに部分的なリストがある)それと重複するようなことを書いても仕方あるまい.
はっきりさせておきたいのは,Clojureという言語とJavaプラットフォームとのつながりである.正直言って

  • Lispを学びたいだけなら,ISO標準があって現実世界の大規模プロジェクトで採用例があるCommon Lispか,表示的意味論すら与えられているアカデミック寄りのSchemeがある
  • スクリプト言語で生産性アップ」ならRubyとかPythonとかいくらでもあって,こいつらは9割の局面で十分な抽象化を提供する既存ライブラリ/フレームワークを誇り,その量はClojureの1000倍では効かないだろう(しかも一応 JVM上の実装も存在する)

という辺りを考慮すると,Clojureの存在意義は

  • Javaで書かれたシステムとの緊密な(かつ,生Javaの低生産性を回避する)相互運用

以外には無い.その枠内ですらGroovyやScalaといった先発「JVM上の言語」が存在するので,「ここでClojureの入門書を読む動機って何?」という疑問を突きつけられると,答えるのは簡単ではない.「そこに言語があるから」式の動機では,「じゃあHaskellの方が『尖って』ない?」「むしろCoqかHOLでCコンパイラでも書いたら*1相当breeding edgeだぜ?」みたく際限なくなりそう.
私はこの本を読むまでは全くClojureについて無知で,Common Lispの一実装なのかとすら思っていた(そうではない.Clojureは独自のLisp方言).そこから始めてちょこちょことプログラミングClojureを読み進めることで,今までの知識と合わせて多少の感覚を掴めるところまでは来たと思っている.本企画では,その過程で得たClojureという言語の性格についてプログラミングClojureに沿う形で解説したい.同時に(こちらがより重いテーマなのだが)上で提起したような「何故Clojure?」という問題提起に対し「Javaとの相互運用」という線で私なりの考えを述べたいと思う.
ちなみにまだ文章の後半はまとまってないので,最終的にまとめに失敗して尻切れトンボになったら,ここで述べた「目的」は時系列を遡って粛正される恐れがあります(ぉぃ

[Stu]タグ

なお,この「プログラミングClojureを読む」企画は [Stu] タグでまとめるつもりである.

*1:http://www.cse.psu.edu/popl/10/program.html 特に "Verified Compilers" セッション.