我正在阅读this有趣的页面解释球拍中的延续。
它们提供代码以保存当前的计算延续(并在稍后使用此技巧实现回溯)。代码如下:
(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之后跳回到那一点?
非常感谢提前!
的Yannick