私は現在、演習の第一言語としてGuileを使用してSICPを使用しています。3.5章の演習を実装しているときに、奇妙な動作を見つけました。さまざまなプラットフォームでGuile1.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)))