shift/reset
shiftとresetという2つの関数
健全かつ完全な公理系が存在する
多相の型システムが存在する
継続渡し形式のプログラムとの間に厳密な対応関係がある
resetで限定継続の区切りを入れる
reset $ \_ -> Mと書いた時、
この式はMと同じだが、継続に区切りを入れている
例えば、3 + 5 * 2 - 1を順番に計算する時、
reset (\_ -> 3 + [5*2]) - 1のようにすれば、
3 + [.]のところまでが限定継続になる
shiftで限定継続を取ってくる
resetの引数内(継続の中)で呼ぶ
shift $ \k -> Mと書いた時、
現在の限定継続を関数kに束縛し、
Mを実行する
直近のresetで区切られた部分を脱出し、代わりにMを実行する
部分継続版のcall/ccのようなものだが、脱出機能が付いているmrsekut.icon
resetとshiftを使った例
reset $ \_ -> 3 + shift (\k -> 5 * 2) - 1だとすると、
現在の限定継続を関数kに束縛し、
∴ k = \x -> 3 + x - 1
Mを実行する
5 * 2
よって結果は10
この例は継続を破棄しているmrsekut.icon
reset $ \_ -> 3 + shift (\k -> 5 * k 2)) - 1だとすると、
現在の限定継続を関数kに束縛し、
∴ k = \x -> 3 + x - 1
Mを実行する
∴ 5 * k 2→5 * (3 + 2 - 1)→20
よって結果は20
参考
継続の保存
コルーチンできる
thunkを作る
shift (fun k -> fun () -> k "hello")
global変数っぽく使うことで状態を表現できる
答えの型
resetが返す値の型
shiftを使うと型が変化する