Chapter 4, Metalinguistic Abstraction

Exercise 4.18


We have procedure:

1
2
3
4
(define (solve f y0 dt)
  (define y (integral (delay dy) y0 dt))
  (define dy (stream-map f y))
  y)

As shown in this exercise, this will get converted to:

1
2
3
4
5
6
7
(define (solve f y0 dt)
  (let ((y '*unassigned*)
		(dy '*unassigned*))
	(let ((a (integral (delay dy)) y0 dt)
		  (b (stream-map f y)))
	  (set! y a)
	  (set! dy b))))

Assuming that delay is implemented as special form in our evaluator such that it behaves as described in chapter-3, i.e. arguments to delay are not evaluated until it is accessed.

For b we require dy to be correctly defined because there is no (delay y) in b expression. Thus it won’t work.

However, it will work with the way we implemented transformation described in the text because now before evaluating dy, y will be already defined.