読者です 読者をやめる 読者になる 読者になる

Line 1: Error: Invalid Blog('by Esehara' )

または私は如何にして心配するのを止めてバグを愛するようになったか

>> Zanmemo

あと何かあれは 「esehara あっと じーめーる」 か @esehara まで

神の言語から降りたことで、未来になった言語としてのClojure

みよ!この盃は再び空になろうとし、そしてツァラトゥストラはふたたび人間になろうとしている ── ニーチェ:ツァラトゥストラはこう語った

 この記事はClojure Advent Calender (全部俺) 1日目の記事です。

始めに

 今日から一人によるClojure Advent Calenderを始めます。実は2011年にも、未完ながらもPythonに関する記事を一日一つあげるということをやっていました。2012年は私用によって、Advent Calender自体をスルーしていたのですが、今回の言語のテーマとしてClojureを選びました。

 Clojureは、Scalaと一緒で、一般的にはJVM上で動くLisp方言という認識の人が多いと思いますし、関数型的なアプローチを使うということで、お互いにセットとして語れることも、ままあるようです。とはいえ、日本だと、どちらかというとScalaのほうが人気がありますし、現実的に仕事になる可能性が高いのはScalaのほうである、というのは認めざるを得ない事実だと思うのです。事実、まだプレイヤーが少なく、海外で発売されている本がなかなか出せないという苦しい現実もあるようです。

 しかしそれを差し引いても、Clojureというのは、非常に魅力的な言語であると思います。そこで、そもそも自分にとって、どんな点が魅力的だったのかについて語れればと思います。

ClojureはEasy Lispである

 まず一つに、Lispというと、カッコだらけの取っ付きにくい言語であり、また"car"やら"cdr"などの、わからない記号が出てくるところが分かりにくいというのが正直なところでしょう。もう少し分かりやすい記号であったり、あるいは、ちょっとだけ緩くして欲しいよね、と思う人はいるかと思われます。

 Clojureの一側面は、Easy Lispであるということが出来るでしょう。いいかどうかはともかくとして、Lispの美点というのは、シンタックスをリストとして一貫して扱えるというところです。例えば、Common Lispを例にしてみましょう。

(defun foobar (x) ;; foobarという関数を定義する
  (* x 2))        ;; x * 2 を値として返す

 といったような表現が出来ます。また、Schemeだったりすると、

(define
  (foobar x)
  (* x 2))

 というような表現になるでしょう。しかし、このような丸カッコの連続は、可読性という問題で、そのリストの意味的な内容の理解を損なわせるという欠点があります。Clojureは、Lisp系として不純であり、不純であるが故に力を得ていると言ってよいでしょう。言い換えれば、JavaっぽいLispとも言えるでしょう。例えば、上記の表現に関しては、

(defn foobar [x]
  (* x 2))

 と書けます。さて、気になるところとしては、いわゆる別のカッコの存在でしょう。確かに、このカッコはいわゆる「Lisp」としては不純です。しかし、この不純さこそが、可読性を高めます。もちろん、可読性は各人によると言える部分はあるのですが、しかし、このカッコのお陰で取っ付きやすくなっているといっても過言ではありません。

 例えば、let(ローカルスコープの生成といえばいいのかな?) についても、次のように書けます。

(defn foobar [x]
  (let [y (* x 2)]
  (* y x)))

 Clojureは、可読性のためであるなら、伝統的なLispの関数を捨てます。例えば、cdrcarは実はありません。そのかわり、first rest(あるいはnext)が存在しています。

 Clojureは、「神の言語」から降りてきた言語です。しかし、そのために実はLisp初心者に優しい言語(!!)となっているでしょう。事実、自分はClojureに触れたことで、Lispの魅力に取り付かれ、他のLispはどういうアプローチなのかな、ということに興味がでてきたりしています。

ClojureはBetter Javaである

 一方で、Lispの弱点というのが、ライブラリが少ないという揶揄です。しかし、それもClojureは巧みです。なぜならJVM上に構築されたClojureという言語は他のJava言語を用意に使ってしまうからです。例えば、手元にJavafxをClojureから使ったソースを引用すると、次のようになるでしょう。ちなみに、tnodaさんのソースを参考にしています

(ns epied.core
  (:import [javafx.application Application]
           [javafx.scene Scene]
           [javafx.scene.text Font]
           [javafx.stage Stage]
           [javafx.geometry Side]
           [javafx.event ActionEvent EventHandler]
           [javafx.scene.control TextArea]
           [javafx.scene.control Label]
           [javafx.scene.layout StackPane]
           [javafx.geometry Pos])
  (:gen-class
   :name Editor
   :main true
   :extends javafx.application.Application))

(def application-title "Editor")

(def application-size {:x 500 :y 500})

(defn layout-screen []
  (let [root (StackPane.)
        textarea (doto (TextArea.))]
    (do
      (.. root getChildren (add textarea)))
    root))

(defn -start
  [this ^Stage stage]
  (let [root (layout-screen)]
    (doto stage
      (.setTitle application-title) 
      (.setScene
       (Scene. root
               (application-size :x)
               (application-size :y)))
      .show)))

(defn -main
  [& args]
  (Application/launch
   (Class/forName "Editor")
   (into-array String [])))

 さて、このソースを見てみると、私見ではありますが、あのJavaの冗長な感じが消え、むしろ簡潔な記述になっているのではないのかな、と少し思います。

 実際、Clojureはこのようなアクセスを手助けするマクロがたくさんあります。.とか..とか。このように、ただLispらしいというだけではなく、Javaと協力し、それをLispとして落とし込むために、ただいなる妥協があり、その結果としてパワーを得ていることがわかるでしょう。

Clojureは創造主である

 さて、その一方で、Lispのその簡潔さによって、Clojureはあらゆるところに侵食しはじめます。例えば、ClojureをトランスレートするClojureScriptの存在は欠かせないでしょう。またClojureは.NETでも使えてしまいます。そのように、Clojureを覚えてしまえば、Java、JavaScript、そして.NETの力を借りることが出来てしまうようになります。

Clojureは未来である

 その一方で、Clojureは非常に尖ったソフトウェアが出やすい土壌であることも間違いありません。

 例えば、ClojureのIDE環境として有名なLightTable、使い方によってはエディタそのものを楽器にしてしまうOvertone、Clojure上でPrologのようなロジックプログラムを可能にしてしまうcore.logic、そしてIndieGoGoで多大なる支持があった、Clojureに型付き言語を導入するためのプロジェクトなど、Clojureに対するポテンシャルは半端ではないように感じます。

 単純に、Clojureの周りは、それこそ「Lispは非実用的な言語である(!)」という偏見に抗うかのように、生産的にプロダクトがでている。このようなポテンシャルの高さも、Clojureの一つの魅力であると感じます。

しかし、にも関わらず?

 とはいえ、このようにClojureの魅力を強く話したとしても、Clojureの日本語ドキュメントが現状少ない状態であるならば、始めたくても始められない人の方がそれなりに出てくる。だから、暫くの間、Clojureについて話していければいいかなと思っています。

 Clojureをさわる人が増えてくれれば、Clojure関係の技術書の発売も捗りますし、これは悪いことではない。もちろん、英語を苦労して読み解くのも一つの手ではありますが、できるなら日本語でアクセスできたほうが、敷居は下がる。そのためには、Clojureの入門書、体系だった本を求める層が増えなければどうしようもない。

 というわけで、このClojure Advent Calender(全部俺)が、Clojureの始めるきっかけになればいいなと思います。続くかどうかは未知数ですが、どうぞよろしくお願いします。