【问题标题】:Why are delimited continuation primitives named "shift" and "reset"?为什么定界延续原语被命名为“shift”和“reset”?
【发布时间】:2011-08-24 19:13:29
【问题描述】:

我想我(大体上)理解shiftreset 的意思。但是我不明白他们为什么这样命名? shiftreset 作为 Delimited Continuation 原语与英语中的“shift”和“reset”单词有什么关系?

【问题讨论】:

    标签: scala continuations delimited-continuations


    【解决方案1】:

    之所以这样称呼它们是因为它们的实现方式(通常)。

    引自Direct Implementation of Shift and Reset in the MinCaml Compiler

    通过使用 延续语义,我们可以认为 程序的状态作为 延续栈。那么reset就可以了 被认为是延续的标志 堆栈和shift 捕获 连续堆栈到最近 由reset 创建的标记。这里是 实施概述:

    • 调用reset时,给堆栈设置一个复位标记
    • 当调用shift(fun k -> M)时,移动堆栈帧的一部分到 离堆最近的重置标记
    • 当调用延续 k 时,将 重置标记 设置到堆栈并复制 对应的帧从堆到 栈顶。

    k 为 调用,因为捕获的延续 在一个空的延续中执行。

    【讨论】:

    • 值得注意的是,Scala 的分隔延续不是以这种直接的方式实现的——它们不可能。 JVM 不公开堆栈操作原语。
    • 相比之下,Scheme-48 允许直接实现 (Gasbichler/Sperber),任何公开调用堆栈的语言(如 Squeak Smalltalk)也是如此。
    【解决方案2】:

    因为这就是 Danvy 和 Filinski 在 the first paper where they exposed that model of continuation-passing style(另请参阅 here)中调用这两个运算符的方式,这也是 Scala 实现的。

    Scala 中的实现在this other paper 中描述。其中对 Danvy 和 Filinski 的引用很明确:

    在本文中,我们研究了在此语言框架中添加控制运算符 shift 和 reset,它们共同实现静态定界延续(Danvy 和 Filinski 1990, 1992)

    【讨论】:

      猜你喜欢
      • 2011-08-28
      • 2011-09-19
      • 2021-01-16
      • 2016-09-29
      • 2021-10-17
      • 2016-02-24
      • 2018-01-31
      • 2013-03-22
      • 2016-09-30
      相关资源
      最近更新 更多