我是 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/cc
f1
exit
我无法理解的是为什么;Value: a
is而不是返回;Value: 1
的值?当这部分被执行时,控制权返回到第一个内部调用/cc,放弃它之后的任何东西(在这种情况下)。所以,这部分永远不应该被调用,因为第一个内部延续 ie甚至在点击之前就返回了。exit
f1
(f1 'exit)
(m 1)
(m 1)
f1
exit
(m 1)
任何有关 Scheme 中的 call-with-current-continuation 的有用评论也将不胜感激。
注意:使用 MIT/GNU 方案