2

以下两个代码块都应该(在我看来)是无限循环

这有效

(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 块。为什么第二个代码块不起作用?

谢谢

4

1 回答 1

6

在第二种情况下,将begin其参数拼接到顶层。请注意,有两种begin:如果它在表达式位置,它只是一个接一个地对操作进行排序。第二种(这就是你所拥有的)会将它的所有参数拼接到周围的上下文中。

拼接call/cc表达式的延续实际上是空延续,因为每个顶级表达式都是单独评估的(即,在空延续中)。let您可以通过在周围放置 a 来检查这一点begin,这会强制它处于表达式位置。然后它会像你期望的那样无限循环。

于 2013-04-16T23:44:41.703 回答