问题标签 [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.
haskell - 呼叫/抄送实施?
我试图找出 call/cc 是如何实现的。我发现的最好的是这个 Haskell 片段:
Cont
尽管由于and ,这并不像我想要的那么简单runCont
。我还找到了关于它的功能的描述,尽管从来没有实际代码那么清晰。
那么它是如何以最简单的形式实现的呢?我用 Scheme 和 Haskell 标记它,因为这是我更喜欢的两种语言。
functional-programming - 是否可以使用 call/cc 来实现递归?
我想知道是否可以定义一个递归函数而不在其主体中调用函数本身,而是以某种方式使用 call/cc 来代替?谢谢。
scheme - 经验丰富的 Schemer 的 get-first、get-next 和 waddle 函数
对于任何不熟悉“The Seasoned Schemer”一书的人来说get-first
,get-next
、 和waddle
(最后两个未在此处定义)显然是对协程建模以遍历传递给仅产生叶子的树的过程。waddle
就在waddle
倒数第二次重新进入的 yield 之前,它将重新进入点设置为它只会返回纯值的位置,即is的实际值而'()
不是yield ,就好像它是一直都是纯函数。 '()
waddle
'()
考虑到这一点,我们可以看到get-first
设置了什么......当waddle
返回“真实”时,它将在call/cc
in内部get-first
,然后(leave (quote ()))
是get-first
(并且,反过来,这leave
旨在返回到get-next
最后一次迭代,因此,它是)get-next
的“实际”回报'()
。
那么为什么第二个版本不等价,其中waddle
的值'()
将是 的参数leave
?
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
有点愚蠢:)。
scheme - 方案,电话/抄送
因此,我试图call/cc
在 Scheme 中弄清楚这一切。以下是我正在使用的代码:
所以在这里我们开始在第一个括号中添加两个参数。1
其余的我们必须评估,因为急切的评估。所以我们有一个call/cc
接受一个参数的函数,一个函数,它call/cc
通过调用来评估。(我说的对吗?)同时它包含了到目前为止在我们的第一个括号中发生的其余部分,即(+ 1 [])
,它是“延续”。(我说的对吗?)所以我们k
用我刚才描述的延续来调用 lambda (+ 1 [])
,. 然后在函数中询问这是否是一个数字,它不是并且执行“then”。我在这里“迷路”了,这一秒call/cc
做什么?调用什么(k 4)
来使整个事情评估为5
?
scheme - 实现返回函数
我正在尝试return
在 Scheme R6RS 中实现一个功能。我想要这样的东西:
执行(do-some-job-before)
,不执行 (do-some-job-after)
和 lambda 函数的最终值some-value
。
我想我必须使用延续。我试过了:
但它不起作用;例如
我怎样才能做到这一点?
scheme - 方案:嵌套调用/cc 如何为协程工作?
我正在查看来自http://community.schemewiki.org/?call-with-current-continuation的协程的以下示例:
多余的工作:
对于 call/cc 的第一次使用,上下文应该是什么?当我说上下文时,我的意思是由于 callcc 的跳转,我们应该“返回”到哪里?
据我了解,第一次调用 call/cc 时,do-other-stuff 本质上变成了一个过程,执行多余计算的代码,然后在集合之后立即跳转到该点!(A点)。第二次,它将“跳转到 B 点”行为包裹在“跳转到 A 点并执行上下文,或 A 点之后的任何代码”周围。它是否正确?
如果设置,此代码似乎不起作用!实际发生了。或者是套装!这段代码有必要工作吗?
对正在发生的事情进行可视化表示确实会有所帮助。
javascript - 延续和回调有什么区别?
我一直在浏览整个网络以寻找关于延续的启示,令人难以置信的是,最简单的解释如何完全让像我这样的 JavaScript 程序员感到困惑。当大多数文章用 Scheme 中的代码解释延续或使用 monad 时,尤其如此。
现在我终于认为我已经理解了延续的本质,我想知道我所知道的是否真的是事实。如果我认为是真的不是真的,那是无知而不是开悟。
所以,这就是我所知道的:
在几乎所有语言中,函数都显式地将值(和控制)返回给它们的调用者。例如:
现在在具有一流函数的语言中,我们可以将控制权和返回值传递给回调,而不是显式返回给调用者:
因此,我们不是从一个函数返回一个值,而是继续另一个函数。因此这个函数被称为第一个函数的延续。
那么延续和回调有什么区别呢?
math - 方案中的魔方
我仍然是 Scheme 的新手,并试图通过 call/cc 和 amb 运算符来解决魔方。目前,它正在打印:
我不明白为什么它只使用这些数字。是我的与众不同吗?程序?这是我的代码:
scheme - 使用 call/cc 进行循环。让 vs 开始
以下两个代码块都应该(在我看来)是无限循环
这有效
这不起作用:
唯一的区别是一个使用 lambda 和一个使用 begin 块。为什么第二个代码块不起作用?
谢谢