ラケットの継続について説明しているこの面白いページを読んでいました。
それらは、計算の現在の継続を保存するコードを提示します (そして、後でこのトリックを使用してバックトラッキングを実装します)。コードは次のようになります。
(define (currcc)
(call/cc (lambda (cc) (cc cc))))
今、私は標準 ML で同じトリックを実行したいと考えています。ニュージャージーの SML が継続を実装している唯一のインタープリターであるように思われるので、そこで実行しています。
そこにある継続署名は次のようになります。
type 'a cont
val callcc : ('a cont -> 'a) -> 'a
val throw : 'a cont -> 'a -> 'b
val isolate : ('a -> unit) -> 'a cont
直訳は次のようになります。
val currcc () = callcc (fn cc => throw cc cc)
しかし、ML の型システムはこれを禁止しています (これは循環であるため)。
だから私は次のようなものを試しました:
val glcc = ref (isolate (fn x => ()) : unit cont)
fun savecc () = (callcc (fn (cc : unit cont) => glcc := cc); !glcc)
fun backjump () = throw (!glcc) ();
および参照を使用した他のさまざまなトリックですが、現在の継続を実際に保存する方法が見つかりません(この例では、後で !glcc を使用して必要な継続を変更するため)。
savecc
演算子を実装する方法を知っている人はいますか?backjump
それにより、プログラムの現在の継続を保存し、後で標準 ML でその時点に戻ることができますか?
よろしくお願いします!
ヤニック