aiscript
aiscript copied to clipboard
🔋 A lightweight scripting language runing on JavaScript
以下のようなコードが通ってしまうが、ほぼミスなのでパースの段階でエラーが出てほしい ```js { hoge: 0, hoge: 1 } ```
## 目的 オブジェクトリテラルのプロパティ名に予約語も書けるようにしたい ## 現状 Misskeyの拡張APIにおいて、`Ui:C:textInput`関数などの引数のプロパティに`default`があるが、 AiScriptがバージョン1.0.0になると`default`が予約語となるため、既存のコードが動かなくなってしまう懸念がある。 例えば、Misskey Playだとこういうコードが動くが、 1.0.0になると`Syntax: unexpected token: DefaultKeyword`のエラーになる。 ```js /// @ 0.19.0 Ui:render([ Ui:C:textInput({ default: 'text', }) ]) ``` ## 解決策 オブジェクトリテラルのキー名に予約語を使えるようになる。 JSON5の識別子(=ECMAScriptにおけるIdentifierName)では、一部の非ASCII文字・$・Unicodeエスケープシーケンス・予約語も使えるため、それに準拠してみる。 JSON5Identifier: https://spec.json5.org/#prod-JSON5Identifier
冗長な条件分岐や`as`, `!`のアサーションが多すぎる
Temporal windowというのは、見えているスコープの中で直近にdefineされた変数を指す方式のこと。 ref. https://zenn.dev/qnighy/articles/f3d2d7adc75948 現状のインタプリタはTemporal windowであり、これは実行時に識別子がどの変数を指すかが変わってしまう。 具体的には以下のようなコードで、関数を呼び出すタイミングによって参照する変数が変わる。 ```js let hoge = 0 eval { @f() { hoge }
`utils.valToJs`関数にerror型を渡すと`Unrecognized value type: error`のエラーが出る。 `Json:stringify`関数の処理は`utils.valToJs`を呼び出すのでerror型を含む値を渡すとプログラムが終了してしまう。 ```js Json:stringify(Error:create('message')) // Unrecognized value type: error ``` ドキュメンテーションサイトのプレイグラウンドでもerror型の値を出力しようとするとエラーになる: https://aiscript-dev.github.io/ja/playground.html#N4Igxg9gJgpiBcIA88AEBRATpin5kxgEMAXGACgHIBbGAZzqIHMZKBKEAXyA (このリポジトリのプレイグラウンドでは`utils.valToString`関数を使用しているのでエラーにはならない)
https://github.com/aiscript-dev/aiscript/pull/278#issuecomment-1566320416 によると、JavascriptのErrorの生成にはスタックトレース収集などのコストがあると考えられるらしい AiScript上のエラーにJavascript上のスタックトレースの情報は特に必要ないと思われるため、Errorを引き継がなくてもいいのでは?
渡し忘れ防止のため、引数やプロパティを省略できないようにする。 `function(param?: T) {}` -> `function(param: T | undefined) {}` `class C {prop?: T}` -> `class C {prop: T | undefined}`