-
Notifications
You must be signed in to change notification settings - Fork 39
Closed
Labels
enhancementNew feature or requestNew feature or request
Description
#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 vはreturn #fn v、continueはcontinue #loop、breakはbreak #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() // => nullFineArchs
Metadata
Metadata
Assignees
Labels
enhancementNew feature or requestNew feature or request