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

エラー型による条件分岐をやりやすくする #403

Open
FineArchs opened this issue Oct 11, 2023 · 11 comments
Open

エラー型による条件分岐をやりやすくする #403

FineArchs opened this issue Oct 11, 2023 · 11 comments
Labels
enhancement New feature or request

Comments

@FineArchs
Copy link
Member

毎回if Core:type(v)!='error' ...と書かなければならないのは不便なので、より簡単な書き方を考えます。

今までの案
catch(v) {...}

  • 投げてないのにcatchはおかしい

if Core:is_ok(v) ...

  • あまり書きやすさが変わっていない?

補足
v ?? v2(vがエラー型以外ならv、エラー型ならv2を返す)、?.(エラー型ならチェーンしない?)も欲しい

@FineArchs
Copy link
Member Author

if Is:ok(v) ... とか…?

@marihachi
Copy link
Contributor

ifによる値のチェックとは区別して

if v is error { ... }

とか...?

@salano-ym
Copy link
Member

Core:type(v) == Tv is Tにする?

@FineArchs
Copy link
Member Author

Core:type(v) == Tv is Tにする?

同意見

@salano-ym
Copy link
Member

isnotは必要?

@FineArchs
Copy link
Member Author

どちらかと言うと型表記の方に補集合を表す表記方が欲しいような?

@marihachi marihachi added this to the AiScript Next milestone Oct 15, 2023
@marihachi marihachi removed this from the AiScript Next (2023) milestone Oct 20, 2023
@salano-ym salano-ym added the enhancement New feature or request label Feb 17, 2024
@takejohn
Copy link
Contributor

takejohn commented Nov 3, 2024

Rustの?みたいにエラーならそれをreturnする演算子が欲しいかも……

@f() {
  let v = ...
  v?.something // vがエラーならvを返し、そうでなければプロパティを評価
}

// トップレベルの場合
let v = ...
v? // vがエラーならCore:abort(v.name)

標準関数を追加するならこう?(大して楽にならないかも)

Error:is(v) // vがエラーならtrue、そうでなければfalseを返す
Error:and(v, v2) // vがエラーならv2、そうでなければvを返す
Error:and_then(v, @(err) { ... }) // vがエラーなら関数を引数vで呼び出してその返値を返し、そうでなければvを返す

@FineArchs
Copy link
Member Author

?はこれまた欲しいと言われているJavaScript流のオプショナルチェーン(?.)と文法的に衝突するんですよね…

@takejohn
Copy link
Contributor

takejohn commented Nov 3, 2024

?.と書いてエラーが出たときに、

  • エラーを呼び出し元に再送出するか
  • エラーを式の評価値とするか

どちらの記法のほうが平均的なコードが簡単になるんでしょうね……

前者にした場合、後者のv?.propの代わりにError:or_else(v, @(v) { v.prop })あるいは@(){ v?.prop }()
後者にした場合、前者のv?の代わりにif v is error { return v }
みたいな書き方になるのかな

それか??.も導入(?.を優先してトークナイズ)してv? .v2あるいは(v?).v2みたいに書かせるとか……
これは文法がややこしくなりそうですけど

@takejohn
Copy link
Contributor

takejohn commented Nov 3, 2024

#237 はbug扱いになっているのでそっちを優先的に着手したいですね

@FineArchs
Copy link
Member Author

あと今のReturnをラッパーで包む実装方法だと中途returnの実装がかなり面倒になりそうな気がするんですよね
(この辺りはreturnの実装の方を変えるべきな気もします)

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

No branches or pull requests

4 participants