![]() |
1
16
在阿尔戈和;我们一直使用这些数据从(长)函数中“退出”或“返回” 例如,遍历树的BFS算法是这样实现的:
如您所见,当节点发现函数返回true时,算法将退出:
该函数还将给出一个“返回值”:'node' 函数退出的原因是以下语句:
当我们使用exit时,它将返回执行前的状态,清空调用堆栈并返回您给它的值。 所以基本上,调用cc(在这里)是为了跳出递归函数,而不是等待整个递归自行结束(在做大量计算工作时,这可能会非常昂贵) 另一个较小的例子与call cc做同样的事情:
|
![]() |
2
9
|
![]() |
3
7
@帕特
对, Seaside 这是一个很好的例子。我快速浏览了它的代码,发现这条消息说明了在Web上以一种看似有状态的方式在组件之间传递控制。
太好了! |
![]() |
4
6
我构建了自己的单元测试软件。在执行测试之前,我会在执行测试前存储延续,然后在失败时,我(可选)告诉方案解释器进入调试模式,并重新调用延续。这样我就可以很容易地遍历有问题的代码。 如果您的延续是可序列化的,您还可以在应用程序发生故障时进行存储,然后重新调用它们以获取有关变量值、堆栈跟踪等的详细信息。 |
![]() |
5
5
一些web服务器和web框架使用延续来存储会话信息。为每个会话创建一个延续对象,然后由会话中的每个请求使用。 |
![]() |
6
5
我来这里是为了实施
这是什么
以下是文章的实现:
我喜欢
|
![]() |
7
3
只要程序流不是线性的,甚至不是预先确定的,就可以在“现实生活中”的例子中使用延续。一个熟悉的情况是 web applications . |
![]() |
8
3
在服务器编程(包括web应用程序前端)中,连续是每个请求线程的良好替代方案。 在这种模型中,您只需在函数中开始一些工作,而不是每次收到请求时都启动一个新的(重)线程。然后,当您准备阻塞I/O(即从数据库读取)时,您将向网络响应处理程序传递一个延续。当响应返回时,您将执行延续。使用此方案,您可以用几个线程处理大量请求。 这使得控制流比使用阻塞线程更复杂,但在重负载下,它更高效(至少在当今的硬件上)。 |
![]() |
9
2
amb运算符是一个很好的例子,它允许类似prolog的声明性编程。 就在我们说话的时候,我正在用Scheme编写一个音乐作曲软件(我是一名音乐家,对音乐背后的理论几乎一无所知,我只是在分析我自己的作品,看看它背后的数学是如何运作的。) 使用amb算子,我可以填写旋律必须满足的约束,让Scheme计算结果。 由于语言哲学的原因,延续可能会被放入Scheme中,Scheme是一个框架,通过在Scheme本身中定义库,使您能够实现其他语言中的任何编程范式。延续用于构建自己的抽象控制结构,如“return”、“break”或启用声明性编程。Scheme更具“泛化性”,并要求程序员也能指定这样的构造。 |
![]() |
10
1
怎么样
Google Mapplets API
?有很多函数(都以结尾
这 example 展示了一个非常简单的案例。
因为这是Javascript,所以没有 tail call optimization ,因此堆栈将随着每次调用的继续而增长,最终将控制线程返回给浏览器。尽管如此,我认为这是一个很好的抽象。 |
![]() |
11
1
如果你必须调用一个异步操作,并在得到结果之前暂停执行,你通常会轮询结果,或者将其余代码放入回调中,以便在完成时由异步操作执行。使用continuation,您不需要执行低效的轮询选项,也不需要将异步事件后要运行的所有代码打包在回调中——您只需将代码的当前状态作为回调传递——异步操作完成后,代码就会被有效地“唤醒”。 |
![]() |
12
0
延续可用于实现异常,即调试器。 |