DSからCPSの関数を呼び出す方法
CPSからDS(Direct Style)の関数を呼び出すのは,以下のように何の問題もなくできる.
fun f_cps(k, x) = let t = g_ds(x) in ... (k t) // リターン
ではその逆はどうか?
DSの関数は,現在の継続を明示的にパラメータとして渡されていないので,呼び出したいCPS関数に渡してやる継続をどうにかしてひねり出す必要がある.
で,以下のように代入演算子を使えば,そのようなことができる.(と思う)
fun f_cps(k, x) = ... (k r) fun g_ds(y) = ... let r = 0 in f_cps((fun (r') = r := r'), y) ...
以下のようにラッパ関数を作っておくと便利だ.
// CPS版の関数fをDS版に引き戻すラッパ関数 fun f_ds(x) = let r = 0 in f_cps((fun (r') = r := r'), x); r
ちょっとインチキっぽいけどcall/cc(letcc)を使っても実装できる.
fun f_ds(x) = letcc c in f_cps(c, x)
あるいは,return E to fnameのようにネストした関数内部から一気に戻れるようなreturn構文を導入して,
fun f_ds(x) = f_cps((fun (r) = return r to f_ds), x)
とかも良さそう.