题
我有一些麻烦了解以下行为 方案程序:
(define c
(dynamic-wind
(lambda () (display 'IN)(newline))
(lambda () (call/cc (lambda (k)
(display 'X)(newline)
k)))
(lambda () (display 'OUT)(newline))))
据我所知,C将被绑定到右之前创建的continution “(显示“X)”。
但用c似乎修改了自己!上面打印的定义(如我所料)IN,X和OUT:
IN
X
OUT
和它是一个过程:
#;2> c
#<procedure (a9869 . results1678)>
现在,我希望,当它被再次调用,X将被打印出来,它不是!
#;3> (c)
IN
OUT
现在c不是一个程序了,和C的第二invokation将无法工作!
#;4> c ;; the REPL doesn't answer this, so there are no values returned
#;5> (c)
Error: call of non-procedure: #<unspecified>
Call history:
<syntax> (c)
<eval> (c) <--
我期待每个invokation至(c)将做同样的事情 - 打印IN,X,和OUT。我缺少什么?
解决方案
在球拍运行,这是一个多一点有所帮助:
-> (define c
(dynamic-wind
(lambda () (display 'IN)(newline))
(lambda () (call/cc (lambda (k)
(display 'X)(newline)
k)))
(lambda () (display 'OUT)(newline))))
IN
X
OUT
-> c
#<continuation>
-> (c)
IN
OUT
define-values: context (defining "c") expected 1 value, received 0 values
-> (c 99)
IN
OUT
-> c
99
请注意具体而言,是c
被绑定到一个延拓值 - 因为你的表达返回k
作为值。而k
本身就是价值的表达,这意味着这个延续是一个等待获得绑定到c
值的延续。所以调用它需要一个值,如球拍要求,这有助于澄清这里发生了什么(MIT计划似乎默默地把它当作不明)。无论如何,施加在装置99这延续,从该表达式返回值是99 - 让你跳回上下文(打印IN
),并返回99 束缚于c
和打印OUT
上你的出路。现在,您已经修改c
有99来代替,因此你不能说它是第三次了。
不隶属于 StackOverflow