3

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-streamforceおよびdelayは DrRacket から既に利用可能です。しかしstream-carstream-cdr利用できませんでした。そのため、それらを定義する必要がありました。以下のコードでは、いくつかの汎用ストリーム関数も定義しています: stream-mapstream-refadd-streamsおよびscale-stream.

私が動作させようとしているコード全体は次のとおりです。これには、遅延引数 ( ) をsolve使用する積分手順 ( ) を使用して、 1 次微分方程式を数値的に解く手順 ( ) が含まれています。これらの手順は、セクション 3.5.4 に由来します。integraldelayed-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次の図に示すように、プロシージャーの定義の本文を強調表示します。

DrRacket エラー


このエラーの原因は何ですか? stream-car上記のストリーム プロシージャは、前の例 ( 、stream-cdrstream-mapadd-streamsおよび) で既に使用しておりscale-stream、機能しました。この手順は、手順integralの外で使用しても機能します。solveたとえば、定義(define ones (cons-stream 1 ones))してから定義(define s (integral (delay ones) 1 1))してから実行すると(stream-ref s 1000)、正しく出力が得られます1001

4

1 に答える 1

5

あなたが報告しているエラーはかなり奇妙です。どこmcarで使用されているか、または可変状態がわかりません。このセットアップを試してみてください。Neil Van Dyke のサポート言語を使用しなくても機能します。

#lang racket

(define the-empty-stream '())

(define (stream-null? stream)
  (null? stream))

(define-syntax cons-stream
  (syntax-rules ()
    ((cons-stream head tail)
     (cons head (delay tail)))))

(define (stream-car stream)
  (car stream))

(define (stream-cdr stream)
  (force (cdr stream)))

; ... the rest is the same as in your question
于 2012-12-22T00:42:40.300 に答える