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)))
 
一 输入
(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
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值