问题标签 [callcc]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
5 回答
6599 浏览

haskell - 呼叫/抄送实施?

我试图找出 call/cc 是如何实现的。我发现的最好的是这个 Haskell 片段:

Cont尽管由于and ,这并不像我想要的那么简单runCont。我还找到了关于它的功能的描述,尽管从来没有实际代码那么清晰。

那么它是如何以最简单的形式实现的呢?我用 Scheme 和 Haskell 标记它,因为这是我更喜欢的两种语言。

0 投票
3 回答
517 浏览

functional-programming - 是否可以使用 call/cc 来实现递归?

我想知道是否可以定义一个递归函数而不在其主体中调用函数本身,而是以某种方式使用 call/cc 来代替?谢谢。

0 投票
1 回答
250 浏览

scheme - 经验丰富的 Schemer 的 get-first、get-next 和 waddle 函数

对于任何不熟悉“The Seasoned Schemer”一书的人来说get-firstget-next、 和waddle(最后两个未在此处定义)显然是对协程建模以遍历传递给仅产生叶子的树的过程。waddle就在waddle倒数第二次重新进入的 y​​ield 之前,它将重新进入点设置为它只会返回纯值的位置,即is实际值'()不是yield ,就好像它是一直都是纯函数。 '()waddle '()

考虑到这一点,我们可以看到get-first设置了什么......当waddle返回“真实”时,它将在call/ccin内部get-first,然后(leave (quote ()))get-first(并且,反过来,这leave旨在返回到get-next最后一次迭代,因此,它是)get-next的“实际”回报'()

那么为什么第二个版本不等价,其中waddle的值'()将是 的参数leave

0 投票
0 回答
77 浏览

ruby - 使用 callcc 的 Ruby Enumerator 不会终止

Enumerable#take鉴于我的枚举器,我很难弄清楚为什么永远不会终止:

快速浏览一下enum.c,看起来args[1]中的计数器可能正在重置为请求的初始长度,导致迭代永远不会在第2019行终止。我的理解是,当枚举器的内部光纤产生 (at yielder << x) 时,应该恢复堆栈,因此我c.call ...不应该成为问题(尽管它暂时设置args[1]回原始长度参数)......但这似乎不是就是这样。

谁能解释为什么fib.take(n)永远不会因某些 n > 1 而终止?callcc关于我可能在这里遗漏的工作原理,是否有一些基本的东西?

注意:这是在 Ruby 1.9.3 上。是的,我意识到我的使用callcc有点愚蠢:)。

0 投票
2 回答
812 浏览

scheme - 方案,电话/抄送

因此,我试图call/cc在 Scheme 中弄清楚这一切。以下是我正在使用的代码:

所以在这里我们开始在第一个括号中添加两个参数。1其余的我们必须评估,因为急切的评估。所以我们有一个call/cc接受一个参数的函数,一个函数,它call/cc通过调用来评估。(我说的对吗?)同时它包含了到目前为止在我们的第一个括号中发生的其余部分,即(+ 1 []),它是“延续”。(我说的对吗?)所以我们k用我刚才描述的延续来调用 lambda (+ 1 []),. 然后在函数中询问这是否是一个数字,它不是并且执行“then”。我在这里“迷路”了,这一秒call/cc做什么?调用什么(k 4)来使整个事情评估为5

0 投票
1 回答
91 浏览

scheme - 实现返回函数

我正在尝试return在 Scheme R6RS 中实现一个功能。我想要这样的东西:

执行(do-some-job-before),不执行 (do-some-job-after)和 lambda 函数的最终值some-value

我想我必须使用延续。我试过了:

但它不起作用;例如

我怎样才能做到这一点?

0 投票
1 回答
812 浏览

scheme - 方案:嵌套调用/cc 如何为协程工作?

我正在查看来自http://community.schemewiki.org/?call-with-current-continuation的协程的以下示例:

多余的工作:

对于 call/cc 的第一次使用,上下文应该是什么?当我说上下文时,我的意思是由于 callcc 的跳转,我们应该“返回”到哪里?

据我了解,第一次调用 call/cc 时,do-other-stuff 本质上变成了一个过程,执行多余计算的代码,然后在集合之后立即跳转到该点!(A点)。第二次,它将“跳转到 B 点”行为包裹在“跳转到 A 点并执行上下文,或 A 点之后的任何代码”周围。它是否正确?

如果设置,此代码似乎不起作用!实际发生了。或者是套装!这段代码有必要工作吗?

对正在发生的事情进行可视化表示确实会有所帮助。

0 投票
3 回答
21338 浏览

javascript - 延续和回调有什么区别?

我一直在浏览整个网络以寻找关于延续的启示,令人难以置信的是,最简单的解释如何完全让像我这样的 JavaScript 程序员感到困惑。当大多数文章用 Scheme 中的代码解释延续或使用 monad 时,尤其如此。

现在我终于认为我已经理解了延续的本质,我想知道我所知道的是否真的是事实。如果我认为是真的不是真的,那是无知而不是开悟。

所以,这就是我所知道的:

在几乎所有语言中,函数都显式地将值(和控制)返回给它们的调用者。例如:

现在在具有一流函数的语言中,我们可以将控制权和返回值传递给回调,而不是显式返回给调用者:

因此,我们不是从一个函数返回一个值,而是继续另一个函数。因此这个函数被称为第一个函数的延续。

那么延续和回调有什么区别呢?

0 投票
1 回答
404 浏览

math - 方案中的魔方

我仍然是 Scheme 的新手,并试图通过 call/cc 和 amb 运算符来解决魔方。目前,它正在打印:

我不明白为什么它只使用这些数字。是我的与众不同吗?程序?这是我的代码:

0 投票
1 回答
408 浏览

scheme - 使用 call/cc 进行循环。让 vs 开始

以下两个代码块都应该(在我看来)是无限循环

这有效

这不起作用:

唯一的区别是一个使用 lambda 和一个使用 begin 块。为什么第二个代码块不起作用?

谢谢