【发布时间】:2011-08-24 19:13:29
【问题描述】:
我想我(大体上)理解shift 和reset 的意思。但是我不明白他们为什么这样命名? shift 和 reset 作为 Delimited Continuation 原语与英语中的“shift”和“reset”单词有什么关系?
【问题讨论】:
标签: scala continuations delimited-continuations
我想我(大体上)理解shift 和reset 的意思。但是我不明白他们为什么这样命名? shift 和 reset 作为 Delimited Continuation 原语与英语中的“shift”和“reset”单词有什么关系?
【问题讨论】:
标签: scala continuations delimited-continuations
之所以这样称呼它们是因为它们的实现方式(通常)。
引自Direct Implementation of Shift and Reset in the MinCaml Compiler
通过使用 延续语义,我们可以认为 程序的状态作为 延续栈。那么
reset就可以了 被认为是延续的标志 堆栈和shift捕获 连续堆栈到最近 由reset创建的标记。这里是 实施概述:
- 调用
reset时,给堆栈设置一个复位标记- 当调用
shift(fun k -> M)时,移动堆栈帧的一部分到 离堆最近的重置标记- 当调用延续
k时,将 重置标记 设置到堆栈并复制 对应的帧从堆到 栈顶。当
k为 调用,因为捕获的延续 在一个空的延续中执行。
【讨论】:
因为这就是 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)
【讨论】: