我正在尝试了解 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 次?
是否可以创建不消耗堆栈和延续的循环?
我找到了一些关于堆栈溢出的例子,但是这个根本不起作用:
(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 解释器,它看起来正在等待输入。