undefined variable エラーをRubyの例外システムの上に実装してみた
[Nendo]はせっかくRubyの上に構築している言語なので、エラー処理などもRubyの例外処理をそのまま使って実装してみた。 もちろん、バックトレースの情報にもエラーが起きた行番号を埋めこむ処理も入れた。 以下は、nendo処理系の動作結果 ( rubyExp=«< »> という部分はトランスレートされた後のRubyコードをデバッグ表示したもの )
xという変数はどこにも束縛されていない(未定義)のためエラーとなる。 Rubyの例外システムをそのまま使っている。
$ ./nendo
nendo> x
rubyExp=<<< begin x ; rescue NameError => __e ; __e.set_backtrace( *"(stdin):1"* + __e.backtrace ) ; raise __e ; end >>>
undefined local variable or method `x' for #<Evaluator:0x75904>
from (stdin):1
from (stdin):1:in `initialize'
from ./nendo.rb:433:in `initialize'
from ./nendo.rb:871:in `new'
from ./nendo.rb:871:in `initialize'
from ./nendo:10:in `new'
from ./nendo:10:in `main'
from ./nendo:19
xを束縛する
nendo> (define x 1)
rubyExp=<<< x = 1 >>>
1
その後は例外が発生しない
nendo> x
rubyExp=<<< begin x ; rescue NameError => __e ; __e.set_backtrace( *"(stdin):3"* + __e.backtrace ) ; raise __e ; end >>>
1
できれば、このままあらゆるエラー処理をRubyの例外に載せることができればいいのだけど… やってみないと分からないというのが正直なところ。 たぶん誰かは既に同じ様なことをやってみてるんだろうなぁ。 でも、そういう、順を追って問題にぶつかりながら解決策を考えるのも、オレ言語を実装する楽しみの一つだと分かってきた。 オレ言語はいろんな事を考えるキッカケを与えて来れる良い学習方法だと思う。
まだまだ、Matz氏のいう『コンピュータサイエンスの総合芸術』という域まで達していないけど、多くの事を同時に考えてバランスを取る大変さが分かって来た気がするぞ。 まつもとゆきひろのハッカーズライフ:第7回 言語の重要性その2 (2/2) - ITmedia エンタープライズ しかし、自分言語を作ることで何かメリットがあるのでしょうか? ええ、あるんです。 1つ目のメリットは、言語処理系というものがプログラミングの中でしばしば 登場するテクニックの集合体であることです。例えば、設定ファイルを読み込 むルーチンなどは、言語処理系の字句解析、構文解析そのものです。また、言 語処理系はコンピュータサイエンスの総合芸術ですから、処理系を実装するた めに用いたテクニックはあらゆるプログラミングに応用できます。 また、良い言語をデザインしようという行為は、人間の気持ちをより深く考 えることでもあります。つまり、インタフェースのあるべき姿について、よ り深い考察を行うことでもあるわけです。自分言語を作る2つ目のメリットと しては、言語レベルでの使い勝手を考えることで、プログラムの使い勝手に 関するより深い経験と知識を身に着けられることがありそうです。