问题标签 [continuations]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
12 回答
9374 浏览

c - 如何实现延续?

我正在研究用 C 编写的 Scheme 解释器。目前它使用 C 运行时堆栈作为自己的堆栈,这在实现延续方面存在一个小问题。我目前的解决方案是将 C 堆栈手动复制到堆中,然后在需要时将其复制回来。除了不是标准的 C 之外,这种解决方案也不是很理想。

在 C 中实现 Scheme 延续的最简单方法是什么?

0 投票
12 回答
2972 浏览

ruby - 寻找“真实”使用延续的例子

我试图掌握延续的概念,我从维基百科文章中找到了几个像这样的小教学示例:

我了解这个小功能的作用,但我看不到它有任何明显的应用。虽然我不希望很快在我的代码中使用延续,但我希望我知道一些合适的情况。

因此,我正在寻找更明确有用的代码示例,了解延续可以为我作为程序员提供什么。

干杯!

0 投票
9 回答
3063 浏览

functional-programming - 我只是没有继续!

它们是什么,它们有什么用?

我没有 CS 学位,我的背景是 VB6 -> ASP -> ASP.NET/C#。任何人都可以用清晰简洁的方式解释它吗?

0 投票
4 回答
3462 浏览

ruby - Ruby 中的延续

有没有人做过让 Ruby 做延续的工作(比如 Smalltalk 上的 Seaside)?

0 投票
1 回答
938 浏览

smalltalk - 使用 Seaside 延续

如何在 Squeak 中获得 BlockClosure(我想使用 BlockClosure>>callCC)?

当我写 [#foo] 是一个 BlockContext 时,有什么关系?

更新:我发现 BlockClosure 主要是新编译器的东西。

相反,我如何使用 seaside Continuations?我遇到了问题,任何例子都将不胜感激。

进一步更新:这样做的目的不是使用 seaside(至少不是直接使用),而是以一种比滚动我自己的状态跟踪迭代器更容易的方式编写遍历和其他类似的东西。

0 投票
2 回答
1553 浏览

c# - C# 中基于事件的异步;任何通用的重构可能吗?

一些 API,如 WebClient,使用基于事件的异步模式。虽然这看起来很简单,并且可能在松散耦合的应用程序中运行良好(例如 UI 中的 BackgroundWorker),但它并不能很好地链接在一起。

例如,这是一个多线程程序,因此异步工作不会阻塞。(想象一下,这是在一个服务器应用程序中调用数百次——你不想阻塞你的 ThreadPool 线程。)我们得到 3 个局部变量(“状态”),然后进行 2 个异步调用,结果是首先馈入第二个请求(因此它们不能并行)。状态也可能发生变异(易于添加)。

使用 WebClient,事情最终会像下面这样(或者你最终创建了一堆对象来充当闭包):

}

有没有一种通用的方法来重构这种基于事件的异步模式?(即不必为每个这样的 API 编写详细的扩展方法?) BeginXXX 和 EndXXX 使它变得容易,但这种事件方式似乎没有提供任何方式。

0 投票
4 回答
1128 浏览

functional-programming - 是否有支持可移植延续的快速语言?

我正在寻找一种支持可移植延续的快速语言(即一种可以本地编译以实现性能不超过 C 3 或 4 倍的语言)。我的意思是可以在一台计算机上序列化并在另一台计算机上反序列化的延续。

我知道 SISC 可以做到这一点(Java 中的 Scheme 实现),但速度很慢。同样适用于 Rhino(Java 中的 Javascript 实现)。

0 投票
5 回答
2042 浏览

python - Python 等价于 Ruby 的延续

Ruby 中以下代码的 Python 等价物是什么?

参考:轻量级开发成功的秘诀,第 9 部分:基于延续的框架

0 投票
1 回答
617 浏览

interpreter - 持续传递风格与积极削减调用堆栈?

我正在考虑将 CPS 之类的东西用于基于演员的语言的解释器中。

函数参数在变量数组中传递,延续在同一个数组中返回,所以一个简单的函数

所以来自 read/eval/loop 的调用将是

入境时会是

其中 _ 是写入函数返回值的空槽。

在执行的下一步,参数变为

然后

等等。C中的实现基本上是

检查是否超出 args 数组的末尾并分配更多空间。

参数是连续的,作为对象的“延续”只是参数的一个子集。

