【问题标题】:Difference between delimited and undelimited continuations定界延续和未定界延续之间的区别
【发布时间】:2011-08-28 20:58:19
【问题描述】:
我猜delimited 和undelimited 延续之间的区别就像call 和jump 之间的区别。
如果我们调用delimited continuation,它将在完成后返回给调用者。如果我们调用undelimited continuation,它就像goto 一样工作,并且永远不会返回给调用者。
这有意义吗?我错过了什么吗?
【问题讨论】:
标签:
language-agnostic
programming-languages
functional-programming
continuations
【解决方案1】:
你有点跑题了。任何一种风格的延续都与goto(跳跃)无关。然而,它们与堆栈有关。
经典延续
请记住,常规延续将控制堆栈的概念捕获为第一类值。堆栈可以被命名,作为参数传递,并且可以将值应用于它们,从而产生控制流的变化,通过callCC 使用基于函数应用程序的简单 API。
定界延续
delimited 延续添加了什么?
回想一下,常规延续会捕获整个调用堆栈直到某个点。如果我们可以在其中放置标记来准确说明要在延续中捕获多少控制堆栈呢?控制堆栈的一种“定界”。
这就是想法,现在您有了超酷的定界延续:定界、捕获和操作程序的任意部分,作为一个值。非常适合恢复和增量处理,以及其他复杂形式的控制流。
参考文献
注意事项
来自Oleg Kiselyov 的一些更正,已从列表中收到:
【解决方案2】:
作为语言特性的延续(与作为编程模式的延续相反)是控制上下文(“堆栈”)(部分)的具体化。正如唐所说,未定界的延续代表整个上下文,而定界的延续只代表其中的一部分。
通常,捕获未定界的延续(例如,使用call/cc)不会更改控制上下文;控制上下文只有在调用延续时才会改变(即反映到堆栈上)。
通常情况下,捕获一个带分隔符的延续(例如,shift)会立即中止控制上下文的段,直到最近的分隔符(例如,reset)并将其具体化为似乎是一个普通的旧函数(尽管它可能被实现为堆栈技巧,而不是实现普通功能)。
顺便说一句,延续有时被称为“一级跳转”,但这并不意味着它们与 jmp 指令的关系比普通函数调用更多。