В настоящее время я работаю через SICP, используя Guile в качестве основного языка для упражнений. Я обнаружил странное поведение при выполнении упражнений в главе 3.5. Я воспроизвел это поведение, используя Guile 1.4, Guile 1.8.6 и Guile 1.8.7 на различных платформах, и я уверен, что это не относится к моим настройкам.
Этот код работает нормально (и вычисляет e):
(define y (integral (delay dy) 1 0.001))
(define dy (stream-map (lambda (x) x) y))
(stream-ref y 1000)
Следующий код должен дать идентичный результат:
(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)
Но выдает сообщение об ошибке:
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)
Таким образом, при внедрении в определение процедуры (define y ...) не работает, в то время как вне процедуры в глобальной среде в REPL она работает нормально.
Что я здесь не так делаю? При необходимости я также могу опубликовать вспомогательный код (то есть определения интеграла, карту потоков и т. Д.). За исключением системно-зависимого кода для cons-stream, все они в книге. Моя собственная реализация cons-stream для Guile выглядит следующим образом:
(define-macro (cons-stream a b)
`(cons ,a (delay ,b)))