Skip to content

相談:returnを含むifやevalの扱いについて #276

@FineArchs

Description

@FineArchs

#237 (comment) で言われているとおり、現状だと

@fff() {
  let a = eval {
    return 1
  }
  <: a // return<null>

  let b = if true {
    return 1
  }
  <: b // return<null>
}

のようなプログラムで見られるように、return(及びbreak・continue)を含むifやevalブロックが値を返す時の動作が未定義であり、意図しない挙動(returnのラッパーが取り出せる)が発生してしまいます。

考えられる新しい仕様として、

  • 値を返す・返さない関係なく、return系は現在のスコープを破棄し親スコープに処理を移動する
  • 値を返す・返さない関係なく、if/eval中で使われたreturnはif/evalの返り値になる(break・continueはエラー?)
  • if/evalが値を返す場合のみ、if/eval中で使われたreturnはif/evalの返り値になる(break・continueはエラー?)
  • if/evalが値を返す場合のみ、if/eval中でreturn(及びbreak・continue)が使用されたときエラーにする
    などが挙げられます。

私自身は最後の案で考えていますが、よければご意見をお願いします。

Metadata

Metadata

Assignees

Labels

bugSomething isn't working

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions