etolisp
Paul GrahamのANSI Common Lispを読んでいたらLispの処理系を作りたくなってきた。Consを作って構文木を組み立てて,式の評価をさせれば意外と簡単に実装できるような気がしたので。文法の違いはパーサが吸収してくれるので,同じ原理で色んな種類の言語が実装できそうだ。目標としては
- シンプルな実装*1
- Common Lisp 全機能のサポート
- C++のコンテナとの互換性
- C++のクラス,関数との互換性
- 他のアプリケーションへの組み込み
などを意識したものにしてみようかと。主にLispの勉強に主眼を置いているので「他の実装は一切見ないで作り上げる」という縛りも加えようと思う。そうやって,処理系を作り上げた暁には「僕はLispを理解してます」と声高らかに宣言できるはず。
今日はパーサを実装し終わって,シンボル名の解決も出来るようになった。
[yoda]~/src/etolisp> ./a.out "(setf a 2) (* 2 3 a)" #[6f48] "a" 2 Result = 2 #[6650] 2 3 "a" Result = 12
みたいなかんじ。Lispってとても美しい言語なので,実装していてとても楽しい。「なんかこの辺りの実装は汚いなあ」と思ったら,その部分は自分が言語の仕様を間違って理解していたところだったり。不思議な体験だ。
OSも30日で手作りできるようになったいま,これからは,エンジニアが名刺代わりにマイOSやマイ言語を交換しあう時代が来るんじゃなかろうかと,僕は予測する。
*1:他の実装と較べてどうこうではなくて,意識してます程度のノリ