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)

とかも良さそう.