以下两个代码块都应该(在我看来)是无限循环
这有效
(define call/cc call-with-current-continuation)
(define l 0)
(define i 0)
((lambda ()
(call/cc
(lambda (k)
(set! l k)))
(write i)
(newline)
(set! i (+ i 1))
(l "ignore")))
这不起作用:
(define call/cc call-with-current-continuation)
(define l 0)
(define i 0)
(begin
(call/cc
(lambda (k)
(set! l k)))
(write i)
(newline)
(set! i (+ i 1))
(l "ignore"))
唯一的区别是一个使用lambda,一个使用begin块。 为什么第二个代码块不起作用?
由于
答案 0 :(得分:5)
在第二种情况下,begin
将其参数拼接到顶层。请注意,有two kinds of begin
:如果它在表达式位置,它只是一个接一个地对操作进行排序。第二种(这就是你所拥有的)将其所有参数拼接到周围的上下文中。
拼接call/cc
表达式的延续实际上是空的延续,因为每个顶级表达式是单独计算的(即,在空的连续中)。您可以通过在let
周围加begin
来检查这一点,这会强制它处于表达式位置。然后它会像你期望的那样无限循环。