在Scheme中使用当前延续调用时的无限循环

在Scheme中使用当前延续调用时的无限循环,scheme,infinite-loop,continuations,callcc,Scheme,Infinite Loop,Continuations,Callcc,我一直在阅读关于当前续集的通话,特别是在Scheme中,并在许多网站上阅读了各种文章。但是,我仍然不明白在使用带有当前continuation的调用时,控制流是如何工作的 例如,给定下面附加的代码,如何调用continuation,以及每当调用continuation时,控件如何流经此过程的主体 (define call/cc call-with-current-continuation) (define showit (lambda (a b) (be

我一直在阅读关于当前续集的
通话
,特别是在Scheme中,并在许多网站上阅读了各种文章。但是,我仍然不明白在使用带有当前continuation的
调用时,控制流是如何工作的

例如,给定下面附加的代码,如何调用continuation,以及每当调用continuation时,控件如何流经此过程的主体

 (define call/cc call-with-current-continuation)
 (define showit (lambda (a b) 
                  (begin (display a) (display b) (display " "))))

 (define f
  (lambda (n)
     (let ((p (call/cc (lambda (k) k))))
         (begin
           (showit ’f= n)
          p))))
此外,当使用
((f2)(f4))
运行此过程时,它会产生如下模式的无限循环:

有人能解释无限循环背后的原因吗?
注意:将Drracket与R5RS一起使用,Call/cc将返回一个函数,该函数将继续进行周围的计算。调用该控件时,控件返回到获取函数的位置,并为该函数指定一个值

在这个例子中,
(let((p(call/cc(lambda(k)k))))…)
,p被赋予一个连续函数。如果随后调用p
(p3)
,控件将返回到
let
-表单,就像它是
(let((p3))…

((f2)(f4))
将(f2)和(f4)的连续体变戏法,从而产生无限循环。我试图解释以下流程:

=> ((f 2) (f 4))
  => (f 2) ;; first (f 2)
       call/cc returns the current continuation (lets say "cc1") into p
       display f=2
       return cc1
=> (cc1 (f 4))
  => (f 4) ;; first (f 4)
       call/cc returns the current continuation cc2 into p
       display f=4
       return cc2
=> (cc1 cc2)
     cc1 goes back to the first (f 2), but call/cc returns now cc2 into p
     display f=2
     returns cc2 from the first (f 2)
=> (cc2 (f 4))
  => (f 4) ;; second (f 4)
       call/cc returns cc3 into p
       display f=4
       return cc3
=> (cc2 cc3)
     cc2 goes back to the first (f 4), but p gets cc3
     display f=4
     returns cc3 from the first (f 4)
=> (cc1 cc3)
     cc1 goes back to the first (f 2), but p gets cc3
     display f=2
     returns cc3 from the first (f 2)
=> (cc3 (f 4))
  => (f 4) ;; third (f 4)
       display f=4
  <= cc4
=> (cc3 cc4)
  => (f 4) ;; second again
       display f=4
  <= cc4
=> (cc2 cc4)
  => (f 4) ;; first again
       display f=4
  <= cc4
=> (cc1 cc4)
  => (f 2) ;; first again
       display f=2
  <= cc4
=> (cc4 (f 4))
  => (f 4) ;; fourth (f 4)
       display f=4
  <= cc5
...so on
  
=>((F2)(F4))
=>(f2);;第一(F2)
call/cc将当前的延续(比如说“cc1”)返回到p中
显示f=2
返回cc1
=>(cc1(F4))
=>(f4);;第一(f 4)
call/cc将当前延续cc2返回到p
显示f=4
返回cc2
=>(cc1 cc2)
cc1返回到第一个(F2),但call/cc现在将cc2返回到p
显示f=2
从第一个(f 2)返回cc2
=>(cc2(F4))
=>(f4);;第二(f 4)
call/cc将cc3返回到p
显示f=4
返回cc3
=>(cc2 cc3)
cc2返回到第一个(F4),但p得到cc3
显示f=4
从第一个(f 4)返回cc3
=>(cc1 cc3)
cc1返回到第一个(F2),但p得到cc3
显示f=2
从第一个(f 2)返回cc3
=>(cc3(F4))
=>(f4);;第三(f 4)
显示f=4
(cc3 cc4)
=>(f4);;第二次
显示f=4
(cc2 cc4)
=>(f4);;再次
显示f=4
(cc1 cc4)
=>(f2);;再次
显示f=2
(cc4(f 4))
=>(f4);;第四(f 4)
显示f=4