我正在阅读标准ML(SMLofNJ.Cont)中的延续。我了解 callcc 和 throw 的功能,但不理解 isolate 。该文档说
丢弃调用上下文中的所有实时数据(可从f或x访问的数据除外),然后调用f(x),然后退出。这样可能会比在exit()之前使用f(x)之类的内存少得多。
但是,这对我来说没有任何意义。我只是想通过一些示例来了解此功能的作用。
答案 0 :(得分:2)
MLton使用isolate
和callcc
在throw
的{{3}}中做得更好:
val isolate: ('a -> unit) -> 'a t = fn (f: 'a -> unit) => callcc (fn k1 => let val x = callcc (fn k2 => throw (k1, k2)) val _ = (f x ; Exit.topLevelSuffix ()) handle exn => MLtonExn.topLevelHandler exn in raise Fail "MLton.Cont.isolate: return from (wrapped) func" end)
我们使用标准的嵌套callcc技巧返回一个准备好接收参数,执行隔离函数并退出程序的延续。 [...]
页面继续说明如何在减少空间泄漏的情况下达到相同的效果。
explaining an implementation与MLton's CONT
signature具有不同的文档行:
isolate f
创建一个在空上下文中求值f
的延续。这是一个恒定时间的操作,并产生一个恒定大小的堆栈。