プログラミング言語を自作しました(mrubyによるLISPの実装)
昔から言語処理系に興味があったのですが、言語として作り上げた事がなかったというのと、「いつかやりたい」のまま一生を終えそうな危機感があったので自作をはじめました。
とは言え一から言語仕様を設計するようなアイデアも持ってなかったので、LISPを作ることにしました。
(プログラマは一度はLISPを実装すると言いますし)
成果物
mrubyで実装したLISPなので、mrispという名前にしました。
実装について
このmal、ドキュメントにLISPの実装のための解説が書いてあり実際に多くの言語で開発されていて、リポジトリ内に各言語のソースも含まれています。
ドキュメントを読んだだけでよく分からなかったりしても、実際に動く実装が読めるので非常に参考になります。
成果物を公開するにあたってワンバイナリで配布したかったので、mruby化とソースコードをファイルから読み込んで実行出来るようにちょっといじっています。
使い方
次のURLから、OSにあったファイルをDLしてください。
(現在、Mac版のみバイナリを配布しています)
Mac版: osx.tgz
解凍して出来たファイルを、PATHの通ったフォルダへ置いてください。
REPL
$ mrisp
で起動して、REPLが使えます。
だいたい、以下のような機能が使えるところまで実装しました。
四則演算
code:repl
user> (+ 1 2)
3
user> (* 3 (+ 2 5))
21
変数定義
code:repl
user> (def! a 10)
10
user> (def! b 20)
20
user> (+ a b)
30
無名関数
code:repl
user> ((fn* a b (- a b)) 100 50) 50
無名関数と変数定義の組み合わせで、関数定義
code:repl
user> (def! minus (fn* a b (- a b))) user> (minus 300 125)
175
ファイルから読み込んで実行
ソースコードをファイルに書いて、それを実行することも出来ます。
ソースコードを用意します。
(以下のように、関数に名前をつけておけば再帰呼び出しも可能です)
code:test.lisp
(def! sum
(if (<= a 0)
0
(+ a (sum (- a 1)))
)
)
)
(prn (sum 10))
$ mrisp test.lisp
55
今後やりたいこと
mapやfoldを作ればもうちょっと色々とプログラムが作れるようになるので作ろうと思います。(現状の機能があれば、LISP側で実装できる気がするので、LISPで作って組み込んでおくみたいにするかも)
最終的に、自分で自分を実装するところまで行くようです。
プログラミング言語処理系に興味がある人は、自分の一番得意な言語で挑戦してみるといいと思います。step3くらいまでだけでも、動くようになるととても楽しいですよ。