我正在阅读这个有趣的页面,解释球拍中的延续.
它们呈现代码以保存当前的计算延续(并在稍后使用此技巧来实现回溯).代码如下:
(define (currcc)
(call/cc (lambda (cc) (cc cc))))
Run Code Online (Sandbox Code Playgroud)
现在我想在标准ML中做同样的技巧,因为新泽西的SML似乎是实现延续的唯一解释器,我在那里做.
那里的延续签名如下:
type 'a cont
val callcc : ('a cont -> 'a) -> 'a
val throw : 'a cont -> 'a -> 'b
val isolate : ('a -> unit) -> 'a cont
Run Code Online (Sandbox Code Playgroud)
直接翻译将是:
val currcc () = callcc (fn cc => throw cc cc)
Run Code Online (Sandbox Code Playgroud)
但ML的类型系统禁止这个(因为这是循环的).
所以我尝试了类似的东西:
val glcc = ref (isolate (fn x => ()) : unit cont)
fun savecc () = (callcc (fn (cc : unit cont) => glcc := cc); !glcc)
fun backjump () = throw (!glcc) ();
Run Code Online (Sandbox Code Playgroud)
以及引用的各种其他技巧,但我找不到真正保存当前延续的方法(因为我之后使用!glcc改变了所需的延续,在本例中).
有谁知道的方式来实现运营商savecc和backjump,让我再去救一个程序的当前的延续和标准ML跳回到该点之后?
提前谢谢了!
雅尼克
| 归档时间: |
|
| 查看次数: |
197 次 |
| 最近记录: |