6

ラケットの継続について説明しているこの面白いページを読んでいました。

それらは、計算の現在の継続を保存するコードを提示します (そして、後でこのトリックを使用してバックトラッキングを実装します)。コードは次のようになります。

(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 でその時点に戻ることができますか?

よろしくお願いします!

ヤニック

4

0 に答える 0