なぜ Clojure なのか

いつも告知ばかりなので、たまには。

始まり

最近 Clojure を勉強しています。Clojure というのは JVM 上で動く Lisp に影響を受けた言語です。
JVM 上で動く言語といえば Scala だと思いますが、なんか興味が持てなかったので一切手を出していません。

さて、なぜ Clojure かという話しですが、最初は単に新しい言語を覚えたいという理由からです。

仕事では Erlang/Python をメインで書いています。特に Erlang は商用製品で書いているので、かなりガッツリやっています。仕事で使う言語は上記に加えて C くらいです。ただ C は読めれば十分なのでそれ以上は困っていません。

個人的に仕事で使えない言語は覚える気が無いので。趣味で書くのであれば Python で十分でした。

Clojure との出会い

Clojure が最初に気になった理由は Heroku が Clojure に対応したときです。もともと Ruby だけだった Heroku が Node.js の次?だったかその辺りで対応したのです。個人的にはなんでそのマニアックな言語 ... と思った程度でした。

それから月日は流れ、言語覚えるならやっぱ JVM のがいいなぁと思って Clojure の本をとりあえず買ってみたのです。オーム者のプログラミング Clojure という本です。PDF も買ってみたかったのでオーム社のウェブサイトから買いました。

2011 年の 7 月くらいにかってから、9 月くらいまでは全然手を付けずほとんど読み進めませんでした。

ここで、自分に転機が訪れます。2011 年の 9 月 23 日。Erlang Workshop 2011 Tokyo に参加した日です。
エリクソンで Erlang VM を開発している Patrik Nyblom が ETS に STM を実装したという話しをしている中で Clojure は勉強した方がいいよという話しをしていたのです。正直 STM は何が嬉しいのかあまり良くわかっていません、ただ Clojure はやるべき。という話しを鵜呑みにしてやってみようかなと思ったのです。

少し前に Twitter が Storm という BackType 社が開発していたリアルタイムデータ処理システムをオープンソースで公開していました。これがなんと Clojure で書かれていたのです。

自分はあまりデータ処理技術を追いかけてはいませんでしたがなぜか Storm だけは興味を持っていたのです。

また最近は Heroku が Python に対応したこともあって Heroku を色々追いかけていました。PythonWSGI のような Clojure の Ring というのは Heroku の中の人が作っていて Storm も使っているようでした。

色々な出来事が重なり自分の中では Clojure を少しずつ趣味のレベルで構わないから勉強していこうという気にさせました。仕事とはすぐには繋がらないかも知れないけど、今の ErlangPython のコードとは別のパラダイムである事、Clojure で学んだ感覚が他にも生きることは間違いありません。これは Clojure に限らず何でもです。

Clojure の勉強法

そんなことで、まずは本を読むことにしました。いつもならひたすら写経から入るのですが、仕事で必要なわけでは無いのでゆっくりじっくり攻めることにしました。

とにかく本を読みます、ただ難しい事はパスしてプログラミング Clojure の第一章と第二章を何度も何度も繰り返し読みました。

そして Storm のソースコードをちらっと眺めたところ、初めて Storm のコードを見たときの違和感は無くなっていました。

さて、次はやはり Heroku にデプロイして Hello World がやりたくなりました、ただ前述の Ring やビルドツールである Leiningen には手を付けていなかったので、まずは環境を整えるところから始めました。

Leiningen は HomeBrew でインストール出来ました。Clojure は 1.3 をインストールしました。ただ leiningen さえあれば Clojure はわざわざインストールしなくてもイイという衝撃の事実を後から知りました。

初めて書いたコードが以下でした。まだこれ以上は書いていません。

; lein new snowflake
; snowflake/project.clj
(defproject snowflake "1.0.0-SNAPSHOT"                                                                                                
  :description "snowflake"
  :dependencies [[org.clojure/clojure "1.3.0"]
                 [ring "1.0.0-RC1"]]
  :dev-dependencies [[lein-ring "0.4.6"]]
  :ring {:handler snowflake.core/home})

; lein deps

; snowflake/src/snowflake/core.clj
(ns snowflake.core                                                                                                                    
  (:use ring.util.response))

(defn home [request]
  (response "Hello World"))

; lein ring server

Clojure/Ring を使っての Hello World です。やっぱり表示されると嬉しいモノですね。色々調べたりして 1 時間くらいかかりました。

まだここまでです。Heroku にはアップロードできていません ... 。

Clojure の勉強を初めてみて

何となくわかるのだけれど、今までの言語とは全く違うというのが正直な感想です。ただ Erlang のおかげでリスト処理や再帰、無名関数には抵抗がまったくありません。無いと困るくらいです。

まだまだこれからなのでしょう、理想は Django を使って簡単なアプリを作るレベルまでは Clojure が出来ればいいなぁと思っています。STM にはまだ触れられていませんし、並列処理もまだまだ先です。

ただ、急いで覚える必要は全くないので、ゆっくりやっていこうと思います。