■
生まれて初めてプログラミング言語を作ってみました(実装はOCaml)。
http://github.com/komamitsu/toysauce
個人的な練習というか思い出作りが主な目的なので、おもちゃ的なもので実用性は皆無です。とりあえず、フィボナッチ数を求める再帰関数が動けば満足的な。
最初はCとかPerlぽいイメージだったのですが、最終的には関数型言語の色が強くなってしまい自分でもすこしびっくり(あ、個人的な感覚からするとPerlは意外と関数型かも)。
例えば、こんな感じのスクリプトを書いて…
$ cat sample.ts func fib(i) { if (i <= 1) { i; } else { fib(i - 2) + fib(i - 1); }; }; func print_fib(i) { puts(fib(i)); }; func each(f, l) { len = length(l); func loop(n, i) { if (n > i) { f(nth(l, i)); loop(n, (i + 1)); } else { ; }; }; loop(len, 0); }; puts("fib - start"); puts(fib(6)); puts("fib - end"); puts("each#1 - start"); each(print_fib, [0, 1, 2, 3, 4, 5, 6]); puts("each#1 - end"); puts("each#2 - start"); each( func (f) { puts(f(1, 2, 3)); }, [ func (a, b, c) { a + b + c; }, func (a, b, c) { a + b * c; }, func (a, b, c) { a * b * c; } ]); puts("each#2 - end");
実行させると、以下のような出力になります。
$ ./toysauce sample.ts fib - start 8 fib - end each#1 - start 0 1 1 2 3 5 8 each#1 - end each#2 - start 6 7 6 each#2 - end
全部、式にしてしまった上にセミコロン区切りなので、if-elseとか関数定義の最後にセミコロンが要るというキモい構文になってしまいました。だが、それがいい。
セミコロン区切りは外せそうなので外したいとか、ifのみelse無しの構文が欲しいとか、実行時例外のために構文木に行番号とかを埋め込みたいとか、気になるところは色々あるのですが、少し飽きてきたので、数ヶ月寝かせておこうかなと考えています。あぁ、でも次は再帰下降パーザにも挑戦してみたい。
まぁ少しやってみたところ、自分でプログラミング言語を作るのは面倒だけど面白いなぁ、と思いましたよ。みんなどんどんやると良いです。
これは、爺さんになって暇になったら思う存分はまれて幸せ、とかそういう類の代物かなと思います。老後が楽しみ。