我有一些麻烦了解以下行为 方案程序:

(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来代替,因此你不能说它是第三次了。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top