问题标签 [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.
scheme - 执行以下 call/cc 表达式
我使用球拍,我得到了4
以下简单代码的结果:
我打算一步一步地执行这段代码。
首先,我将第一个更改let/cc
为如下形式call/cc
:
当然,这4
也产生了。
其次,因为我call/cc
在互联网上找到了说call/cc
做以下4个步骤的机制:
- 捕获当前的延续。
- 构造一个
C
接受一个参数的函数,并使用该参数值应用当前延续。 - 将此函数作为参数传递给
expr
--- 即,它调用(expr C)
. - 返回评估的结果
(expr C)
,除非expr
调用C
,在这种情况下C
返回传递给的值。
因此,我首先按照上述步骤进行call/cc
操作:
- 当前的延续是一种身份。
C
指(λ (x) x)
.由于
/li>expr
是(λ (done) ((let/cc esc (done (+ 1 (let/cc k (esc k))))) 3))
,(expr C)
是:为了返回上面代码的结果值,我在上面执行了球拍。
但是,上面的代码(由我修改)没有执行并产生错误:
请问我做错了什么。我混淆了延续的概念。谢谢。
ruby - 检查点和恢复 Ruby 中的堆
Rubycallcc
捕获当前的延续,随后可以调用它来恢复控件,但不能恢复数据。我想捕捉当前的延续以及内存的当前图像。
在我看来,捕获堆应该不是很困难。我可以依赖ObjectSpace::each_object
and ObjectSpace::dump_all
, or Marshal.dump
,或者只是简单Object.clone
的 。但是,我没有看到任何直接的方法来恢复堆。理想情况下,我想遍历object_id -> object
地图,为每个对象恢复旧图像object_id
(并重新添加object_id
相应对象是否已被 GC'd)。不出所料,没有 Ruby 级别的 api 可以让我这样做。我想知道是否有任何我可以使用的 Ruby GC 的低级钩子。
感谢您提供任何帮助,包括有关替代方法的建议。
scheme - let 块中 call/cc 的延续是什么
我遇到了一个使用 call/cc 解释 Continuations 的片段。在下面提供的代码段中,由 call/cc 调用的 fn 的延续是整个 let 块,还是 call/cc 下面的行?也有人可以解释为什么不提供整个 let 块作为延续?
javascript - 如何应用 callcc 以便它提供转义延续机制以与延续单子一起使用
我尝试在 Javascript 中实现延续单子来处理延续传递风格和异步控制流。这是我学习的延续单子:
除了cont.ap
,他的好处并没有向我展示,一切都很好。
现在我想模仿Javascript中同步控制流的throw
/catch
机制。callcc
似乎很合适,因为它提供了一种转义延续机制,可与延续单子一起使用,如http://hackage.haskell.org/所述。
但我不知道如何申请callcc
,也没有找到任何合适的资料来描述这样的申请。
ruby - ruby中的callcc导致无限循环?
我正在尝试复习课堂幻灯片。该代码应该打印一次“早期工作”,然后打印两次“后期工作”(您可以设置后期工作的重复次数)。但我想知道为什么这段代码不起作用,我该如何修改代码?由于现在代码将生成“稍后工作”的无限循环,而不是 2(应该是)
scheme - 是什么让这个 lwp 程序的动作与直接在命令行中加载和使用加载过程不同?
我guile 2.0.13
用作我的方案解释器,我写的文件3.3.3.scm
如下:
3.3.3.scm
如果我(load "3.3.3.scm")
在交互式界面中使用,似乎运行正常。但是当我直接运行时guile 3.3.3.scm
,程序quit
将在guile
第一次调用后被调用:
什么情况下有这个区别?
scheme - 先入为主的老谋深算者
请看two-in-a-row*?
第 19 章中的函数。
我的问题是关于辅助函数(leave '())
中的。get-first
请注意,(waddle l)
将返回'()
或返回原子,这表明列表已用尽或检索到列表中的原子。
没有(leave '())
它仍然会返回这两种值,只是不使用 continuation leave
。但是书上说没有(leave '())
就是不好的,我就是不明白为什么。
非常感谢。
关于这个问题的另一个有趣的步骤。
scheme - 将函数更改为 CPS,以不使用 call/cc
我想了解如何在没有call/cc
.
我从这个小例子开始了解如何修改代码以便我可以在不使用它的情况下使用它call/cc
:
当我使用它执行函数时,call/cc
它给了我5,然后当我执行时6(x 4)
。
我使用此功能替换call/cc
:
我试图将此功能更改为 CPS(连续传递样式):
但是当我执行它时,我得到3而不是5。但我确实得到了6个。(x 4)
你能告诉我有什么问题吗?谢谢你
scheme - 以延续传递方式转换协程
我有这个协程示例
我想在 CPS 中更改它,以便我可以使用 CPS call/cc :
我知道要在 CPS 中转换一个函数,我需要在函数中添加一个延续,但我很困惑,我真的不知道该怎么做。
我认为它看起来像这样:
但这可能是错误的。有人可以帮我理解如何正确地做到这一点吗?
谢谢