首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在方案中使用call-with-current-continuation时的无限循环

在方案中使用call-with-current-continuation时的无限循环
EN

Stack Overflow用户
提问于 2018-10-15 07:24:48
回答 1查看 176关注 0票数 2

我一直在阅读关于call-with-current-continuation的文章,特别是在Scheme中,并在许多网站上阅读了各种文章。然而,我仍然不明白在使用call-with-current-continuation时控制流是如何工作的。

例如,给定下面的附加代码,如何调用延续,以及何时调用它,控件如何在此过程的主体中流动?

代码语言:javascript
复制
 (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))运行此过程时,它会导致无限循环,其模式如下:

谁能解释一下无限循环背后的原因?注意:在R5RS中使用Drracket

EN

回答 1

Stack Overflow用户

发布于 2021-01-22 05:07:28

Call/cc返回一个函数,该函数继续周围的计算。当它被调用时,控制返回到函数所在的位置,并为该函数提供一个值。

在这个例子中,(let ((p (call/cc (lambda (k) k)))) ...),p被赋予了一个连续函数。如果p当时被称为(p 3),则控件将返回到let-form,就像它是(let ((p 3)) ...)一样。

((f 2) (f 4))改变了(F2)和(F4)中的延续,导致了无限循环。我已经尝试解释了下面的流程:

代码语言:javascript
复制
=> ((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
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52807955

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档