我想我理解(一般来说)什么shift
和reset
意思。但是我不明白他们为什么这样命名?shift
分隔延续原语与英语中的“移位”和reset
“重置”单词有什么关系?
问问题
1993 次
2 回答
26
之所以这样称呼它们是因为它们的实现方式(通常)。
引自MinCaml 编译器中 Shift 和 Reset 的直接实现
通过使用延续语义解释程序,我们可以将程序的状态视为延续堆栈。然后,
reset
可以将其视为标记延续堆栈,并将shift
延续堆栈捕获到最近的由reset
. 以下是实现的概述:
- 调用时,给堆栈
reset
设置一个复位标记- 调用时
shift
(fun k -> M)
,将堆栈帧的一部分向上移动到堆中最近的重置标记处。- 调用 continuation
k
时,为堆栈设置重置标记,并将相应的帧从堆复制到堆栈顶部。调用时插入重置标记
k
,因为捕获的延续在空延续中执行。
于 2011-05-13T11:06:45.163 回答
5
因为这就是 Danvy 和 Filinski 在第一篇论文中对这两个运算符的称呼,他们公开了延续传递样式的模型(另请参见此处),而这正是 Scala 实现的。
Scala 中的实现在另一篇论文中进行了描述。其中对 Danvy & Filinski 的引用很明确:
在本文中,我们研究了在该语言框架中添加控制运算符 shift 和 reset,它们共同实现静态定界延续 (Danvy and Filinski 1990, 1992)
于 2011-07-09T07:49:18.247 回答