【发布时间】:2019-09-11 06:43:07
【问题描述】:
我正在尝试了解 Scheme 中的 call/cc 运算符。我计划在我的 JavaScript lisp 中实现它。这是我的简单代码:
(letrec ((x 0)
(f (lambda (r)
(set! x r)
(display (r 20))
(display "10"))))
(display (call/cc f))
(x "30"))
我坚持它应该打印 20 然后 30 然后 10。但它会创建无限循环(它会继续打印 30)。这段代码应该如何显示 3 个值,调用 display 3 次?
是否可以创建不消耗堆栈的循环?
我找到了一些example on stack overflow,但这个根本不起作用:
(define x 0) ; dummy value - will be used to store continuation later
(+ 2 (call/cc (lambda (cc)
(set! x cc) ; set x to the continuation cc; namely, (+ 2 _)
3))) ; returns 5
(x 4) ; returns 6
它冻结了 100% CPU 的 guile 解释器,它看起来正在等待输入。
【问题讨论】:
-
“它冻结了 100% CPU 的 guile 解释器” - 不,它没有。至少在我看来,它按预期工作,最终
(x 4)评估为6。
标签: scheme continuations callcc