Scheme关于delay的一些理解
Scheme关于delay的一些理解
(define (myforce delayed_object) ;force操作
(display "delayed_object: ")
(display delayed_object)
(newline)
(delayed_object))
(define (test x y) ;作为测试
(begin
(display "test ")
(display x)
(display y)
(newline)))
(define (memo_proc proc)
(let ((already_run? false) (result false))
(test 0 result)
(lambda ()
(if (not already_run?)
(begin (set! result (proc))
(set! already_run? true)
(test 1 result)
result)
(begin
(test 2 result)
result)))))
(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)))
(display "delayed_object: ")
(display delayed_object)
(newline)
(delayed_object))
(define (test x y) ;作为测试
(begin
(display "test ")
(display x)
(display y)
(newline)))
(define (memo_proc proc)
(let ((already_run? false) (result false))
(test 0 result)
(lambda ()
(if (not already_run?)
(begin (set! result (proc))
(set! already_run? true)
(test 1 result)
result)
(begin
(test 2 result)
result)))))
(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))
![](https://images2015.cnblogs.com/blog/776577/201704/776577-20170406154040160-505234502.png)
输出结果如上所示,首先(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) }
三、运行: (stream_cdr x)
![](https://images2015.cnblogs.com/blog/776577/201704/776577-20170406154040160-505234502.png)
我们发现运行了test2的程序,这是应为当运行memo_proc 函数中的lambda函数时,由于在运行(define y (stream_cdr x))的程序时,将其对应的proc也就是(lambda() (cons_stream 'a (cons_stream 'b '()))的already_run?已经设为了true,并且结果也求了出来,所以当遇到同样的proc时,会执行test2程序。