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))) 一 输入 (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 ) } 三、运行: (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程序。转载于:https://www.cnblogs.com/lxpzh/p/6673774.html