2010-06-13 36 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