memo

ちょっとしたメモ書き(個別表示)

Clojure雑感 : (2011/03/09)
本を買ったっきり(丸1年ぐらい)全然読んでなかったけど、先週末にちょっとだけ読みつつClojureを触ってみた感想。
JavaVM上で動作するのでリクエスト毎にプロセス起動させるようなCGIスクリプトでの動作は絶望的にキツい(まあそりゃそうか)
Webプログラミング用途なら永続プロセスとして動かすのが現実的
Javaのライブラリがそのまま使えるので簡易なWebサーバ等は楽に書ける。
テンプレートエンジンも同様にJavaの物が利用可能、たとえばVelocityを動かす場合のコードは以下のようになる。
(def vcon
(new org.apache.velocity.VelocityContext))
(def tmpl
(.
org.apache.velocity.app.Velocity
getTemplate
"example.vm"))
(def strw (new java.io.StringWriter))

(. vcon put "label" "Example Template")
(. vcon put "items"
(list "first" "second" "third"))

(. tmpl merge vcon strw)
(println (. strw toString))
なんとも手続き的なコードになってしまったが仕方がない。
そして以下がテンプレートである「example.vm」の中身となる。
<h1>$label</h1>

<ul>
#foreach( $item in $items )
<li>$item element</li>
#end
</ul>

また、compojureというWebフレームワークを利用することで以下のようなS式を書くことでHTMLを生成することも可能。
(html
[:head
[:title "Example Title"]
(include-css "css/style.css")]
[:body
[:h2 "Example Label"]
[:div "Example Message"]])
これはとりあえず静的HTMLで書いてあとからテンプレート化、というやり方とは相性が悪いので個人的にはこの方法を使うことは無いだろうけど。
(まあHTMLをパースしてこの形式にするというてもあるけど)

起動が遅いので開発中に再起動を繰り返すのも面倒だが、実行中にモジュールのリロードが可能なのでいちいちコードを書き換えるたびに再起動する必要はない。
以下のようにREPLから打ち込めばモジュール単位でリロード可能。
;; my-moduleの部分が対象モジュール名になる
(use 'my-module :reload)

ライブラリ等、実用に必要な部分は基本的にJavaから持ってこれるので実用上の技術的な問題点はほとんど無いように思える。

ただJavaのライブラリに多くを依存する関係上、Clojureのコードを書いてる間は必然的にJavaのライブラリのドキュメントを多く読むことになる。
「Javaを読むのはいいけど、書くのは嫌だ」という人にはClojureはオススメだけど「Javaは読むのも書くのも嫌だ」という人にはつらいかもしれない。
(まあ殆ど全てのLispプログラマはCやJavaのコードも読めるから少しの辛抱か、逆は成立しないが)

あと古典的なLispに慣れ親しんでいる人からも違和感があるかも。
Common Lispでは「car/cdr」の代替として「first/rest」があったけどClojureには「first/rest」のみで「car/cdr」が廃止されてしまった。
実用上問題は無いけど、「car/cdr」の無いLispというのも古典主義との決別を感じさせる。
他にも色々と伝統的なLispからはかけ離れた部分があるようだ。

: back