-
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
ブロックにラベルを付けて指定したブロックから脱出できるようにする #840
Comments
関数の中から外へジャンプするのは静的に整合性を解析できないから実装できなさそう @f() {
return #label null // どこの#label?
}
#label: eval {
f()
}
let a = eval {
break #eval 1
} 繰り返し処理も式にしたら使うことがあるかも? let a = [1, 3, -2]
let b = each let e, a {
if (b < 0) break e
}
<: b // => -2 |
breakでループ式から値を返せるというのは面白いですね。 ラベル付きreturnの静的な整合性解析は、恐らく出来ないこともないとは思います。 |
#90 があったわ |
ループ構文を式にして、breakが値を返すようにすると for 1 break + 1 が for 1 {
break +1
} なのか (for 1 { break }) + 1 なのかわからない問題…… |
今のパーサだと (for 1 { break }) + 1 で読まれそう?そういう仕様にしちゃってもいいかも知れない |
いや先読みするから |
if false 1 + 1 が ひょっとすると |
do break while false
// ^
// このwhileはdo-while式
// do { break } while false
do break while false break while false
// ^
// このwhileはbreakが返すwhile式
// do { break (while false { break })} while false これはパースが地獄になりそう |
もうbreak文の構文は Break = "break" ["#" IDENT Expr] にするか |
逆に式を返すならラベル必須にもなる? |
そうですね とか考えてたらやっぱりbreakは値を返さないようにしてreturnを値を返すbreakとしても使えるようにするのがいいかもしれない…… |
|
その場合 |
今更で申し訳ないんですが、文法の厳格化はユーザー離れを引き起こすイメージがあるんですよね。なので個人的には慎重になりたい。 |
波括弧の必須化やbreakが値を返す構文の実装は見送るか |
breakが返す値には括弧必須にするとか…? |
この視点で言うなら、「 |
|
ただ |
そういうのはLinterやFormatterを作ってそっちに任せるべきだと思います。 |
と書いたときに表示されるエラーが
aiscriptの用途的に外部ツールの使用を期待するのがいいとはあまり思いません。 |
do-whileについては0.19.0になかった構文だし括弧必須化しても影響は大きくない気がする |
確かに |
ループ構文を式にするのはやめて、 do break while false
// do { break } while false
#label: eval { do break #label eval { while false break } while false }
// #label: eval { do { break #label (eval { while false break }) } while false } |
evalは覚えてないですが、ifとmatchはそもそもbreakに反応しないはずです( |
分かりづらくてすみません |
そうすると後でループ式も値を返せるようにしたくなった時に let v = while (true) {
if cond break value`
} のようなことができなくなって困ると思います。 |
私の案ではeval式からのbreakはラベルの指定が必須なので、その問題はないと思います |
現状の構文案をまとめるとこんな感じです。
このissueの説明に書いた以下の内容は実装が複雑になりそうだったので抜きました。
|
追加:
|
#276 (comment) で言及されている、Common Lispでいうreturn-fromのように、ブロックにラベルを付けて指定されたブロックから脱出できる構文を追加したい。
前提issue
以下のissueが解決されることが前提
構文案
#
のような記号, ラベル名,:
を前置する。(#label: eval { ... }
):
はいらないかも(#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
と同等に扱う。The text was updated successfully, but these errors were encountered: