[Clojure]Programming Clojureの感想

Programming Clojureを読んだのでその感想、の前に、Clojureの特徴など。

Clojureとは

私見ですが、Clojureの特徴を紹介します。

Lispの方言

Common LispSchemeの仕様とは互換性はない。Common Lispに比べてなじみやすい関数名になっていたり、Lisp-2ではなくLisp-1だったりする。Schemeに比べればCommon Lispに近い*1機能を持ったdefmacroが用意されている。

JavaVM上で動く
  • 長年たたき上げられたJavaVMの資産を活用できる。
    • 効率的なネイティブコードを作ってくれるJust-in-Timeコンパイラ
    • 性能の良くなったGC
    • 無数のライブラリ
  • Javaのクラスやメソッドが言語内に組み込まれているかのように呼び出せる。
    • 呼び出しが簡単
      • (new fqcn.MyClass arg1 arg2 ...)
      • (. obj method arg1 arg2 ...)
    • Javaクラスを継承したオブジェクトもOn-the-Flyで作れる
      • (proxy [SuperClass Intefaces1 Interface2 ...] [super-ctor-arg1 ...] (method-name [meth-arg1 ...] ..body..) ...)
      • 実行時にその場でバイトコードにコンパイルされてロードされる*2
関数型プログラミングへの誘導

ミュータブルな操作は可能だが、自然にプログラムを組んでいれば関数型のプログラムになるように注意深く設計されている。
どういうことかというと、使いやすいところにイミュータブルなデータ構造が置かれていて、ミュータブルなオブジェクトを扱うときには専用のAPIを通さないといけないようになっているから。で、そのAPIErlangプロセスやScalaアクターと同じくマルチコア時代対応(?)仕様になっているので、自然と別スレッドに対する考慮をプログラマに意識させるようになっている。

  • ミュータブルなデータ構造を扱うAPI
    • Refs(ref, deref, dosync, ref-set, alter, commute)
      • 複数のミュータブルなオブジェクトの参照/更新をトランザクションとして扱える。(ACIDのうち、ACIが保障されている。)
    • Atoms
      • 単一のオブジェクトを扱えれば良い場合は、Refsよりも性能の良いAtomsが使える。
    • Agents
      • 値の更新が同期でなくて良い場合は、RefではなくAgentsでもいい。
    • Javaクラス
      • Javaのイミュータブルに実装されたクラスライブラリは、そのまま扱える。

トランザクションの制御方法は、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に限らず言えることですかね。

感想

全体的に関数型プログラミングLispJavaライブラリ資産を統合するという観点で、絶妙なバランス感覚の仕様になっていると感じた。
ClojureほどきれいにLispJavaを統合できるのを見ると、Scalaは不必要にJava言語に近すぎるんじゃないかとさえ思えてきた。

みたいな感じ。

仕事でも使ってみているが、仕事場にLisperがほとんど皆無という厳しい環境下にあるので、他人がメンテする可能性の無いものに限っている。あまりにもよさげなので、勉強会でも開いて広めてみてもいいかも。

書籍Programming Clojureの感想

Lisper、Javaプログラマ、いわゆる各種LLのプログラマそれぞれにターゲットをおいて書かれている。
サンプルはJavaライブラリの利用にもきっちりフォーカスを当てている。
英語が大の苦手にもかかわらず、特に問題なく読めたほどわかりやすい。

日本語訳が近々出るとのうわさ。

Clojure使うあての無いPerl, Python, Ruby, JavaScript, etc...プログラマであっても、興味深い領域をわかりやすく知ることができるので、超おすすめ。
isbn:1934356336

*1:展開時のシンボルの扱いなどがちょっと違うみたい。

*2:ループでぶん回すとPermGenがいっぱいになってしまわないか?その辺、考慮されていないわけは無いとは思うが、要検証