在阅读了几乎所有有关连续性的信息之后,我仍然很难理解它们。也许是因为所有解释都与Lambda微积分息息相关,我很难理解。
通常,在完成当前的事情(即计算的其余部分)之后,延续是对下一步工作的某种代表。
。但是,所有品种都变得更加棘手。也许你们中有些人可以在这里帮助我进行自定义类比,并指出我在理解中犯了错误的地方。
假设我们的功能被表示为对象,并为简单起见:
- 我们的解释器有一堆功能调用。
- 每个功能调用都有一个本地数据和参数的堆栈。
- 每个函数调用都有一个"指令"的队列,要执行在本地数据堆栈和队列本身上操作的"指令"(也许也可能在呼叫者的堆栈上)。
该类比是类似于xy的串联语言。
所以,在我的理解中:
- 延续是整个计算的其余部分(指令的这个未完成的队列 所有后续计算的堆栈:呼叫者的队列)。
- 部分延续是当前未完成的队列 呼叫者堆栈中的某些界定部分,直到某个点(整个程序中不是完整的)。
- 一个子接触是当前"活动"功能的当前指令队列的其余部分。
- 一次性延续是这样的延续,只能执行一次,将其置于对象后。
如果我的类比错了,请纠正我。
延续是整个计算的其余部分(指令的未完成的队列 所有后续计算的堆栈:呼叫者的队列)
非正式的理解是正确的。但是,作为一个概念的延续是控制状态的抽象,如果调用了该过程,则该过程应达到的状态。只要可以达到国家,它就不需要明确包含整个堆栈。这是延续的经典定义之一。请参阅Rhino JavaScript文档
部分延续是当前未完成的队列 呼叫者堆栈中的某些界定部分,直到某个点(不是整个程序的全部)
再次,非正式的理解是正确的。它也称为界定延续或可综合延续。在这种情况下,不仅需要达到以划界延续为代表的状态,而且还需要将延续的调用限制为指定的限制。这与完全延续相反,这是从指定的点开始,一直持续到控制流的末端。界定延续从这一点开始,仅以另一个确定的点结束。这是部分控制流,而不是完整的控制流,这正是为什么界定延续需要返回值的原因(请参阅Wikipedia文章)。该值通常代表部分执行的结果。
一个亚接头是当前"活动"函数的当前指令队列
您在这里的理解有点朦胧。曾经了解这一点的方法是考虑一个多线程环境。如果有一个主线程,并且在某个时候从中启动了一个新线程,则延续(从主或子线程的上下文),它应该表示什么?从那时起,儿童和主线程的整个控制流(在大多数情况下没有多大意义)还是仅仅是子螺纹的控制流?子接触是一种划界的延续,是控制流状态的表示,从一个点到另一个点,这是子过程或子过程中的一部分。请参阅本文。
一次性延续是这样的延续
根据本文,您的理解是正确的。该论文似乎没有明确说明这是完整/经典的延续或划界的内容。但是,在下一节中,论文指出完整的连续性是有问题的,因此我认为这种类型的延续是界定的延续。