SICP (コンピュータ プログラムの構造と解釈) セクション 3.5.4 (ストリームと遅延評価) のサンプル コードを実行できません。SICP セクションはhttp://mitpress.mit.edu/sicp/full-text/book/book-ZH-24.html#%_sec_3.5.4にあります。
DrRacket バージョン 5.2.1 を使用しています。Neil Van Dyke による SICP サポート言語 ( SICP PLaneT 1.17 ) でセットアップされています。 ._インストール%29 .
以下に示すコードは、ストリームを利用しています。上記のように設定された環境では、手順cons-stream
、force
およびdelay
は DrRacket から既に利用可能です。しかしstream-car
、stream-cdr
利用できませんでした。そのため、それらを定義する必要がありました。以下のコードでは、いくつかの汎用ストリーム関数も定義しています: stream-map
、stream-ref
、add-streams
およびscale-stream
.
私が動作させようとしているコード全体は次のとおりです。これには、遅延引数 ( ) をsolve
使用する積分手順 ( ) を使用して、 1 次微分方程式を数値的に解く手順 ( ) が含まれています。これらの手順は、セクション 3.5.4 に由来します。integral
delayed-integrand
(define (stream-car stream) (car stream))
(define (stream-cdr stream) (force (cdr stream)))
(define (stream-map proc . argstreams)
(if (stream-null? (car argstreams))
the-empty-stream
(cons-stream
(apply proc (map stream-car argstreams))
(apply stream-map
(cons proc (map stream-cdr argstreams))))))
(define (stream-ref s n)
(if (= n 0)
(stream-car s)
(stream-ref (stream-cdr s) (- n 1))))
(define (add-streams s1 s2)
(stream-map + s1 s2))
(define (scale-stream stream factor)
(stream-map (lambda (x) (* x factor)) stream))
(define (integral delayed-integrand initial-value dt)
(define int
(cons-stream initial-value
(let ((integrand (force delayed-integrand)))
(add-streams (scale-stream integrand dt)
int))))
int)
(define (solve f y0 dt)
(define y (integral (delay dy) y0 dt))
(define dy (stream-map f y))
y)
上記の定義を DrRacket に入れ、[実行] をクリックしてもエラーは発生しません。ただし、対話ウィンドウで次の行を実行しようとすると、エラーが発生します。
(stream-ref (solve (lambda (y) y) 1 0.001) 1000)
エラーメッセージは次のとおりです。
mcar: expects argument of type <mutable-pair>; given #<undefined>
このエラーが発生すると、DrRacket はstream-car
次の図に示すように、プロシージャーの定義の本文を強調表示します。
このエラーの原因は何ですか? stream-car
上記のストリーム プロシージャは、前の例 ( 、stream-cdr
、stream-map
、add-streams
および) で既に使用しておりscale-stream
、機能しました。この手順は、手順integral
の外で使用しても機能します。solve
たとえば、定義(define ones (cons-stream 1 ones))
してから定義(define s (integral (delay ones) 1 1))
してから実行すると(stream-ref s 1000)
、正しく出力が得られます1001
。