问题标签 [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.
foreach - for-each 中的方案延续
我目前正在为我的大学的一门课程学习 Scheme,同时查看一些我被困在这个特定的练习上的练习。教授还没有回复我以前的邮件,因此我有更多机会在这里更快地收到答复。
鉴于此代码
我必须用它来编写iter
语法为的宏
例子:
由于我无法理解list-iter-cc
,我去看了解决方案,我也不明白。解决方案:
为了解开宏,我尝试编写以下内容
这正是我认为会发生的事情。
list-iter-cc
的返回延续在第一个 lambda 内的 for-each 的第一次迭代中被调用,返回cons x next-step
.
x
是列表的第一个元素,next-step
是一个延续。
1)。内容是next-step
什么?的以下迭代for-each
?在最后一次迭代之后如何评估'end
?
2)。假设在宏head (list-iter-cc lst)
is'(1 . #<continuation>)
中,汽车是1
并且它被显示,但在循环其cdr之后,var (car head)
将是延续的汽车!它怎么可能评估为2
and 3
then 'end
,以及为什么在我尝试编写以理解它的代码中不会发生这种情况?
任何帮助将不胜感激,尤其是可以逐步指导我的帮助。
python - Python 中的 call/cc — 可能吗?
说,我们在Scheme中有以下代码
打印类似的东西
假设我们想在 Python 中做同样的事情。http://wiki.c2.com/?ContinuationsInPython这种方法不起作用,因为它们只保存代码而不是堆栈。我试图实现我的版本call/cc
在 Python 中实现我的版本,保存和恢复堆栈上下文。我不能 100% 确定我是否正确实现了延续逻辑,但这现在并不重要。
我的想法是callcc
在构造函数中保存函数调用及其调用者的堆栈和指令指针,Continuation
然后在继续的__call__
方法中,重置保存的堆栈帧中的指令指针,将当前堆栈帧f_back
指针指向保存的堆栈帧并神奇地返回出现在调用的函数中callcc
。
问题是即使输出traceback.print_stack()
显示当前堆栈已被替换,代码仍然执行,就好像我根本没有触及当前堆栈一样。这是我的实现https://ideone.com/kGchEm
scheme - 计划的延续
这是代码:
这段代码简单地打印:你好。我不明白当我们这样做时会发生什么:
准确地说,当我们调用最后一个表达式时,Scheme 究竟做了什么。我的意思是我明白我们回到嵌套的 call/cc 但是为什么每次都需要一个新字符而不是旧字符?
我期待和无限打印字符“h”:hhhhhhh ...
谢谢您的帮助!
scheme - How does `values` work in Scheme?
From the R5RS standard:
My first interpretation of this was that an expression like (+ (values 1 2))
is equivalent to (apply + '(1 2))
and would yield the result 3
. But, according to my tests, this interpretation is not correct. Here is my interpretation of the code above: values
is a function taking any number of arguments, bundled into a list called things
. Then, the current continuation (the place where values
is used) is called with the list things
"unbundled".
What am I missing? The example above (+ (values 1 2))
gives an error or 1 depending on the interpreter I used.
exception-handling - 如何使 lambda 中的函数在 lambda 体内使用的另一个函数中被调用
我想使用 call/cc 来模拟异常处理语句:try...(throw)...exception。这是代码:
但是,当我执行它时,它显示了错误(在 biwascheme 中):
我认为 lambda 中的 throw 与被调用函数“month”中的 throw 不一样,但是,我该如何解决呢?是否可以通过使用一些关键字制作marco来解决?例如:
scheme - 具有当前继续调用的 Scheme 程序中的控制流
我是 Scheme 编程的新手,并且一直在尝试了解其中具有 call-with-current-continuation 的程序的控制流程。更具体地说,我想知道何时调用对任何延续的调用,控制权转移到哪里以及之后会发生什么。如果考虑下面提到的程序进行解释,那将非常有帮助。
现在,我尝试以这种方式运行代码(define a (amb))
,然后像这样在终端中获取值;Value: a
。然后在终端中检查a
返回 me的值;Value: 1
。然后我打电话给(back)
我得到a
新的价值;Value: 2
。很快...
我知道,当我这样做时,在将控制权转移回第一个内部的语句中调用了(define a (amb)
延续,延续返回。f1
(set! amb-exit (lambda () (f1 'exit)))
call/cc
f1
exit
我无法理解的是为什么;Value: a
is而不是返回;Value: 1
的值?当这部分被执行时,控制权返回到第一个内部调用/cc,放弃它之后的任何东西(在这种情况下)。所以,这部分永远不应该被调用,因为第一个内部延续 ie甚至在点击之前就返回了。exit
f1
(f1 'exit)
(m 1)
(m 1)
f1
exit
(m 1)
任何有关 Scheme 中的 call-with-current-continuation 的有用评论也将不胜感激。
注意:使用 MIT/GNU 方案
scheme - 如何在方案中使用延续?
我正在尝试了解 Scheme 中的 call/cc 运算符。我计划在我的 JavaScript lisp 中实现它。这是我的简单代码:
我坚持它应该打印 20 然后 30 然后 10。但它会创建无限循环(它会继续打印 30)。这段代码应该如何显示 3 个值,调用 display 3 次?
是否可以创建不消耗堆栈和延续的循环?
我找到了一些关于堆栈溢出的例子,但是这个根本不起作用:
它用 100% CPU 冻结了 guile 解释器,它看起来正在等待输入。
javascript - 如何在 JavaScript 等动态语言中实现延续?
我需要一些关于我应该如何在 JavaScript 中实现和实现嘴唇的延续(我的 lisp 几乎就像方案,除了没有延续和 TOC)。
这是我的评估功能:
笔记:
在评估延续的表达式时是否需要创建堆栈?我怎样才能做到这一点?我以为我以某种方式创建Continuation
了一个类,该类将处于两种模式中about 而不是评估调用延续的表达式之前的代码,例如:
(* 10 x)
需要被忽略
我也不确定我应该如何着手和创建call/cc
函数。它是否应该返回一些中间数据结构,并将其参数存储在该数据结构中,以便可以通过继续评估来调用它?
如果 eval 找到 CallCC 的实例,它会继续(不确定如何)使用
你会这样做吗?所以通常我的问题是关于堆栈的。是否需要继续?如果需要,那么应该如何创建它?
我发现这篇文章Writing a Lisp: Continuations展示了如何实现延续,但很难理解,因为它在 Haskell 中。
scheme - 任何使用 call/cc 的情况都可以在不使用的情况下等效地重写吗?
任何使用的情况都可以call/cc
在不使用的情况下等效地重写吗?
例如
在
(g (call/cc f))
, 的目的是f
评估 some 的价值expression
,以便g
可以应用于价值?是否
(g (call/cc f))
总是能够在没有call/cc
eg的情况下等效地重写(g expression)
?在
((call/cc f) arg)
中,目的是f
为了评估某个函数的定义g
,以便g
可以将函数应用于 的值arg
?是否
((call/cc f) arg)
总是能够在没有call/cc
eg的情况下等效地重写(g arg)
?
如果答案是肯定的,为什么我们需要使用call/cc
?我试图call/cc
通过将它与不使用它进行对比来理解使用它的目的。