Stack Trace追加
2Dの開発は進んでいます。みんなもっと漏れを称えるべきだと思う。ということで、昨日のmultに対して、以下のようなInputを入れてみました。
my $ans = $f->{modules}->{mult}->call( Acme::ICFP2006::2D::Exp->new("Inl (Inl (), Inr ())"), toIntExp($b));
これに対するエラーメッセージは以下の通り。
Error occured at Module mult for input W: Inl (Inl (), Inr ()) N: Inl Inl Inl Inl Inr () Use Cannot end at Box (Line 33, char 28) for Input W:Inl (Inl (), Inr ()) N:Inl Inl Inl Inr () Error occured at Module mult for input W: Inl (Inl (), Inr ()) N: Inl Inl Inl Inr () Use Cannot end at Box (Line 33, char 28) for Input W:Inl (Inl (), Inr ()) N:Inl Inl Inr () Error occured at Module mult for input W: Inl (Inl (), Inr ()) N: Inl Inl Inr () Use Cannot end at Box (Line 33, char 28) for Input W:Inl (Inl (), Inr ()) N:Inl Inr () Error occured at Module mult for input W: Inl (Inl (), Inr ()) N: Inl Inr () Use Cannot end at Box (Line 33, char 43) for Input W:Inr () N:Inl (Inl (), Inr ()) Error occured at Module plus for input W: Inr () N: Inl (Inl (), Inr ()) Use Cannot end at Box (Line 13, char 38) for Input W:Inr () N:(Inl (), Inr ()) Error occured at Module plus for input W: Inr () N: (Inl (), Inr ()) Irregal Input[Not list] at Box (Line 8, char 35) ( N:(Inl (), Inr ())
うわー読みにくいw。とはいえ、こうしないとどうしようもないのもまた事実。
さて、今後の課題についていくつか。まず通常のTraceをどのようにするか、という点。どのBoxがどういう入力で発火したか、ということについての表示は出来るのだけれども、どの段階まで表示すればいいのか、という問題。Traceするべき再帰呼び出しの深さを引数として与えるというのが一番よさそうだけれども。
次にある問題としては、ModuleのOutputがない場合をエラーにするべきかどうか、という問題。通常、Moduleが発火したのに出力がないのはバグであることが多い。であれば、それをエラーにするべきだろうと考え、現状はエラーとなっている。が、全てのModuleがそうであるとは限らない。これについては、各Moduleに対して指定を行うべきなのだけれども、どうすればいいのだろうか。Moduleの名前に規則をつけるというのはありだと思う。例えば大文字で始まっていれば出力が無くても良い、など。
こういう風にしておいて欲しい、という要望があればなるべく聞きますので書き込んでください。LLRingが終わったあたりで公開するつもりです。