0

私は最近、SICP を読み始め、本の演習を行いました。コマンドラインに両方の mit-scheme をインストールし、少しいじった後、DrRacket に出くわし、http://www.neilvandyke.org/racket-sicp/から SICP コンポーネントをインストールしました。

Excercise 1.10に来るまで、そして本に書かれているように関数を書いたときまで、すべてが正常に機能していました:

(define (A x y)
  (cond ((= y 0) 0)
        ((= x 0) (* 2 y))
        ((= y 1) 2)
        (else (A (- x 1)
                 (A x (- y 1))))))

次に、cmd + Rでコードを実行し、replからこれを呼び出すと、次のようになります。

> (A 1 10)

エラーが発生します

A: undefined;
cannot reference an identifier before its definition

ただし、コマンド ラインにインストールされたバージョンでも同じコードが機能します。DrRacket mit-scheme の実装で何かが壊れているのでしょうか、それともここで何か間違ったことをしていますか?

Mac OS X Yosemite で DrRacket バージョン 6.1.1(m3) を使用しています

どんな助けでも大歓迎です、ありがとう!

4

3 に答える 3

4

SICP 言語は、本の例を言語で直接動作させようとしますが、バグが潜んでいます。R6RS より前のバージョンのすべての Scheme では大文字と小文字が区別されません。つまり、次のように記述して正常に実行できます。

(define (test a)
  (+ A a)) ; A and a are the same

(TEST 5) ; ==> 10

著者#!r5rsは、本で使用されているバージョンに最も近い生きている言語である Racket の言語実装に基づいて作業を行ったと思います。また、SICP のように大文字と小文字を区別しません。ただし、インタラクション ウィンドウの動作は両方の言語で異なるようです。定義ウィンドウで定義されたすべての識別子は、小文字で定義されているかのように名前が付けられ、対話ウィンドウでは大文字と小文字が区別されないことを期待しているようです(TEST 5)したがって、対話ウィンドウに移動するとエラーが発生します。

> (TEST 5)
. . TEST: undefined;
 cannot reference an identifier before its definition

コードと対話は、言語モジュール パーサーのさまざまなパーサー関数によって読み取られます。どうやら彼らは構文の大文字と小文字を区別しないようにしましたが、読み取りはまだ大文字と小文字を区別しています。(read)入力してフィードすることでこれをテストできます。TeSt印刷されますが、印刷TeStされませんtest(define x 'TeSt)定義ウィンドウで行い、相互作用ウィンドウで評価するxと、印刷されますtest. Racket は、すべての識別子を小文字に変更することで、大文字と小文字を区別しません。これは R5RS と SICP の両方にあるため、SICP は R5RS に基づいており、バグは継承されていると思います。これは 2 つの方法で修正できます。1 つは、常に小文字の識別子を使用することです。慣例に従い、大文字と小文字を区別するスキーム レポートに進んでも問題ありません。別の方法として、定義ウィンドウの任意の場所に 1 行追加します。

(#%require r5rs/init) ; fix interactions window

RUNを押した後は、対話ウィンドウは大文字と小文字を区別しません。

> (TEST 5)
10
>

ハッピーハッキング!

于 2014-12-10T23:12:28.573 に答える
0

fwiw、(a 1 10)関数を次のように定義しましたが、呼び出してみましたが、機能しましたA..なぜそうなのかはわかりませんが、この問題について詳しく説明する回答を受け入れます..これを他の人の回答としてマークします同じ問題を抱えている..

于 2014-12-05T16:50:36.913 に答える
0

定義領域では大文字と小文字が区別されますが、相互作用領域では区別されません。

于 2014-12-06T16:21:20.777 に答える