2010-06-13 57 views
4

我有一些麻烦了解以下 计划程序的行为:帮助动态风和呼叫/立方厘米

(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似乎修改自己!定义上述印刷品(如我所料)的,X和OUT:

IN 
X 
OUT 

而且它是一个过程:

#;2> c 
#<procedure (a9869 . results1678)> 

现在,我希望,当它被再次调用,X是印刷,而不是!

#;3> (c) 
IN 
OUT 

现在c不再是一个程序了,第二个c的调用将不起作用! (c)的每个调用都会做同样的事情 - 打印IN,X和OUT。我错过了什么?

回答

8

球拍运行,这是多一点帮助:

-> (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。因此,调用它需要一个单一的价值,正如Racket所要求的,这有助于澄清这里发生的事情(麻省理工学院计划似乎默默地将其视为未指定)。无论如何,在99上应用此延续意味着该表达式的返回值为99 - 因此您跳回上下文(打印IN)并返回99 以绑定到c,并在出口时打印OUT。你现在修改了c来代替99,所以你不能第三次调用它。

+0

哦,我明白了!毕竟,现在我觉得这是一个非常愚蠢的问题。非常感谢! – josh 2010-06-13 12:38:53

+1

@Eli:“所以你不能第三次调用它” - 除非你总是调用(cc),它将c绑定到定义c的过程的继续:... :) – Jay 2010-06-13 19:39:57

+1

@Jay:你当然是对的。我专注于乔希的设置,除了球拍需要发送一些值 - 所以使用“c”会让它更加混乱。 – 2010-06-13 22:00:17