未定義の変数ルックアップをもっとはやくエラーに
Xtalは未定義の変数に遭遇した場合、filelocalから同名のメンバを探し、あったらそれを使い、なかったらエラーとする仕様です。
fun foo(){ // filelocal::boo.p;と同じ // しかし、filelocal::booは存在しない boo.p; } foo(); // 未定義の変数参照エラーが発生する。
本当はこれをコンパイルエラーにしたいところですが、
実行時にfilelocalのメンバが動的に増える可能性もあるので、そうするのは難しいのです。
他の動的言語も大体同様で、未定義の変数を参照している関数が呼び出されるまでエラーになりません。*1
前からこの動作は問題視しておりました。
奥深くにある関数で、スペルミスがあるたびにいちいち
修正→その関数まで実行→修正→その関数まで実行…を繰り返すのが面倒だからです。
自分はスペルミスが多すぎるので顕著です。
そこで、これを早期発見するcheck_implicit_lookup関数を追加しました。
check_implicit_lookup関数は、呼び出した時点でfilelocalに定義されているメンバと、そのソースで参照されている変数名をつき合わせ、未定義変数参照があったらそこでエラーとしてくれます。
inherit(math); //filelocalにmathを継承させる // filelocalへの変更が終了したら呼び出す。 check_implicit_lookup(); fun foo(){ abs(10).p; abbs(20).p; abababa.p; } // lib::builtin::RuntimeError: 暗黙の変数参照があります。[abbs(7), abababa(8)]
このように、7行目と8行目に未定義の変数参照があることを教えてくれます。