拡張機能導入方針
まず、どうしても外せないものとして、Hook機能の追加がある。これはどういうものかといえば、動的型チェックに当たるものであって、例えばIntegerの足し算であれば二つの引数はIntegerで、返り値もIntegerであるべきであるが、当然のことながら間違って動作することは良くある。で、間違った場合に即座に気づけるなら良いのだけれども、こういう問題は大体その後しばらくしてから何重にも再帰された後でErrorとなる。ので、Stackのトレースをしたところで大体最後の方は全く意味を成さないものになってしまう。で、結局どこが間違っているのかわからないということになる。
そこで、以下のようなメソッドを作ると、良いのではないか。
$f->{modules}->{plus}->addHook("N", \&isInt); $f->{modules}->{plus}->addHook("W", \&isInt); $f->{modules}->{plus}->addHook("E", \&isInt); #error $f->{modules}->{plus}->call( Acme::ICFP2006::2D::Exp->new("Inl Inr Inl Inr ()"), Acme::ICFP2006::2D::Exp->new("Inl Inl Inr ()"), ); sub isInt{ my $exp = shift; if($exp->{type} ne "list"){ return 0; } if($exp->{car} eq "Inr"){ if($exp->{cdr}->{type} eq "null"){ return 1; } return 0; } return isInt($exp->{cdr}); }
それからもう一つの方針として、静的なエラーチェックの追加を行いたいと思う。つまりは、Edgeのつながり方から、おかしな文法を取り除くという処理である。そもそもこの機能が欲しくて作っている部分もあるので、これくらいは導入したい。