为什么分隔的连续原语名为"shift"和"reset"?

Mic*_*ael 32 continuations scala delimited-continuations

我想(一般来说)我的理解shiftreset意思.但是我不明白他们为什么如此命名?什么shiftreset分隔继续原语与英语中的"移位"和"重置"单词有什么关系?

Vas*_*iuk 23

由于它们的实施方式(一般而言),它们被称之为.

引自MinCaml编译器中的直接实现移位和复位

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

  • 调用时reset,将重置标记设置为堆栈
  • 调用时shift (fun k -> M),堆栈帧的一部分移动到最近的堆重置标记
  • 调用continuation时k,将重置标记设置为堆栈,并将相应的帧从堆复制到堆栈顶部.

k调用时会插入重置标记,因为捕获的延续在空的连续中执行.

  • 值得注意的是,Scala的分隔延续并没有以这种直接的方式实现 - 它们不可能.JVM不公开堆栈操作原语. (11认同)

hui*_*ker 5

因为这就是Danvy&Filinski在第一篇文章中称这两个操作符的方式,他们暴露了这种连续传递模式(也见这里),这就是Scala实现的.

Scala中的实现在另一篇论文中有所描述.其中Danvy&Filinski的参考文献很清楚:

在本文中,我们研究了控制操作符移位和重置到这个语言框架的加法,它们共同实现静态分隔的延续(Danvy和Filinski 1990,1992)