具有当前延续调用的Scheme程序中的控制流
我是Scheme编程的新手,一直试图理解调用当前延续的程序的控制流。更具体地说,我想知道什么时候调用任何continuation,控制权转移到哪里,之后会发生什么。如果考虑使用下面提到的程序进行解释,这将非常有帮助具有当前延续调用的Scheme程序中的控制流,scheme,control-flow,continuations,callcc,Scheme,Control Flow,Continuations,Callcc,我是Scheme编程的新手,一直试图理解调用当前延续的程序的控制流。更具体地说,我想知道什么时候调用任何continuation,控制权转移到哪里,之后会发生什么。如果考虑使用下面提到的程序进行解释,这将非常有帮助 (define call/cc call-with-current-continuation) (define amb-exit '()) (define amb (lambda () (call/cc (lambda (m) (call/cc
(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)))
现在,我尝试以这种方式运行代码(定义一个(amb))
,然后我在终端中得到如下的值;值:a
。然后在终端中,我检查a
的值,该值返回我;值:1
。然后我调用(返回)
我得到一个带有新值的a
;值:2
。等等
我知道当我执行(define a(amb)
时,会在语句(set!amb exit(lambda()(f1'exit))
中调用continuationf1
,该语句将控制权转移回第一个内部call/cc
,而f1
continuation返回exit
我无法理解的是,为什么;值:a
是;值:1
而不是f1
返回的值exit
?
执行此部分(f1'退出)
的那一刻,控制返回到第一个内部调用/cc,放弃它之后的任何内容(在本例中为(M1)
)。
因此,不应调用此部分(m1)
,因为即使在点击(m1)
之前,第一个内部延续(即f1
也会返回exit
)
如果您对本计划中当前延续的呼叫有任何有用的意见,我们也将不胜感激
注意:使用MIT/GNU方案否,当您执行(定义一个(amb))
时,不会调用continuationf1
,因为它位于lambda
后面(即内部)
否,(set!amb exit(lambda()(f1'exit))
将amb exit
设置为lambda函数,然后控制传递到(m1)
,该函数调用continuationm
。该函数从(amb)
中返回1
(定义一个(amb)),从而将a
设置为1
当您稍后调用
(back)
时,它调用(amb exit)
,此时调用f1
与(f1'exit)
的延续,该延续返回(call/cc(lambda(f1)…)
表单中的值(call/cc(lambda(f1)…))
。放弃该值,并将控制传递到(call/cc(lambda(f2)…))
form,具有类似的效果。谢谢你的回答。只是澄清一下,每当控件到达(lambda()(f1'退出))这样的点时,这是否意味着lambda函数将在不执行其主体的情况下返回,并且稍后当使用该lambda设置为的任何变量调用该lambda时,将对lambda函数的主体进行求值?是的,与往常一样,对表单进行求值(set!amb exit(lambda()(f1'exit)))
表示对参数求值,即查找其值和(lambda()(f1'exit))的值
是一个lambda函数。只有在以后调用该lambda函数时,才会输入它的主体并计算它的形式。我已经解释了几次call/cc
,但我认为这是最简单的。理解call/cc
需要一段时间,它确实有助于实现基本的scheme编译器。