Language agnostic 带分隔符和不带分隔符的连续体之间的差异

Language agnostic 带分隔符和不带分隔符的连续体之间的差异,language-agnostic,programming-languages,functional-programming,continuations,Language Agnostic,Programming Languages,Functional Programming,Continuations,我猜分隔的和无限制的延续之间的区别就像调用和跳转之间的区别一样 如果调用delimitedcontinuation,它将在调用完成后返回给调用方。如果我们调用undelimitedcontinuation,它就像goto一样工作,永远不会返回调用方 这有意义吗?我错过什么了吗 你有点偏离正轨了。无论是哪种风格的延续,都与goto(跳跃)无关。然而,它们与堆栈有关 经典延续 请记住,常规continuations将控制堆栈的概念捕获为第一类值。堆栈可以命名,作为参数传递,值可以应用于它们,从而产

我猜
分隔的
无限制的
延续之间的区别就像
调用
跳转
之间的区别一样

如果调用
delimited
continuation,它将在调用完成后返回给调用方。如果我们调用
undelimited
continuation,它就像
goto
一样工作,永远不会返回调用方


这有意义吗?我错过什么了吗

你有点偏离正轨了。无论是哪种风格的延续,都与
goto
(跳跃)无关。然而,它们与堆栈有关


经典延续

请记住,常规continuations将控制堆栈的概念捕获为第一类值。堆栈可以命名,作为参数传递,值可以应用于它们,从而产生控制流的变化,通过
callCC
使用基于函数应用程序的简单API

分隔连续体

分隔的连续体在混合中添加了什么

回想一下,常规continuations捕获到某一点的整个调用堆栈。如果我们可以在其中放置标记,确切地说在延续中要捕获多少控制堆栈呢?控制堆栈的一种“定界”

这就是想法,现在你有了超级酷的定界连续体:定界、捕获和操作程序的任意部分,作为一个值。非常适合于恢复和增量处理以及其他棘手的控制流形式

参考资料

  • 正规的
  • 奥列格关于
  • ,ch33
注释

从列表中收到的一些更正:

  • 连续体和跳跃有着深刻的联系,连续体的最初发现是在试图理解跳跃语义(goto)的背景下进行的。Landin的
    J
    操作符就是为了这个目的而引入的;J是call/cc的前身。看
  • 进一步阅读“无限延续是共值而非函数”及其基础

作为语言功能的延续(与作为编程模式的延续相反)是控制上下文(“堆栈”)的(部分)具体化。正如Don所说,无限制的连续体代表整个上下文,而分隔的连续体只代表其中的一部分

通常,捕获不受限制的延续(例如,使用
调用/cc
)不会更改控件上下文;只有在调用延续时(即,反射到堆栈上),才会更改控件上下文

通常,捕获带分隔符的连续符(例如,使用
shift
)会立即中止控制上下文的段,直到最近的分隔符(例如,
reset
),并将其具体化为一个普通的旧函数(尽管它可能被实现为堆栈欺骗,而不是实现普通函数)


顺便说一句,continuation有时被称为“一级跳转”,但这并不意味着它们与
jmp
指令的关系比普通函数调用的关系更大。

关于
J
,请参见Danvy、Shan和Zerny的“J代表JavaScript:类似Algol的语言和JavaScript之间的直接风格对应,使用一流的连续体”: