gpt4 book ai didi

lambda - 什么是调用/抄送?

转载 作者:行者123 更新时间:2023-12-03 06:10:22 25 4
gpt4 key购买 nike

我多次尝试去理解 continuations 的概念和 call/cc 。每一次尝试都失败了。有人可以向我解释一下这些概念吗?最好用比维基百科或其他帖子中的例子更现实的例子。

我有网络编程和面向对象编程的背景。我也了解 6502 汇编,并且与 Erlang 有过一次小小的邂逅。然而,我仍然无法全神贯注于 call/cc。

最佳答案

与 C 相比,当前延续就像堆栈的当前状态。它让所有函数等待当前函数的结果完成,以便它们可以恢复执行。作为当前延续捕获的变量像函数一样使用,只不过它获取提供的值并将其返回到等待堆栈。此行为类似于 C 函数 longjmp您可以立即返回到堆栈的较低部分。

这是一个用于说明的方案 REPL 交互:

> (define x 0) ; dummy value - will be used to store continuation later

> (+ 2 (call/cc
(lambda (cc)
(set! x cc) ; set x to the continuation cc; namely, (+ 2 _)
3))) ; returns 5
5

> (x 4) ; returns 6
6

C 堆栈和延续之间的一个关键区别是延续可以在程序中的任何点使用,即使堆栈的状态已更改。这意味着您基本上可以恢复堆栈的早期版本并一次又一次地使用它们,从而产生一些独特的程序流程。

(* 123 (+ 345 (* 789 (x 5)))) ; returns 7

reason: it is because (x 5) replaces the existing continuation,
(* 123 (+ 345 (* 789 _))), with x, (+ 2 _), and returns
5 to x, creating (+ 2 5), or 7.

保存和恢复程序状态的能力与多线程有很多共同点。事实上,您可以使用延续来实现您自己的线程调度程序,正如我试图说明的那样 here .

关于lambda - 什么是调用/抄送?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/612761/

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