call/cc 返回一个继续周围计算的函数。当它被调用时,控制权将返回到函数的来源处,并赋予函数一个值。
在示例中,(let ((p (call/cc (lambda (k) k)))) ...)
, p 被赋予一个延续函数。如果 p 被调用(p 3)
,控件将像以前一样返回到let
-form (let ((p 3)) ...)
。
((f 2) (f 4))
处理 (f 2) 和 (f 4) 的延续,导致无限循环。我试图解释下面的流程:
=> ((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