gpt4 book ai didi

javascript - CallCC 是 goto 的改进版本吗?

转载 作者:行者123 更新时间:2023-11-28 16:55:50 24 4
gpt4 key购买 nike

我的背景是 Javascript、Python 和一点 Haskell。我试图理解 callCC,有很多解释,但我找不到它们微不足道,我遇到了这个 https://www.cs.bham.ac.uk/~hxt/research/Logiccolumn8.pdf我觉得我几乎明白了,但我需要一些帮助来理解 C 代码。

下面是跳转回 GNU C 函数的代码。

void *label_as_result() {
return &&L;
L: printf("Jumped back into the function. \n");
}

main () {
void *p;
p = label_as_result();
printf("The function returned; now jump back into it.\n");
goto *p;
}

return 语句在 label_as_result 函数中起什么作用? ma​​in 中的 p 是否将堆栈帧存储在堆中以及停止的指令行中? 跳回函数意味着再次创建一个堆栈帧并从我们离开的地方继续?

这段代码下面有一段

But in a language with first-class functions and callCC, no such implementation restrictions apply. Just as with the label as a result in C, we can return a continuation introduced by callCC from a function so as to jump back into the function. When we did this with goto, the stack was smashed, but with callCC the function just returns again. Consider the following function

 λ(). callCC(λk. λx. throw k (λy. x))

The continuation k is returned as part of the result, roughly analogous to returning a label as the result in C.

什么叫stack was bad,他的意思是如果你使用goto就会发生stackoverflow? callCC 如何使用蹦床解决这个问题?

正如许多人所说,callCC 提供了早期返回语义,这意味着它类似于 python 或 Javascript 中的 Yield 吗?是否可以使用yield 在Javascript 中编写callCC?

我如何在 Javascript 中构思上述代码

function* label_as_result() {
yield () => console.log("Jumped back into the function.");
}

p = label_as_result().next().value;
console.log("The function returned; now jump back into it.");
p();

它甚至可以简单地编写为没有任何生成器概念的

function label_as_result() {
return () => console.log("Jumped back into the function.");
}

p = label_as_result();
console.log("The function returned; now jump back into it.");
p();

这意味着 callCC 是一个返回延续的函数,但所有其他函数都采用延续。Continuations 就像需要在未来执行的未决定的代码,但是 callCC 就像需要在未来执行的预定义代码? (我是从框架和用户代码的 Angular 来谈论的)

最佳答案

What does return statement do in label_as_result function?

它返回标记为L的指令的地址。也就是说,它返回编译器为 printf("Jumped back into the function.\n"); 生成的代码在内存中存储的地址。

Does p in main store the stack frame in heap & the instruction line where it is stopped?

不,它存储L标签所在的指令行。这就是它存储的全部内容。

Jump back to function means create a stack frame again and continue from where we left?

不,这意味着一次跳转,仅此而已 - 没有堆栈操作。控制流跳转到标记为 L 的行,但没有其他任何变化。堆栈保持不变。

What does stack was smashed, he meant stackoverflow can happen if you use goto?

实际上是下溢。当label_as_result被调用时,一个帧被压入堆栈。当它返回时,该框架被弹出。然后我们跳转到L,执行printf,然后到达函数末尾,这将再次弹出堆栈。所以最终堆栈弹出的次数比压入的次数多。

How callCC is getting around this problem

通过实际执行您假设的 C 代码正在执行的操作:保存并恢复堆栈,而不是仅仅跳转到代码行,同时保持堆栈相同。

As many say callCC gives Early return semantics that means is it like yield in python or Javascript?

它们在某种意义上是相似的,它们都给你一种提前返回,并且它们可以用于一些相同的事情。您可以将 yield 视为一种更专业的工具,旨在提供一种更简单的方法来实现 callCC 的一些用例。

Is it possible to write callCC in Javascript using yield?

不可以,但可以使用callCC在Scheme中写入yieldcallCC 严格来说是两者中更强大的一个。

How I conceive the above code in Javascript

实际的 C 代码无法在 JavaScript 中复制(除非通过构建具有自己的堆栈的迷你虚拟机),因为 JavaScript 不允许您像这样销毁堆栈。

可以通过从 label_as_result 返回一个函数来实现不破坏堆栈的完整版本,就像在第二个代码示例中所做的那样。

That means callCC is a function that returns a continuation

callCC 是一个使用当前延续调用另一个函数的函数。这可用于返回延续。

Continuations are like Undecided code that need to be performed in future

当然,但我不会在这里说“需要”。您不必调用延续(或者您甚至可以多次调用它)。

but callCC is like predefined code that needs to be performed in Future?

不太清楚你的意思,但这听起来不对。 callCC 是一个让您可以访问当前延续的函数。

关于javascript - CallCC 是 goto 的改进版本吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59234399/

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