2

我一直在阅读call-with-current-continuation特别是关于 Scheme 的内容,并阅读了许多网站上的各种文章。但是,我仍然不明白使用call-with-current-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))))

此外,当使用此过程运行时((f 2) (f 4)),会导致无限循环,其模式如下:

在此处输入图像描述

谁能解释无限循环背后的原因?注意:将 Drracket 与 R5RS 一起使用

4

1 回答 1

0

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
  
于 2021-01-21T21:07:28.400 回答