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的第一个值,然后就可以交替生成两个流了