対象読者
(1) インタープリタの作成方法に興味がある方
(2) Java言語経験がある方。初心者程度で大丈夫
(3) Lisp系言語を多少知っている方
(4) Clojureに興味がある方
対象読者は、 ( 1 AND 2 AND 3) OR 4 となります。
本LispインタープリタはJavaで書かれています。
Lispインタープリタを作った訳
以下のISLispの記事を読んでいたところ、無性にLispインタープリタを実装したくなりました。
Common Lispの仕様は巨大だからといって、サブセットじゃなくて、独自のLispを作って良いものなのか??? これが私が一番疑問に思った事でした。
私は、ここ数年 Clojureを学んではいたのですが、マスター出来ずにいました。
かなり昔の事ですが、Common Lispは、何年も学んでいました。
私にとってはCommon Lispの方がわかりやすく感じてしまいます。
でも折角Clojureのソースを読んでいた途中なので、ClojureとCommon Lispを混ぜたようなインタープリタを作ってみる事にしました。
教育用のLisp
インタープリタを作った事がない方も多いと思います。
そんな方が、ちょっと修正して遊んでみようかなーと思うくらいの、コンパクトで
わかりやすいソースにしたいと思いました。
Common Lispのコード例
(defun foo (x)
(cond ((zerop x) "zero")
(t (+ x 10))))
ご覧のとおり、全て丸括弧です。括弧が多くて読みにくいと言われますが、私はこのシンプルな構文が好きです。
プログラムとデータが同じ構造をしているのを「同図像性」と言いますが、私はこれに惚れ込んでいます。
Jsonの例
{
"name": "sample",
"data": [
1, 2, 3, 4, 5
]
}
Jsonは、中括弧(波括弧)と大括弧(角括弧)が出てきます。
これはデータを表現ための記法(文法)です。プログラムが書ける訳ではありません。
Clojureの例
(defn json-response [ str, array ]
{ :name str , :data array } )
(json-response "sample" '[ 1 2 3 4 5] )
Clojureはまるで Lisp + Jsonの様です。括弧も、中括弧も、大括弧も登場します。
そして、中括弧と、大括弧の使い方が、Jsonのそれと大変似ているのです。
中括弧と大括弧を組み込んだにも関わらず、「同図像性」は保たれています。大変素晴らしい。
設計者の Rich Hickey さんは、天才だと思います。
ソース公開場所
ソースはgithubに公開しました。
https://github.com/masa-oss/iris
自分でコンパイルしてみたり、ちょっと改造して遊んでいただけると嬉しい。
感想
簡単と言っておきながら、そこそこのJavaのソース量になってしまった。
簡単と言っているのは、Common Lisp や Clojureと比べてなのでご容赦ください。
Javaで書いていて、NetBeansのデバッガーが使えるのは、とても嬉しい。
これだけでも、教育用※と言って良いだろう。
※インタープリタを作った事がない人が、自習する教材としても使えるだろう。
また、このインタープリタを作ってみて、Clojureへの理解が、少し深まった。
varやnamespaceへの理解も深まった。
nsマクロやら、ライブラリのロード周りは、結構ややこしい。