34

我想我理解(一般来说)什么shiftreset意思。但是我不明白他们为什么这样命名?shift分隔延续原语与英语中的“移位”和reset“重置”单词有什么关系?

4

2 回答 2

26

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

引自MinCaml 编译器中 Shift 和 Reset 的直接实现

通过使用延续语义解释程序,我们可以将程序的状态视为延续堆栈。然后,reset可以将其视为标记延续堆栈,并将shift延续堆栈捕获到最近的由reset. 以下是实现的概述:

  • 调用时,给堆栈reset设置一个复位标记
  • 调用时shift (fun k -> M)堆栈帧的一部分向上移动到堆中最近的重置标记处。
  • 调用 continuationk时,为堆栈设置重置标记,并将相应的帧从堆复制到堆栈顶部。

调用时插入重置标记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 回答