2013-04-29 42 views
1

這是我的代碼。由於我連續兩次連續呼叫,我預計會顯示兩次,即"world"。 但它只輸出一次。我錯過了什麼?計劃繼續未爆行爲

(define call-with-current-continuation call/cc) 
(define (repeat arg) 
    (lambda (cc) 
    (cc arg) 
    (cc arg))) 

(display (call/cc (repeat "world"))) 
+0

這是預期的。 '(cc arg)'調用轉義延續。 – leppie 2013-04-29 06:47:40

回答

4

短版本:您捕獲的延續比您想象的要長。當方案正在評估「call/cc」時,延續是「顯示此結果,然後退出程序」。因此,第一次調用(lambda(cc)(cc arg)(cc arg))體內的延續將打印該值...然後退出該程序。

要獲得您想要的行爲,您可能需要一個定界延續,該延續僅捕獲延續到頂層的部分。不同的Scheme實現在分隔延續的可用性方面有所不同(儘管您可以以效率爲代價實現全延續的分隔延續)。

舉例來說,球拍有一個「組合連續調用」,只切除延伸到達最近提示的部分......並且每個頂級表達都有一個隱式提示。所以這個程序:

#lang racket 

(define (repeat arg) 
    (lambda (cc) 
    (cc arg) 
    (cc arg))) 

(display (call-with-composable-continuation (repeat "world"))) 

打印「世界」兩次,如你所願。