32

私はSICPを介して作業しています。現在、最初の章で、Racketに「プリミティブ」を再定義させるのに問題があります。たとえば、私は恣意的にできるはずであり(define + 5)、それで問題ない、またはsqrt手順を再定義する必要があるという印象を受けました。代わりに、私はこれを取得します:

define-values: cannot change constant variable: +

私は現在R5RSに設定されている言語を持っていますが、SICPとの互換性の問題を処理するという印象を受けました。

4

3 に答える 3

34

可能であっても、そのような再定義は、システムがこれにどのように反応するかを実際に理解せずに行うべきことではありません。たとえば、再定義した場合+、他のコードは壊れますか?ラケットの場合の答えは「いいえ」ですが、これは実際には再定義できないためです+。代わりに、コードでのみ使用できる新しいを定義します。 +

言語の選択に関しては、ラケットR5RSモードは非常に厳密なものであり、通常は使用したくないものです。よりSICPに適した環境については、この本のために特別に作成された言語を提供するNeilVanDykeのSICPサポートページを参照してください。(IIRC、それは本が誇示しているグラフィック言語さえ持っています。)

于 2010-08-30T05:34:22.197 に答える
20

ここでRSAの例(SICPのものの一部)を介して作業しようとすると問題が発生しました:http:
//mitpress.mit.edu/sicp/psets/ps3/readme.html

これを機能させるために、私はこれをしなければなりませんでした:

1)これを空のファイルの先頭に追加して、最初のダウンロードを実行します。

#lang planet neil/sicp

次に「実行」を押します

2)DrRacketの非常にユーザーフレンドリーな自動ダウンロードを楽しんで、コーヒーを飲みに行くことでPLaneTNeilモジュールをインストールしてください;-)

3)インストールしたら、DrRacketを閉じます。

4)再度開き、[言語の選択]リストから[SICPPLaneT1.15]を選択します。
(最初のダウンロードを実行する以外に、上部に宣言を追加して機能させることはできませんでした。)

幸運を!

于 2011-05-18T01:18:16.403 に答える
11

言語パネルで、「初期バインディングの再定義を禁止する」を無効にする必要があります。これで問題が修正されます。

于 2010-08-30T04:32:33.687 に答える