2011-04-10 59 views
8

這是關於SICP的第3.5章,其中正在討論流。這個想法是:Scheme,SICP,R5RS,爲什麼延遲不是特殊形式?

(cons-stream 1 (display 'hey)) 

不應該評估cons-stream的第二部分,所以它不應該打印「嘿」。這確實發生了,我得到下面的輸出:

哎(1#<承諾>)

所以我的結論是,延遲不是作爲一種特殊的形式來實現?或者我做錯了什麼?我使用以下實現:

(define (cons-stream a b) 
    (cons a (delay b))) 

延遲是默認的R5RS實現。這是實施過程中的錯誤,還是我沒有做或理解不正確?

回答

15

創建一個承諾,但承諾是在你的cons-stream內創建的,這意味着它已經太晚了,表達式已經被評估。試試這個:

(define (foo x) 
    (display "foo: ") (write x) (newline) 
    x) 

(cons-stream 1 (foo 2)) 

你會發現它的評估過早。出於同樣的原因,這一點:當你cons-stream是一個功能

(define ones (cons-stream 1 ones)) 

和任何其他無限的名單將無法正常工作。因此,delay是一種特殊的形式,但由於您將cons-stream定義爲普通函數,因此您沒有使用它的功能。你必須將cons-stream定義爲一個宏,如果你想使的行爲也是一樣的。例如:

(define-syntax cons-stream 
    (syntax-rules() 
    [(cons-stream x y) (cons x (delay y))])) 
+0

謝謝!但是,我將如何創建一個能夠以書中方式工作的cons-stream? – KnowsLittle 2011-04-10 08:16:46

+0

添加到答案。 – 2011-04-10 08:18:13