分隔和无限延续之间的区别

时间:2011-05-19 12:55:58

标签: language-agnostic programming-languages functional-programming continuations

我想delimitedundelimited延续之间的区别就像calljump之间的区别。

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

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

2 个答案:

答案 0 :(得分:7)

你有点偏离轨道。两种味道的延续与goto(跳跃)无关。但是,它们与堆栈有关。


Classic Continuations

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

分隔续订

分隔延续添加到混合中的是什么?

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

这就是想法,现在你有超酷的分隔延续:分隔,捕捉和操纵程序的任意部分,作为一个值。非常适合恢复和增量处理,以及其他棘手的控制流程。

参考

备注

来自Oleg Kiselyov的一些更正,已从列表中收到:

答案 1 :(得分:2)

作为语言特征的延续(与作为编程模式的延续相反)是控制上下文(“部分”)的(部分)的实现。正如唐所说,无限延续代表整个背景,而分隔延续仅代表它的一部分。

通常,捕获无限延续(例如,使用call/cc)不会改变控制上下文;只有在调用continuation(即反映到堆栈中)时才会更改控制上下文。

通常,捕获分隔的延续(例如,使用shift)会立即中止控制上下文的段直到最近的分隔符(例如,reset)并将其视为似乎是普通旧函数(虽然它可能被实现为堆栈技巧而不是实现正常函数)。

顺便说一句,延续有时被称为“第一类跳转”,但这并不意味着它们与jmp指令有任何关系,而不是正常的函数调用。