3
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

簡単なLispインタープリタを作ってみた

Posted at

対象読者

(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マクロやら、ライブラリのロード周りは、結構ややこしい。

3
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?