SICP Practice

Practice 4.18

原过程

(lambda <vars>
  (define u <e1>)
  (define v <e2>)
  <e3>)

第一种变形方式

(lambda <vars>
  (let ((u '*unassigned*)
        (v '*unassigned*))
    (set! u <e1>)
    (set! v <e2>))
    <e3>)

第二种变形方式

(lambda <vars>
  (let ((u '*unassigned*)
        (v '*unassigned*))
    (let ((a <e1>)
          (b <e2>))
      (set! u a)
      (set! v b))))

待处理过程

(define (solve f y0 dt)
  (define y (integral (delay dy) y0 dt))
  (define dy (stream-map f y))
  y)

按第二种方式变形后

(define (solve f y0 dt)
  ((lambda (y dy)
    ((lambda (a b)
       (set! y a)
       (set! dy b))
     (integral (delay dy) y0 dt)
     (stream-map f y)))
   '*unassigned*
   '*unassigned*))

在求内层lambda的时候,参数是(integral (delay dy) y0 dt)和(stream-map f y),因为此时y是’unassigned ,求值(stream-map f y)的时候y是未赋值的变量,所以会出错。

按第一种方式变形后

(define (solve f y0 dt)
  ((lambda (y dy)
    (set! y (integral (delay dy) y0 dt))
    (set! dy (stream-map f y)))
   '*unassigned*
   '*unassigned*))

与上面的不同,(stream-map f y)求值的时候y已经有第一个值 所以可以正常的求出dy的第一个值,然后就可以交替生成两个流了