2015-10-26 34 views
3

我沿着紙條在球拍上學習call/cc繼續舉例:異常,時間旅行搜索,生成器,線程和協程1如何在球拍中開始捕獲的當前延續

該論文提到最有利的API是通過提供程序lambda (cc) (cc cc)call/cc得出的。我明白這個具體的call/cc調用返回當前延續的第一類對象到主程序。

在下面的例子中,該文件調用了所有這些(right-now)

我看到的是,在同一個示例中,上述call/cc調用返回的對象cc總是在後面運行,並將其應用於自身。這是我不明白的。

我看不出有什麼cc的價值是如此的特別,所以我試圖用(cc()),或(cc (lambda()())),甚至(cc "whatever")(cc)開始它作爲一個功能。沒有任何喜悅:顯然延續只需應用程序爲了開始運行。

這是爲什麼?通過做(cc cc)來清楚地說明運行cc的唯一性的例子是什麼?

+1

順便說一句 - 請注意,空應用程序'()'是在球拍中的錯誤。嘗試類似'(cc 42)'。 – soegaard

+0

我也試過:-(文本現在修改爲:-) –

回答

2

(let ((cc (current-continuation))) 
    ...) 

(current-continuation)的延續,是

(lambda (_) 
    (let ((cc _)) 
    ...) 

調用此延續c0

current-continuation的定義是:

(define (current-continuation) 
    (call/cc (lambda (cc) (cc cc)))) 

所以call/cc電話(lambda (cc) (cc cc))c0作爲參數:

((lambda (cc) (cc cc)) c0) 
= (c0 c0) 

插入C0的值:成爲

((lambda (_) 
    (let ((cc _)) 
    ...) 
c0) 

(let ((cc c0)) 
    ...) 

這意味着內部...標識符cc現在被綁定到值c0

如果發生在...

(c0 42)我們得到:

(c0 42) 
= ((lamdba (_) 
    (let ((cc _)) 
     ...) 
    42) 
= (let ((cc 42)) 
    ...) 

現在cc被綁定到值42。

該示例使用(procedure? cc)(future-value? cc)測試cc是否綁定到的延續(如果(procedure? cc)爲true)和或另一個值(未來值是在這裏42)。

所以在:

(define (current-continuation) 
    (call/cc (lambda (cc) (cc cc)))) 

傳遞給(lambda (cc) (cc cc)))值延續。如果我們想要實現它,我們需要返回它,並且通過將它傳遞給延續來做到這一點。即(cc something)將返回一些內容,並且由於我們想要繼續使用(cc cc)

+0

這就是線索! '(current-continuation)=(call/cc)'。我忽略了第一對parens。謝謝! –