Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

docsと同じ型注釈を実際に行えるようにする #856

Open
takejohn opened this issue Nov 17, 2024 · 5 comments · May be fixed by #870
Open

docsと同じ型注釈を実際に行えるようにする #856

takejohn opened this issue Nov 17, 2024 · 5 comments · May be fixed by #870
Assignees

Comments

@takejohn
Copy link
Contributor

takejohn commented Nov 17, 2024

docsに書いてある型注釈が、実際のAiScriptで表記できなかったり表記法が違ったりするので、
docsを変えるか、実際にdocsのような型注釈をできるようにしたい。

ジェネリクス

docsにはジェネリクスの型引数としてvalueが導入されている。
ジェネリクスの型注釈を実装して、docsも同様の表記法に変更したい。
例:

@f<T>(v: T): T { v }
let a: str = f<str>("a")
let b: num = f(12) // 呼び出し時は型引数を省略可能

ユニオン型

docsにnum | null, str | null, value | nullがあるが、実際にはそのような型注釈はできない。
ユニオン型の型注釈を実装したい。

関数型

docsには@(name: type) { type }のような形式になっているが、実際には@(type) => typeの形式である。
docsの表記を実際の型注釈の表記に合わせたい。

fn

docsに記載があるが、実際には型注釈として使えない。
docsの表記を具体的な型に変更したい。

error, never

これらもdocsに記載があるが、実際には型注釈として使えない。
実際に型注釈として使えるようにしたい。

@takejohn takejohn self-assigned this Nov 17, 2024
@takejohn
Copy link
Contributor Author

型エイリアス💭

@(v: arr).reduce(func: Callback, initial: value): value

Callback: @(acm: value, item: value, index: num): value
https://github.com/aiscript-dev/aiscript/blob/master/docs/builtin-props.md#v-arrreducefunc-callback-initial-value-value

現在予約語となっているusingを使って型エイリアスを定義できるようにする?

using Callback<T> = @(T, T, num) => T
@reduce<T>(v: arr<T>, func: Callback<T>, initial: T): T {
    v.reduce(func, initial)
}
let add: Callback = @(a, b) { a + b }
<: reduce([1, 2, 3], add, 0) // => 6

関数の引数や返値の型は局所的な型エイリアスもできるようにする?

@reduce<T>(v: arr<T>, func: Callback, initial: T): T
using Callback = @(T, T, num) => T
{
    v.reduce(func, initial)
}
// 関数の外では型名Callbackは使用できない
let add: Callback = @(a, b) { a + b } // エラー

Related?

@takejohn
Copy link
Contributor Author

takejohn commented Dec 2, 2024

ジェネリクスと比較演算子の構文には曖昧性があるんだった……。
f<num, str>(4)が型引数を明示した関数呼び出しとしたいけど、以下のようなコードは現行文法で合法。

let f = 1
let num = 2
let str = 3
<: [f<num, str>(4)] // [true, false]

関数呼び出しでの型引数指定の文法をAiScriptに導入すると今まで動いたコードが動かなくなる破壊的変更になってしまう。
関数呼び出しでの型引数指定は導入せず、関数の引数や返値の型を明示したいときは一旦変数に代入することにしよう。

@from_json<T>(json: str): T { Json:parse(json) }
let a: num = from_json('42')

@salano-ym
Copy link
Member

他言語の関数呼び出しの型引数指定で使われている記号

  • f[T](arg)
    インデックスとの区別は意味論でする必要がある
    例: Scala,Go,Nim
  • f::<T>(arg)
    今の所、構文的にも意味的にも一意か。型引数に比較式が来ないなら問題なし
    例: Rust
  • f!(T)(arg)
    構文意味的に一意。丸括弧が続いて見辛い?
    例: D

@takejohn
Copy link
Contributor Author

takejohn commented Dec 2, 2024

RustのturbofishはAiScriptの名前空間の雰囲気に合わせるとf:<T>(arg)かな

Javaはメソッド名の前に型引数を書くみたい: this.<T>f(arg)
Javaだとこういうときにthisを省略できないけど、<T>f(arg)みたいに型引数を前置すると構文に曖昧性がなくなる。
TypeScriptの型キャストの構文と似通ってるけど……

@takejohn
Copy link
Contributor Author

takejohn commented Dec 2, 2024

現状arr<T>のように型名の型引数に山括弧を使ってしまっているから、山括弧以外の括弧は統一感がないかも

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging a pull request may close this issue.

2 participants