2011-05-14 53 views
2

環境不是計劃延續的一部分嗎?環境不是延續的一部分嗎?

我曾與雞,左岸,球拍和開局進行了測試,他們所有的行爲類似:

(define kont #f) 

(let ((a 1) 
     (b 2)) 
    (call-with-current-continuation 
    (lambda (k) 
    (set! kont k) 
    (display 'mutating) 
    (newline) 
    (set! a -1) 
    (set! b -2))) 
    (display (+ a b)) 
    (newline)) 

我希望-3的LET進行評估,但在調用KONT +3(因爲我認爲該計劃將記住的突變之前的綁定和b):

(let ...) ; <-- evaluating the LET above 
; prints "mutating" 
=> -3 
(kont 100) 
=> -3 
(kont 100) 
=> -3 

所以延續只會影響控制,而不是環境?在這種情況下,爲什麼說實現延續的方法之一是「複製堆棧」(綁定不在堆棧中?)

+0

或者是延續帶有環境和綁定,但是這些*是可變的? – josh

回答

3

延續捕獲綁定。然而,正如你猜測的那樣,這些綁定是可變的。

你在這裏被「複製堆棧」的口號誤導了。雖然這是考慮call/cc的合理方式,但並不是全部。首先,你真的不希望一個暴露了本地綁定是否被堆棧分配的語言特性。

而是使用「程序上下文」的概念來定義call/cc。對於這個問題的一個很好的解決方案,你可以看一看Shriram Krishnamurthi的免費在線教科書PLAI,或者閱讀(非自由的,更深入的)「使用PLT Redex的語義工程」一書。

另外;你的程序並沒有真正檢查你想要檢查的內容,因爲你從未調用捕獲的延續。我想你想寫這樣的東西:

#lang racket 

(define kont #f) 

(let ([a 3]) 

    (let/cc k 
    (set! kont k) 
    (set! a 4)) 
    (printf "~s\n" a)) 

(kont) 

...它顯示了幾乎相同的行爲,你提到上面。

1

您可以通過設置更改環境中的a和b的值!所以a和b在連續環境中是-1和-2。您無法展開副作用。 a,b和kont在你的延續中沒有區別。

相關問題