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 更改了想要的延续)。

有谁知道实现运算符的方法saveccbackjump让我保存程序的当前延续,然后在标准 ML 中跳回到那个点?

提前谢谢了!

雅尼克

4

0 回答 0