在阅读了几乎所有关于延续的内容之后,我仍然无法理解它们。也许是因为所有的解释都与lambda演算密切相关,我很难理解。
一般来说,在你完成当前的事情,即剩下的计算之后,延续是对下一步该做什么的一些表示。
然而,随着各种变化,它变得更加棘手。也许你们中的一些人可以帮我解决我在这里的习惯类比,并指出我在理解中犯了哪些错误。
假设我们的函数表示为对象,并且为了简单起见:
这个类比与XY concatenative language类似。
所以,据我所知:
如果我的类比错误,请纠正我。
答案 0 :(得分:2)
延续是整个计算的其余部分(这个未完成的指令队列+所有后续计算的堆栈:调用者的队列)
非正式地,您的理解是正确的。但是,作为概念的延续是控制状态的抽象,以及如果调用延续,则进程应该达到的状态。只要状态可以达到,它就不需要明确地包含整个堆栈。这是延续的经典定义之一。 Refer to Rhino JavaScript doc.
部分延续是当前未完成的队列+调用者堆栈的某些分隔部分,直到某个点(不是完整的,整个程序)
再次,非正式地说,你的理解是正确的。它也被称为delimited continuation或可组合的延续。在这种情况下,不仅进程需要达到分隔连续所表示的状态,而且还需要将连续的调用限制为指定的限制。这与完全延续形成对比,完全延续从指定的点开始并持续到控制流的结束。定界延续从这一点开始,仅在另一个确定的点结束。它是一个部分控制流而不是完整的控制流,这正是分隔继续需要返回一个值的原因(见the Wikipedia article)。该值通常表示部分执行的结果。
子继续是当前“活动”功能的当前指令队列的其余部分
你在这里的理解有点模糊。一旦理解这一点,就要考虑多线程环境。如果有一个主线程并且在某个时刻从它启动了一个新线程,那么继续(从主线程或子线程的上下文),它应该代表什么?从那一点开始的子线程和主线程的整个控制流程(在大多数情况下没有多大意义)或仅仅是子线程的控制流程?子继续是一种分隔的延续,控制流状态表示从一个点到另一个点,它是子过程或子过程树的一部分。 Refer to this paper.
一次性延续是这样一种延续,在被引入物体后只能执行一次
As per this paper,您的理解是正确的。该论文似乎没有明确说明这是一个完整的/经典的延续还是一个分隔的延续;然而,在接下来的部分中,论文指出完全延续是有问题的,所以我认为这种类型的延续是一个分隔的延续。