这与 什么是呼叫/抄送?, ,但我不想为了自己的目的而劫持这个问题,并且它的一些论点(例如 setjmp/longjmp 的类比)回避了我。

我认为我对延续是什么有足够的了解,我将其视为当前调用堆栈的快照。我不想讨论为什么这可能很有趣或者你可以用 Continuation 做什么。我的问题更具体地说,为什么我必须为 call/cc 提供函数参数?为什么 call/cc 不只返回当前的延续,这样我就可以用它做任何我想做的事(存储它,调用它,你能想到的)?在另一个问题的链接中(http://community.schemewiki.org/?call-with-current-continuation-for-C-programmers),它谈到“本质上,这只是一种干净的方式来让你继续,并避免后续跳转回保存点。”,但我不明白。这似乎不必要地复杂。

有帮助吗?

解决方案 4

针对常见的SO网络礼节我回答我的问题,但更多的编辑比答案的提供者。

过了一会儿,我开始一个类似的问题在以上 LTU 。毕竟,这些都是思考语言的设计整天的家伙,是不是和的 最后用我踢的答案。现在,这里提到的东西,例如由礼还是在原来的问题,使更多的意义对我来说。这是所有关于什么被包含在延续,其中施加的延续集

其中海报在LTU写道:

  

“你可以看到究竟是如何调用/立方厘米让你‘保留的方式。’有了EM或得到你需要做一些测试,以确定/立方厘米,如果你有一个回跳或刚刚起步打电话,基本上,呼叫/立方厘米保持使用延续了延续,而与GET / cc或EM,延续包含它的使用等(通常情况下),你需要一个测试增加了延续的开始(即立即以下get /立方厘米/ EM)到“使用延续份”从零件“的延续的其余”分离“。

这是开车回家给我。

感谢你们呢!

其他提示

如果您使用像 Jay 显示的构造,那么您可以获取延续,但在某种程度上,获取的值已经被破坏,因为您已经在该延续中。相比之下, call/cc 可用于获取延续 仍然 当前表达式之外的待处理。例如,延续的最简单用途之一是实现一种 abort:

(call/cc (lambda (abort)
           (+ 1 2 (abort 9))))

您无法通过您所描述的操作来做到这一点。如果你尝试一下:

(define (get-cc) (call/cc values))
(let ([abort (get-cc)]) (+ 1 2 (abort 9)))

然后你会收到关于申请的错误 9 作为一个程序。发生这种情况是因为 abort 跳回到 let 的新值 9 -- 这意味着您现在正在执行第二轮相同的加法表达式,只不过现在 abort 一定会 9...

另外两个相关注释:

  1. 有关延续的实用介绍,请参阅 聚乳酸.
  2. call/cc 有点复杂,因为它接受一个函数——概念上更容易使用的构造是 let/cc 您可以在 PLT 方案等一些实现中找到它。上面的例子就变成了 (let/cc abort (+ 1 2 (abort 9))).

这将是通用性较差。如果你想要的行为,你可以做:

(call/cc (lambda (x) x))

您可以看看在延续的示例用法“达雷尔弗格森和德怀特Deugo。‘与目前的延续形态通话’。在节目的模式语言第八届会议2001年9月。” ( http://library.readscheme.org/page6.html ),并尝试将它们重写使用呼叫/ cc的回报,如上所定义。

我建议你开始问自己:这是什么意思是一个一流的延续

表达式的延续基本上由两个部分组成的数据:第一,闭合(即,环境),其表达的;第二,什么应与表达式的结果进行表示。用一流延续一种语言,然后,是一个具有数据结构封装这些部件,并且其只是将这些数据结构,因为这将任何其他

呼叫/ cc的是实现这样的想法特别优雅的方式:当前的延续被包装起来作为封装什么-是-待完成与 - 的表达什么的过程不会在应用于程序表达方式;来表示延续这种方式简单地意味着该过程的闭合含有它被调用的站点上的环境。

您能想象实现在其他方面的一流延续的想法。他们不会被调用/立方厘米,这是我很难想象这样的表现如何能更简单。

在分模注,考虑设的执行/ cc的以利所提到的,这是我宁愿调用bind /立方厘米:

(define-syntax bind/cc
    (syntax-rules ()
        ((bind/cc var . body)
             (call/cc (lambda (var) . body)))))

和作为一个练习,你会如何基于绑定/立方厘米实现来电/立方厘米?

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top