Scheme关于delay的一些理解

it2022-05-05  173

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


最新回复(0)