gpt4 book ai didi

language-agnostic - 了解无分隔的延续

转载 作者:行者123 更新时间:2023-12-04 07:48:44 25 4
gpt4 key购买 nike

假设,我有以下代码(类似 C 的语法):

void foo(int arg) { ... }int bar() {...// call with continuation ...}foo ( bar() )// after foo invocation

1) 函数 foo 调用函数 bar,该函数一直运行到 call with continuation 行。

2) 在这一行创建了一个 continuation 函数。它代表 barfoo 的其余部分。 continuation 函数作为参数传递给 call with continuation 函数。

3) call with continuation 函数对参数做任何它想做的事情(例如,它可能只是存储在一个全局变量中)并返回。

4) 一旦 call with continuation 返回,我们立即跳转到“after foo invocation”以及 barfoo 不被执行。

5) 为了继续执行 barfoo 我们应该显式调用 continuation 函数(在 (2) 中创建并且可能存储在(3))。一旦 continuation 函数被调用,执行将在 call with continuation 之后立即继续。

是否正确?我是否遗漏了有关无分隔符延续的内容?

最佳答案

没有。通常,当您调用 continuation 时,未分隔的延续(例如使用 Scheme 的 call/cc 创建)跳转,而不是当您调用 call/cc 时(又名call-with-current-continuation).

因此,充实您的示例:

continuation savedk;

void foo(int arg) { ... }

int bar() {
...
call/cc(handler)
// after call/cc
println "after call/cc"
...
}

void handler(continuation k) {
savedk = k
}

foo ( bar() )
// after foo invocation
  1. 执行开始。我们输入 bar(我们还没有输入 foo;我们将在完成 bar 后输入)。

  2. 当我们在 bar 中调用 call/cc 时,“程序上下文”变成了一个称为延续的对象。此时,程序上下文包括“完成 bar 的执行,然后对结果调用 foo,然后执行 foo 之后的任何操作调用”。延续被传递给作为参数给 call/cc 的函数,在我上面的示例中是 handler

  3. handler 对延续做一些事情。让我们假设它将它存储在一个全局变量中。然后它返回到 call/cc 调用之后的点,仍在 bar 内。

  4. 假设此时我们打印了一些东西。然后 bar 结束,我们调用 foo,它结束。

  5. 如果我们现在在 savedk 中应用延续,控制跳回到 bar 并将程序上下文恢复为“完成执行 bar,然后对结果调用 foo,然后执行 foo 调用之后发生的任何事情”。所以我们打印了另一行。事实上,如果我们不清除 savedk 变量或测试其他状态,如果调用“do whatever comes after the foo invocation”,我们可能会陷入无限循环再次savedk!

关于language-agnostic - 了解无分隔的延续,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6070431/

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