Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/webpack/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
具有当前延续调用的Scheme程序中的控制流_Scheme_Control Flow_Continuations_Callcc - Fatal编程技术网

具有当前延续调用的Scheme程序中的控制流

具有当前延续调用的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

我是Scheme编程的新手,一直试图理解调用当前延续的程序的控制流。更具体地说,我想知道什么时候调用任何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)))
现在,我尝试以这种方式运行代码
(定义一个(amb))
,然后我在终端中得到如下
的值;值:a
。然后在终端中,我检查
a
的值,该值返回我
;值:1
。然后我调用
(返回)
我得到一个带有新值
a
;值:2
。等等

我知道当我执行
(define a(amb)
时,会在语句
(set!amb exit(lambda()(f1'exit))
中调用continuation
f1
,该语句将控制权转移回第一个内部
call/cc
,而
f1
continuation返回
exit

我无法理解的是,为什么
;值:a
;值:1
而不是
f1
返回的值
exit
? 执行此部分
(f1'退出)
的那一刻,控制返回到第一个内部调用/cc,放弃它之后的任何内容(在本例中为
(M1)
)。 因此,不应调用此部分
(m1)
,因为即使在点击
(m1)
之前,第一个内部延续(即
f1
也会返回
exit

如果您对本计划中当前延续的呼叫有任何有用的意见,我们也将不胜感激

注意:使用MIT/GNU方案

否,当您执行
(定义一个(amb))
时,不会调用continuation
f1
,因为它位于
lambda
后面(即内部)

否,
(set!amb exit(lambda()(f1'exit))
amb exit
设置为lambda函数,然后控制传递到
(m1)
,该函数调用continuation
m
。该函数从
(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编译器。