将当前延续保存在SMLofNJ中

时间:2015-11-19 17:25:41

标签: smlnj callcc

我正在阅读this有趣的页面解释球拍中的延续。

它们提供代码以保存当前的计算延续(并在稍后使用此技巧实现回溯)。代码如下:

(define (currcc)
 (call/cc (lambda (cc) (cc cc))))

现在我想在标准ML中做同样的技巧,因为新泽西的SML似乎是实现延续的唯一解释器,我在那里做。

continuation signature如下所示:

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之后跳回到那一点?

非常感谢提前!

的Yannick

0 个答案:

没有答案