aiscript icon indicating copy to clipboard operation
aiscript copied to clipboard

型を明示的に宣言できるように

Open marihachi opened this issue 4 years ago • 3 comments

概要

明示的に型を宣言できるようにする。 型が明示されておらず推論できない場合はデフォルトの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型でない型にしていないとコンパイルできない。

marihachi avatar Aug 22 '21 07:08 marihachi

obj型の部分を書いた

marihachi avatar Sep 04 '21 09:09 marihachi

型エイリアス (内部向け)

推論などで型の互換性を判定する際に、Generic型と普通の型(Simple型と呼称)は別の扱いになる。 そのため、例えばarrarr<any>は互換性を持たせたいがGeneric型とSimple型なので普通に判定すると別の扱いにせざるを得ない。 そこで、型のエイリアスを導入する。 arr(objも同様)はGeneric型arr<T>と、型arr<any>へのエイリアスarrを定義する。 これにより、arrarr<T>両方をarr<T>として互換性判定することができる。

関連

arrarr<any>へのエイリアスにするかも これならarrと書かれた場合でも、simple型arrは存在しないがエイリアスで置き換えられるので、generic型arr<any>として扱うことができる

https://misskey.io/notes/8qkg25vtom

marihachi avatar Sep 12 '21 07:09 marihachi

一部実装した。

  • #146

marihachi avatar Sep 12 '21 13:09 marihachi