意味解析時の型チェックと型推論
お試しで実装してみる
オッ
主にWebAssemblyのコンパイル(#98 )で必要になりそう。 インタプリタで実行する場合でも、実行時ではなく事前の型チェック機能とかに応用できる。
一部実装した。 https://github.com/syuilo/aiscript/tree/work/static-analysis-1
readlineの戻り値の型をどうするか考え中。
readlineはホスト側が標準入力に対応していなければnullを返すため、TypeScriptでいう戻り値の型はstring | nullになっている。今はUnion型に対応していないし、対応する方針にあるのかも決まってないと思う。
また、対応するにしてもユーザーに要求する型システムの知識は高度になる。
ちなみに、C#では操作が非対応の場合は例外を投げることで、非対応操作でnullなどを返さずに戻り値を1種類に保っている。
配列の型を要素ごとに変えることができるかどうかも検討点だと思う。 スクリプト言語だと、要素ごとでも良い気がするけどWebAssemblyなど他の処理系コードにコンパイルするとなると話は変わってくる。(WebAssemblyでは配列の要素毎に別の型のデータを入れる方法があるのか?等。この辺の仕様も調べる必要があるかも)
案
- インタプリタ実行時は要素ごとに型を変えられる & コンパイル時は型を一種類にしないとエラーにする
- 配列には1種類の型の値しか含められないようにする
オブジェクトの型ってどうなる?
複数の型の要素を持つ配列を作成したいケースまずない気がするし配列には1種類の型の値しか含められないようにするで良いんじゃないかな
オブジェクトの型ってどうなる?
どうだろう、まだ考え中 (一旦はany型として扱って意味解析処理をスキップしてる)
- #142
複数の型の要素を持つ配列を作成したいケースまずない気がするし配列には1種類の型の値しか含められないようにするで良いんじゃないかな
YOSASOU テストに、配列に別の型の値を入れているものがあったからそれは変更する必要があるかも(SKIってテスト)。
インタプリタのScopeクラスみたいな、変数の一覧を保持するものを一般的にシンボルテーブルと呼ぶらしい
https://ja.wikipedia.org/wiki/%E3%82%B7%E3%83%B3%E3%83%9C%E3%83%AB%E3%83%86%E3%83%BC%E3%83%96%E3%83%AB