I am currently working through SICP using Guile as my primary language for the exercises. I have found a strange behavior while implementing the exercises in chapter 3.5. I have reproduced this behavior using Guile 1.4, Guile 1.8.6 and Guile 1.8.7 on a variety of platforms and am certain it is not specific to my setup.
This code works fine (and computes e):
(define y (integral (delay dy) 1 0.001))
(define dy (stream-map (lambda (x) x) y))
(stream-ref y 1000)
The following code should give an identical result:
(define (solve f y0 dt)
(define y (integral (delay dy) y0 dt))
(define dy (stream-map f y))
y)
(stream-ref (solve (lambda (x) x) 1 0.001) 1000)
But it yields the error message:
standard input:7:14: While evaluating arguments to stream-map in expression (stream-map f y):
standard input:7:14: Unbound variable:
y ABORT: (unbound-variable)
So when embedded in a procedure definition, the (define y …) does not work, whereas outside the procedure in the global environment at the REPL it works fine.
What am I doing wrong here? I can post the auxiliary code (i.e., the definitions of integral, stream-map etc.) if necessary, too. With the exception of the system-dependent code for cons-stream, they are all in the book. My own implementation of cons-stream for Guile is as follows:
(define-macro (cons-stream a b)
`(cons ,a (delay ,b)))
The key difference between what happens when you evaluate the definitions one by one at the REPL and when you place them inside
solveis that in the first case, they are evaluated sequentially, thus theythe expression(stream-map <some-function> y)refers to is already in scope, whereas with internal definitions orletrec, it is not yet available.Funnily enough, MIT Scheme, which I used when going through SICP, had no such problem back then and still treats
letrecand internal defines differently:I’m not sure about the original “Revised Report On Algorithmic Language Scheme” or R2RS, but at least from R3RS on internal defines were supposed to be equivalent to
letrec. Apparently this peculiarity of MIT’s environment influenced the book… or perhaps it’s the other way around.