如果我要实现一流的延续,他们将需要克隆参数数组;您也不会免费获得关闭。主要目标是与简单的机器代码生成配合得很好,并让您暂停和恢复执行。

虽然这个方案的灵感来自于对 CPS 的思考,但它并不完全是 CPS,并且非常类似于经过积极修剪的 C 堆栈可能看起来的样子——只是活动变量和每个函数的返回点。

这种风格有名字吗,特别是参数数组?这是一种蹦床+一个堆栈,尽管我习惯于调用“堆栈”更多的是历史而不是执行的未来。

0 投票
7 回答
2657 浏览

python - 是否可以以编程方式构造 Python 堆栈帧并在代码中的任意点开始执行?

是否可以在 CPython 中以编程方式构造一个堆栈(一个或多个堆栈帧)并在任意代码点开始执行?想象以下场景:

  1. 您有一个工作流引擎,其中的工作流可以用 Python 编写脚本,其中包含一些调用工作流引擎的结构(例如分支、等待/加入)。

  2. 阻塞调用(例如等待或加入)在具有某种持久后备存储的事件调度引擎中设置侦听器条件。

  3. 您有一个工作流脚本,它调用引擎中的等待条件,等待稍后将发出信号的某些条件。这会在事件分派引擎中设置侦听器。

  4. 工作流脚本的状态,包括程序计数器(或等效状态)在内的相关堆栈帧被保留 - 因为等待条件可能会在几天或几个月后发生。

  5. 在此期间,工作流引擎可能会停止并重新启动,这意味着必须能够以编程方式存储和重建工作流脚本的上下文。

  6. 事件调度引擎触发等待条件拾取的事件。

  7. 工作流引擎读取序列化状态和堆栈,并使用堆栈重建线程。然后它在调用等待服务的地方继续执行。

问题

这可以用未经修改的 Python 解释器来完成吗?更好的是,谁能指出一些可能涵盖此类事情的文档或以编程方式构造堆栈帧并在代码块中间某处开始执行的代码示例?

编辑:为了澄清“未修改的 python 解释器”,我不介意使用 C API(PyThreadState 中是否有足够的信息来做到这一点?)但我不想去探索 Python 解释器的内部结构并拥有建立一个修改过的。

更新:通过一些初步调查,可以使用PyThreadState_Get(). 这将返回 a 中的线程状态PyThreadState(在 中定义pystate.h),该状态具有对 中的堆栈帧的引用frame。堆栈帧保存在 struct typedef'd to 中PyFrameObject,该结构定义在frameobject.h. PyFrameObject有一个字段f_lasti(对bobince的道具),它有一个程序计数器,表示为距代码块开头的偏移量。

最后一点是个好消息,因为这意味着只要您保留实际编译的代码块,您就应该能够根据需要为尽可能多的堆栈帧重建局部变量并重新启动代码。我想说这意味着理论上可以不必修改python解释器,尽管这意味着代码仍然可能会与特定版本的解释器紧密耦合。

剩下的三个问题是:

  • 事务状态和“传奇”回滚,这可能可以通过一种用于构建 O/R 映射器的元类黑客来完成。我确实构建了一次原型,所以我对如何实现这一点有一个很好的了解。

  • 稳健地序列化事务状态和任意局部变量。这可以通过读取__locals__(可从堆栈帧中获得)并以编程方式构造对 pickle 的调用来完成。但是,我不知道这里可能存在什么问题(如果有的话)。

  • 工作流的版本控制和升级。这有点棘手,因为系统没有为工作流节点提供任何符号锚。我们只有锚点 为了做到这一点,我们必须识别所有入口点的偏移量并将它们映射到新版本。手动操作可能可行,但我怀疑很难自动化。如果您想支持此功能,这可能是最大的障碍。

更新 2: PyCodeObject ( code.h) 中有一个 addr ( f_lasti)-> 行号映射列表PyCodeObject.co_lnotab(如果此处错误,请纠正我)。这可能用于促进将工作流更新到新版本的迁移过程,因为冻结的指令指针可以映射到新脚本中的适当位置,根据行号完成。仍然很混乱,但更有希望。

更新 3:我认为这个问题的答案可能是Stackless Python。 您可以暂停任务并将它们序列化。我还没有弄清楚这是否也适用于堆栈。