在SMLofNJ.Cont中分离

时间:2018-11-21 15:22:07

标签: functional-programming sml smlnj continuation-passing

我正在阅读标准ML(SMLofNJ.Cont)中的延续。我了解 callcc throw 的功能,但不理解 isolate 。该文档说

  

丢弃调用上下文中的所有实时数据(可从f或x访问的数据除外),然后调用f(x),然后退出。这样可能会比在exit()之前使用f(x)之类的内存少得多。

但是,这对我来说没有任何意义。我只是想通过一些示例来了解此功能的作用。

1 个答案:

答案 0 :(得分:2)

MLton使用isolatecallccthrow的{​​{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 implementationMLton's CONT signature具有不同的文档行:

  
      
  • isolate f创建一个在空上下文中求值f的延续。

         

    这是一个恒定时间的操作,并产生一个恒定大小的堆栈。

  •