2026/11/9(日)

自作言語に型を実装しているのだが、思っていたほど簡単ではない。まず当然だが、変数の型は文脈を保持しないと決定しようがない。変数を定義するごとに文脈に変更を加えて状態保持する必要がある。そしてスコープを管理する必要があり、スコープを外れたときに文脈から変数を取り除かなければならない。またvar.propのような構造体アクセスは、ドット演算子の右だけ独立に型を決定することはできない。演算子の左辺を見てそれを踏まえて式の型を決定する必要があるし、また構造体定義も文脈に保持しなければならない。

意外だった点として、関数呼び出しはそこまで特別扱いする必要はなさそうだった。もちろん関数というオブジェクトは変数同様文脈に保持しないといけないのだが、例えばconcat("hello", "world")というコードがあったとして、concatという部分は単体で型を付けられる。concatというノードが型(str, str)->strという関数型を持っていることが分かれば、( (str, str)->str, (str, str) ) -> strという変換は文脈抜きで型を見るだけでできる。関数呼び出しだけでなく配列アクセスも同様だ。したがって、本質的に文脈を利用する必要があるのは「オブジェクト定義」「オブジェクトアクセス」「構造体定義」「構造体アクセス」の4通りだけだと思われる。…たぶん。

あと必要なのは代入可能・不可能の管理。例えばaは代入可能だがa+bは代入不能な式だ。これは代入可能・不能の2択でよいのでそこまで難しくないと思われる。実装を進めたら話が変わってくる可能性はあるが。

Categories: