未定義の変数ルックアップをもっとはやくエラーに

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行目に未定義の変数参照があることを教えてくれます。

*1:Luaなんかは、未定義の変数はnil扱いでスルーするので、エラーにもなりません