1

我是 Scheme 编程的新手,并且一直在尝试了解其中具有 call-with-current-continuation 的程序的控制流程。更具体地说,我想知道何时调用对任何延续的调用,控制权转移到哪里以及之后会发生什么。如果考虑下面提到的程序进行解释,那将非常有帮助。

(define call/cc call-with-current-continuation)

(define amb-exit '())

(define amb
 (lambda ()
    (call/cc
      (lambda (m)
       (call/cc
         (lambda (f1)
           (set! amb-exit (lambda () (f1 'exit)))
           (m 1)))
       (call/cc
         (lambda (f2)
           (set! amb-exit (lambda () (f2 'exit)))
           (m 2)))
       (call/cc
         (lambda (f3)
           (set! amb-exit (lambda () (f3 'exit)))
           (m 3)))))))

(define back (lambda () (amb-exit)))

现在,我尝试以这种方式运行代码(define a (amb)),然后像这样在终端中获取值;Value: a。然后在终端中检查a返回 me的值;Value: 1。然后我打电话给(back)我得到a新的价值;Value: 2。很快...

我知道,当我这样做时,在将控制权转移回第一个内部的语句中调用了(define a (amb)延续,延续返回。f1(set! amb-exit (lambda () (f1 'exit)))call/ccf1exit

我无法理解的是为什么;Value: ais而不是返回;Value: 1的值?当这部分被执行时,控制权返回到第一个内部调用/cc,放弃它之后的任何东西(在这种情况下)。所以,这部分永远不应该被调用,因为第一个内部延续 ie甚至在点击之前就返回了。exitf1(f1 'exit)(m 1)(m 1)f1exit(m 1)

任何有关 Scheme 中的 call-with-current-continuation 的有用评论也将不胜感激。

注意:使用 MIT/GNU 方案

4

1 回答 1

1

不,当你这样做时,不会调用(define a (amb))延续f1,因为它在 a 后面(即在里面)lambda

不,(set! amb-exit (lambda () (f1 'exit)))设置amb-exit为 lambda 函数,然后控制传递给(m 1)调用 continuation的函数m1(amb)in返回(define a (amb)),因此设置a1

当您稍后调用(back)(amb-exit)时,调用 which 将调用从表单返回值的f1延续。该值被丢弃,控制权传递到表单中,具有类似的效果。(f1 'exit)'exit(call/cc (lambda (f1) ...))(call/cc (lambda (f2) ...))

于 2018-10-28T18:05:26.703 回答