継続
概要
現在主流である、LIFOの関数呼び出し
継続渡し形式では、関数からのreturnという概念が無くなる
継続渡し形式(Continuation Passing Style, CPS)
現在の継続(current continuation)を生成し、それを関数に渡してその関数を実行する
call/cc(call-with-current-continuation)
継続が複数ある場合は 一般的な有向グラフとなる。逆に言えば、有向グラフで表せるような 状態遷移型の処理は継続渡し形式で綺麗に書けるのだ。
call/returnモデルでは、呼んだ関数が戻って来る場所はひとつだ。 しかし継続渡しの場合、複数の継続を渡しておいて、状況によって戻り先(飛び先)を 切り替えることができる。
重要なのは、どんなコードでも継続渡し形式として「見る」ことができる
Schemeのようにファーストクラスのクロージャがある場合、 継続作成時の環境をクロージャに閉じ込むことで、 コード変換によって全ての関数呼び出しを末尾呼び出しに変えることが可能になる
継続は副作用?
https://twitter.com/kmizu/status/1474813120782954496?s=21
CallとReturn
call
継続を伴って関数を呼び出すこと
return
渡された継続へと 制御を移すこと(呼び出し元に戻る)
継続は何に使える?
ループ脱出(break)
例外処理(throw)
コルーチン
return、goto
参照
なんでも継続
call/cc 入門 (Coroutine with call/cc)
Scheme:使いたい人のための継続入門
https://susisu.hatenablog.com/entry/2015/10/19/204004