我目前正在通过 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 的系统相关代码之外,它们都在书中。我自己对 Guile 的 cons-stream 实现如下:
(define-macro (cons-stream a b)
`(cons ,a (delay ,b)))