Shiika/whileの実装
単純にif+再帰に直せると思っていた
が、while内でreturnしている場合に対応できないことに気づいた
code:sk
def foo(x) -> Int
a
while cond; b; end
c
return d
end
# 展開後
func foo(x) -> Int {
a
# wセクションにジャンプ
return foo'w(x, a)
}
foo'w(x, a_) {
# ローカル変数の受理
let a = a_
# 分岐
if cond
b
# ジャンプ
return foo'w(x, a)
else
# ジャンプ
return foo'q(x, a)
end
}
foo'q(x, a_) {
# ローカル変数の受理
let a = a_
c
return d
}
bの部分にreturnがあった場合、fooから抜けなければならない
async_splitter.rsでcontを受け取るようになるので、return cont(...)とすればよい
a案:async_splitterでwhileもloweringする
b案:先にenvとcontを受け取るように加工しておく
code:sk
def foo(x) -> Int
a
while cond
return e if b
end
c
return d
end
# 変換後
func foo(env, x, cont) -> Int {
a
while cond
return cont(env, e) if b
end
c
return cont(env, d)
}
これやっても別に変わらんか。
c案:「現在の関数から抜ける」という命令を追加する
hir::Expr::Escapeみたいな