-
Notifications
You must be signed in to change notification settings - Fork 34
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
相談:returnを含むifやevalの扱いについて #276
Comments
個人的には(私の理解が正しければ) 値を返す・返さない関係なく、if/eval中で使われたreturnはif/evalの返り値になる(break・continueはエラー?) が自然かと思いました |
if式に関しては値を取り出すかどうかで挙動が変わるのは一貫性が無いかも?と思ったけどevalも値を取り出さないと関数自体抜け出すのね |
@syuilo
のような冒頭での脱出が出来なくなるのが少し不便だと思います。
のように書き換えられるので、致命的にはならないと思いますが… |
あー |
とすると 値を返す・返さない関係なく、return系は現在のスコープを破棄し親スコープに処理を移動する かな |
@saki-lere
のように、取り出された値をスコープ直下で呼び出すとreturn文のように機能するようになっていたと思います。 |
@syuilo
が関数抜け出しを意図していることはほぼなく、if/evalの値として返るものと期待(勘違い)されていると思われるので、意図しない挙動を防ぐためエラーを出すのが良いと考えています。 また、現状のreturnの実装は一律関数抜け出しとかなり相性が悪いように感じられます。 |
if の返り値を使うような関数型言語のスタイルの書き方ではあまりreturnは使われないので、そのような場面で使われるreturnはプログラマーの誤解の可能性が高く構文エラーにするというのは一理はあるが、 なので、returnの実装は一律関数抜け出しとするほうがよいと私は考えます。 (蛇足ですが、関数型言語の立場からは、Common Lisp でいう return-from (どこの関数のスコープまで戻るか構文で指定する)構文まで用意すれば、map に渡した匿名関数などからも抜け出せるので一部の人は使うかも) |
このインタプリタは、構文木のどこをいま評価しているのかの情報をJavaScriptのコールスタックの中にもつ実装なので、 |
@yuriha-chan さんの言うような使い方をする人がいるのであれば、やはり一律関数抜け出しの方が良さそうですね。そちらの方向で進めてみます。 |
個人的にreturnは常に関数に対して適用するでいいと思いました |
@marihachi 一度それで実装しようとしたのですが、いい実装が思いつかなく二の足を踏んでいます… |
#237 (comment) で言われているとおり、現状だと
のようなプログラムで見られるように、return(及びbreak・continue)を含むifやevalブロックが値を返す時の動作が未定義であり、意図しない挙動(returnのラッパーが取り出せる)が発生してしまいます。
考えられる新しい仕様として、
などが挙げられます。
私自身は最後の案で考えていますが、よければご意見をお願いします。
The text was updated successfully, but these errors were encountered: