(define (mydelay expression)
;delay過程
(memo_proc (lambda () expression)))
(define (cons_stream a b)
(cons a (mydelay b)))
(define (stream_car stream) (car stream))
(define (stream_cdr stream) (myforce (cdr stream)))
一 輸入
(define x (cons_stream 'a (cons_stream 'b '())))
其中x應爲(cons 'a (mydelay (cons 'b (mydelay '()))))
二 運行:
(define y (stream_cdr x))
輸出結果如上所示,首先(stream_cdr x)的原型爲(myforce (cdr x)),而後將(cdr x)也就是
(mydelay (cons 'b (mydelay '())))做爲參數傳遞給myforce函數,並運行(
(mydelay (cons 'b (mydelay '())))),因爲mydelay外有兩個括號,全部會運行memo_proc 函數中的lambda函數,因爲cons_stream造成時,將每一個proc的already_run?和result都設爲了false,因此會運行test 1的程序。
{注意: 每一個不一樣的proc都有一個對應的already_run?和result,即單射,例如,運行(
cons_stream 'b '())會造成(lambda() (
cons_stream 'b '()))這樣的proc,而後運行let運算。當運行
(cons_stream 'a (cons_stream 'b '()))時,會造成
(lambda()
(cons_stream 'a (cons_stream 'b '()))這樣的proc,而後進行let運算,將此
proc對應的
already_run?和
result設爲
false
)
}
3、運行:
(stream_cdr x)
咱們發現運行了test2的程序,這是應爲當運行
memo_proc 函數中的lambda函數時,因爲在運行
(define y (stream_cdr x))
的程序時,將其對應的proc也就是
(lambda()
(cons_stream 'a (cons_stream 'b '()))的
already_run?已經設爲了true,而且結果也求了出來,因此當遇到一樣的proc時,會執行test2程序。