【发布时间】:2018-03-04 21:40:59
【问题描述】:
在阅读了我能找到的关于延续的几乎所有内容之后,我仍然无法理解它们。也许是因为所有的解释都与 lambda 演算密切相关,我很难理解。
一般来说,延续是在您完成当前的事情(即剩余的计算)之后接下来要做什么的某种表示。
但是,随着种类繁多,它变得更加棘手。也许你们中的一些人可以在这里用我的习惯类比帮助我,并指出我在理解上犯了什么错误。
假设我们的函数被表示为对象,为了简单起见:
- 我们的解释器有一堆函数调用。
- 每个函数调用都有一个用于本地数据和参数的堆栈。
- 每个函数调用都有一个要执行的“指令”队列,这些“指令”对本地数据堆栈和队列本身(也可能在调用者堆栈上)进行操作。
类比是为了类似于XY concatenative language。
所以,在我的理解中:
- 延续是整个计算的其余部分(这个未完成的指令队列 + 所有后续计算的堆栈:调用者队列)。
- 部分延续是当前未完成的队列 + 调用者堆栈的某个定界部分,直到某个点(不是完整的,对于整个程序)。
- 子延续是当前“活动”功能的当前指令队列的其余部分。
- one-shot continuation 就是这样一种只能执行一次的continuation, 被具体化为对象后。
如果我的比喻有误,请纠正我。
【问题讨论】:
-
您可能会发现此 QA 很有用:stackoverflow.com/q/14019341/783743
-
看过那个。试图解释延续的一般概念,但不是我正在努力解决的所有变体
-
您可能想要调整您的机器模型以拥有一堆函数调用,也就是说,当一个函数被调用两次时,它可以有不同的本地数据和参数。否则,您将获得静态数据和不可重入函数。另外,“在调用者堆栈上操作”我希望您指的是解释器的函数(调用)堆栈,而不是函数调用者的本地数据。
-
@Bergi 是的,我是这个意思。当然是一堆独特的框架。
标签: functional-programming continuations procedural-programming