Skip to content

ブロックにラベルを付けて指定したブロックから脱出できるようにする #840

@takejohn

Description

@takejohn

#276 (comment) で言及されている、Common Lispでいうreturn-fromのように、ブロックにラベルを付けて指定されたブロックから脱出できる構文を追加したい。

前提issue

以下のissueが解決されることが前提

構文案

  • ラベルを付けたいブロック(eval, if, match, loop, for, each)の前に#のような記号, ラベル名, :を前置する。(#label: eval { ... })
    • 記号を前置するのはreturn文で値とラベルを区別したり解析を楽にするため
    • :はいらないかも(#label eval { ... })?
  • ラベルは変数と別の名前空間(ラベルと変数で同じ名前が使用されてもエラーが出ないよう)にするが、予約語の使用を禁止する。
    • ただし、fn, eval, if, match, loopは例外で、定義はできないが参照はできる。
  • ラベルfn, eval, if, match, loopはそれぞれ最も内側の関数、eval式、if式、match式、ループ構文(loop, for, eachを含む)を指す。
  • ラベルが省略されたreturn vreturn #fn vcontinuecontinue #loopbreakbreak #loopと同等に扱う。
  • return文で脱出されたブロックの評価値はreturn文に指定された値となる。
  • break文で脱出されたブロックの評価値はnullとなる。
  • continueの参照するラベルがループ構文を指していないと文法エラーになる。
#label: loop {
    break #label
}

@f() {
    let a = eval {
        return #eval 1
    }
    return a + 1
}
<: f() // => 2

@g() #label: {
    [1, 3, -2].map(@(v) {
        if v < 0 { return #label null } else { `{v}` }
    })
}
<: g() // => null

Metadata

Metadata

Assignees

Labels

enhancementNew feature or request

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions