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

tim*_*mip 2 scheme continuations callcc racket

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

这有效

(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")))
Run Code Online (Sandbox Code Playgroud)

这不起作用:

(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"))
Run Code Online (Sandbox Code Playgroud)

唯一的区别是一个使用lambda,一个使用begin块.为什么第二块代码不起作用?

谢谢

Asu*_*awa 5

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

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