理解(子,部分,完整,一次性)延续(用过程语言)

时间:2017-09-23 12:14:26

标签: functional-programming continuations procedural-programming

在阅读了几乎所有关于延续的内容之后,我仍然无法理解它们。也许是因为所有的解释都与lambda演算密切相关,我很难理解。

一般来说,在你完成当前的事情,即剩下的计算之后,延续是对下一步该做什么的一些表示。

然而,随着各种变化,它变得更加棘手。也许你们中的一些人可以帮我解决我在这里的习惯类比,并指出我在理解中犯了哪些错误。

假设我们的函数表示为对象,并且为了简单起见:

  1. 我们的解释器有一堆函数调用。
  2. 每个函数调用都有一个用于本地数据和参数的堆栈。
  3. 每个函数调用都有一个“指令”队列,可以在本地数据堆栈和队列本身上运行(也可能在调用者堆栈上)。
  4. 这个类比与XY concatenative language类似。

    所以,据我所知:

    • 延续是整个计算的其余部分(这个未完成的指令队列+所有后续计算的堆栈:调用者的队列)。
    • 部分延续是当前未完成的队列+调用者堆栈的某些分隔部分,直到某个点(不是完整的,整个程序)。
    • 子继续是当前“活动”功能的当前指令队列的其余部分。
    • 一次性延续就是这样的延续,只能执行一次, 在被称为物体之后。

    如果我的类比错误,请纠正我。

1 个答案:

答案 0 :(得分:2)

  

延续是整个计算的其余部分(这个未完成的指令队列+所有后续计算的堆栈:调用者的队列)

非正式地,您的理解是正确的。但是,作为概念的延续是控制状态的抽象,以及如果调用延续,则进程应该达到的状态。只要状态可以达到,它就不需要明确地包含整个堆栈。这是延续的经典定义之一。 Refer to Rhino JavaScript doc.

  

部分延续是当前未完成的队列+调用者堆栈的某些分隔部分,直到某个点(不是完整的,整个程序)

再次,非正式地说,你的理解是正确的。它也被称为delimited continuation或可组合的延续。在这种情况下,不仅进程需要达到分隔连续所表示的状态,而且还需要将连续的调用限制为指定的限制。这与完全延续形成对比,完全延续从指定的点开始并持续到控制流的结束。定界延续从这一点开始,仅在另一个确定的点结束。它是一个部分控制流而不是完整的控制流,这正是分隔继续需要返回一个值的原因(见the Wikipedia article)。该值通常表示部分执行的结果。

  

子继续是当前“活动”功能的当前指令队列的其余部分

你在这里的理解有点模糊。一旦理解这一点,就要考虑多线程环境。如果有一个主线程并且在某个时刻从它启动了一个新线程,那么继续(从主线程或子线程的上下文),它应该代表什么?从那一点开始的子线程和主线程的整个控制流程(在大多数情况下没有多大意义)或仅仅是子线程的控制流程?子继续是一种分隔的延续,控制流状态表示从一个点到另一个点,它是子过程或子过程树的一部分。 Refer to this paper.

  

一次性延续是这样一种延续,在被引入物体后只能执行一次

As per this paper,您的理解是正确的。该论文似乎没有明确说明这是一个完整的/经典的延续还是一个分隔的延续;然而,在接下来的部分中,论文指出完全延续是有问题的,所以我认为这种类型的延续是一个分隔的延续。