使用call / cc进行循环。让vs开始

时间:2013-04-16 22:42:39

标签: scheme racket continuations callcc

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

这有效

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

由于

1 个答案:

答案 0 :(得分:5)

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

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