aiscript
aiscript copied to clipboard
型を明示的に宣言できるように
概要
明示的に型を宣言できるようにする。 型が明示されておらず推論できない場合はデフォルトのany型が使用される。
関連
- #138
- #145
型の一覧
- str
- num
- bool
- arr
- obj
- null
- fn
特殊な型:
- any : 何でも型。実行時に解釈される。
- void : fn型の戻り値の型としてのみ使用可能。関数から何も返されないことを示す。
arr型
arr<T>
- 要素の型を1つだけ指定できる。
- 中身の型がanyの場合は要素として何でも入れられる。
表記例
arr<num>
fn型
@(T1 T2 ...) => R
- Tn : 引数の型
- R : 戻り値の型
表記例
@(num num) => bool
関連
- #139
any型
- 型チェックの処理はスキップされる。
- コンパイル先の言語によってはエラーになる場合がある。
関数:
- 関数の引数で型を明示しない場合に使用される。
配列:
- (問題) 型が明示された配列にany型の値を代入する操作が含まれると、配列の型が曖昧になる
obj型
obj<T>
- key-value型のマップ。値は全て参照として持つ。
- 値には型を1つだけ指定できる。省略した場合はanyになる。
- インタプリタでは内部表現にMapを使用。
- コンパイルされたコードでは内部表現にハッシュテーブルを使用。
WebAssmeblyへのコンパイル (#98)
各変数や関数は、明示的な宣言または型推論のどちらかを用いて、any型でない型にしていないとコンパイルできない。
obj型の部分を書いた
型エイリアス (内部向け)
推論などで型の互換性を判定する際に、Generic型と普通の型(Simple型と呼称)は別の扱いになる。
そのため、例えばarrとarr<any>は互換性を持たせたいがGeneric型とSimple型なので普通に判定すると別の扱いにせざるを得ない。
そこで、型のエイリアスを導入する。
arr(objも同様)はGeneric型arr<T>と、型arr<any>へのエイリアスarrを定義する。
これにより、arrとarr<T>両方をarr<T>として互換性判定することができる。
関連
型
arrをarr<any>へのエイリアスにするかも これならarrと書かれた場合でも、simple型arrは存在しないがエイリアスで置き換えられるので、generic型arr<any>として扱うことができる
https://misskey.io/notes/8qkg25vtom
一部実装した。
- #146