Scheme 动态风的帮助和呼叫/抄送

Scheme 动态风的帮助和呼叫/抄送,scheme,racket,continuations,Scheme,Racket,Continuations,我在理解以下行为时遇到一些困难 计划大纲: (define c (dynamic-wind (lambda () (display 'IN)(newline)) (lambda () (call/cc (lambda (k) (display 'X)(newline) k))) (lambda () (display 'OUT)(newline)))) 据我所知,c将绑定到在“(di

我在理解以下行为时遇到一些困难 计划大纲:

(define c
  (dynamic-wind
    (lambda () (display 'IN)(newline))
    (lambda () (call/cc (lambda (k)
                     (display 'X)(newline)
                     k)))
    (lambda () (display 'OUT)(newline))))
据我所知,c将绑定到在“(display'X)”之前创建的continuation

但是使用c似乎会改变它自己!定义上述打印(如我所料)输入、输出和输出:

IN
X
OUT
这是一个程序:

#;2> c
#<procedure (a9869 . results1678)>
现在c不再是一个过程了,第二次调用c将不起作用

#;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)    <--
#;4> c;;REPL没有回答这个问题,因此没有返回值
#;5> (c)
错误:调用非过程:#
通话记录:
(c)

(c) 在球拍中运行此功能更有帮助:

-> (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
(动态风
(lambda()(显示“IN”(换行))
(lambda())调用/cc(lambda(k)
(显示“X”)(换行)
k) ))
(lambda()(display'OUT)(换行符)))
在里面
X
出来
->c
#
->(c)
在里面
出来
定义值:上下文(定义“c”)预期值为1,收到值为0
->(c 99)
在里面
出来
->c
99

请特别注意,
c
绑定到一个连续值——因为表达式返回的值是
k
。而
k
本身是值表达式的延续,这意味着该延续是等待获取要绑定到
c
的值的延续。所以调用它需要一个单一的值,正如Racket所要求的,这有助于澄清这里发生了什么(MIT方案似乎默默地将其视为未指定)。无论如何,在99上应用这个延续符意味着该表达式的返回值是99——因此您可以跳回上下文(在
中打印
),返回99以绑定到
c
,然后在退出时打印出
。你现在修改了
c
改为99,所以你不能再叫它第三次了。

哦,我明白了!现在我觉得这毕竟是一个非常愚蠢的问题。非常感谢@Eli:“所以你不能第三次调用它”——当然,除非你总是调用(c c),它将c绑定到定义c的过程的继续部分…:-)@杰伊:你当然是对的。我一直在关注josh的设置,除了Racket需要发送一些值之外——所以使用
c
会让它更混乱。嘿,现在这很有趣。。。我在上面定义了c,然后在mzschemev4.2.4上调用了(c)五次,它就工作了。(?!)它在Chicken、Guile、Gambit、Ypsilon和SISC上失败。你是说没有参数的
(c)
?它也应该在4.2.4中失败。
-> (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