изолировать в SMLofNJ.Cont - PullRequest
       52

изолировать в SMLofNJ.Cont

0 голосов
/ 21 ноября 2018

Я читал о продолжениях в стандарте ML ( SMLofNJ.Cont ).Я понял, что делают callcc и throw , но не смог понять изолировать .Документация гласит:

Удалите все текущие данные из вызывающего контекста (кроме того, что доступно из f или x), затем вызовите f (x), затем выйдите.Это может использовать намного меньше памяти, чем что-то вроде f (x) перед exit ().

Однако это не имеет никакого смысла для меня.Я просто хотел узнать, что делает эта функция, с некоторыми примерами.

1 Ответ

0 голосов
/ 22 ноября 2018

MLton лучше справляется с , объясняя реализацию из isolate с использованием callcc и throw:

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чтобы вернуть продолжение, готовое принять аргумент, выполнить изолированную функцию и выйти из программы. [...]

На странице продолжается объяснение того, как добиться того же эффекта с меньшим количеством пробелов.

Подпись MLton CONT имеет другую строку документации, чем SML / NJ CONT подпись :

  • isolate f создает продолжение, которое оценивает f впустой контекст.

    Это операция с постоянным временем, которая дает стек постоянного размера.

...