gpt4 book ai didi

scheme - 通话/抄送的细节

转载 作者:行者123 更新时间:2023-12-04 10:13:19 29 4
gpt4 key购买 nike

这与 What is call/cc? 有关,但我不想为了自己的目的劫持这个问题,并且它的一些论点(例如与 setjmp/longjmp 的类比)回避了我。

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

最佳答案

如果你使用像 Jay 展示的结构,那么你可以捕获延续,但在某种程度上,被捕获的值(value)已经被破坏了,因为你已经在那个延续中。相比之下,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绑定(bind)到 9 ...

两个额外的相关说明:
  • 有关延续的实用介绍,请参阅 PLAI .
  • call/cc有点复杂,因为它包含一个函数——概念上更易于使用的构造是 let/cc您可以在 PLT Scheme 等一些实现中找到它。上面的例子变成了(let/cc abort (+ 1 2 (abort 9))) .
  • 关于scheme - 通话/抄送的细节,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1119914/

    29 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com