art*_*ter 5 continuations procedural-programming functional-programming
在阅读了几乎所有我能找到的有关延续的内容后,我仍然无法理解它们。也许是因为所有的解释都与 lambda 演算密切相关,我很难理解它。
一般来说,延续是在完成当前操作(即其余计算)后下一步要做什么的某种表示。
但随着种类繁多,事情变得更加棘手。也许你们中的一些人可以帮助我用我的自定义类比来帮助我,并指出我在理解中犯了错误的地方。
假设我们的函数被表示为对象,为了简单起见:
该类比类似于XY 连接语言。
所以,根据我的理解:
如果我的类比有误,请纠正我。
延续是整个计算的其余部分(未完成的指令队列+所有后续计算的堆栈:调用者队列)
非正式地,您的理解是正确的。然而,延续作为一个概念是控制状态和调用延续时进程应达到的状态的抽象。它不需要显式包含整个堆栈,只要可以获得状态即可。这是延续的经典定义之一。请参阅 Rhino JavaScript 文档。
部分延续是当前未完成的队列+调用者堆栈的某些分隔部分,直到某个点(对于整个程序而言,不是完整的部分)
再说一次,非正式地,你的理解是正确的。它也称为定界延续或可组合延续。在这种情况下,进程不仅需要达到由定界延续表示的状态,而且还需要将延续的调用限制为指定的限制。这与完全连续相反,完全连续从指定点开始并继续到控制流的末尾。定界延续从该点开始,仅在另一个标识点结束。它是部分控制流而不是完整的控制流,这正是定界延续需要返回一个值的原因(请参阅维基百科文章)。该值通常表示部分执行的结果。
子延续是当前“活动”函数的当前指令队列的其余部分
你在这里的理解有点模糊。理解这一点的一个方法是考虑多线程环境。如果有一个主线程,并且在某个时刻从它启动一个新线程,那么一个延续(来自主线程或子线程的上下文),它应该代表什么?从那时起子线程和主线程的整个控制流(在大多数情况下没有多大意义)还是只是子线程的控制流?子延续是一种定界延续,是从一个点到另一个点的控制流状态表示,是子流程或子流程树的一部分。请参阅本文。
一次性延续是指在具体化为对象后只能执行一次的延续
根据本文,您的理解是正确的。该论文似乎没有明确说明这是一个完整/经典的延续还是一个分隔的延续;然而,在接下来的部分中,本文指出完整的延续是有问题的,因此我假设这种类型的延续是带分隔符的延续。