SICPを試してみましたが、コードを取得しました。だから私は始めました:
#lang scheme
(Word 'comp 'uter)
返されたエラー:関数(Word)が未定義です。
これをIDE(Run)にコピーしようとしても:
(define word?
(let ((number? number?)
(symbol? symbol?)
(string? string?))
(lambda (x)
(or (symbol? x) (number? x) (string? x)))))
まだ同じ。
言語のバージョンなどに問題があるのではないかと思います。
上記は「Simply Scheme」からのものであり、SICPにコードを正確に導入すると、次のようになります。
(define (sqrt x)
(sqrt-iter 1.0 x))
IDEはsqrt-iter
を未定義で返しました。コードは第1章にあります: http://mitpress.mit.edu/sicp/code/index.html
DrRacketには SICP互換言語 があります。
ドキュメント には、DrRacketからインストールする方法の簡単なガイドがあります。
パッケージマネージャーを開きます。DrRacketで[ファイル]メニューを選択し、[パッケージマネージャー...]を選択します。
「Do What I Mean」タブでテキストフィールドを見つけて、「sicp」と入力します。
「インストール」ボタンをクリックします。これにより、大量の出力が生成されます。警告があっても気にしないでください。
試して。 DrRacketの左下隅に「ソースからの言語の判別」があることを確認してください。次のプログラムを作成してクリック RUN:
#lang sicp
(inc 42)
; ==> 43
次に、#%require
に含まれている必要がある画像言語を使用するより高度なテストを示します。
#lang sicp
(#%require sicp-pict)
;; Paint-hires / Paint-hi-res renamed to just Paint
(Paint (below (beside diagonal-shading
(rotate90 diagonal-shading))
(beside (rotate270 diagonal-shading)
(rotate180 diagonal-shading))))
クリック RUN インタラクションウィンドウに正方形が中央に向かって明るくなるはずです。
または、次のコマンドを実行して、ターミナル/シェルから手順1〜3を実行することもできます。
raco pkg install sicp
ここから、最初のインストール手順でステップ4を実行してテストします。
raco pkg
が機能しない場合、古いバージョンまたは惑星を使用するDrRacketDrRacketには SICP互換言語の古いバージョン もあります。左下の選択ボックスを「ソースから言語を決定する」に持っている間、あなたは単に追加することができます:
#lang planet neil/sicp
定義(上部のテキスト領域)の唯一の行として、 RUN そしてそれはインストールされます。 DrRacketを再起動すると、言語ドロップダウンで利用可能になります。幸運を。多くのエラーメッセージが赤で表示される場合があります。無視してDrRacketを再起動してください。言語メニューで選択肢を見つけられなくなった可能性がありますが、すべてのファイルを#lang planet neil/sicp
で開始することで、モジュール言語として機能します。
エラーから判断すると、画像言語モジュールに関連しているようです。私はこのスニペットをテストしましたが、それでも動作します:
(Paint-hires (below (beside diagonal-shading
(rotate90 diagonal-shading))
(beside (rotate270 diagonal-shading)
(rotate180 diagonal-shading))))
Sylwesterの答え は私が欲しかったものでした。ただし、Racket 6.5には SICPの直接サポートが追加されています があることに気づきました。人はそれを知りたいと思うかもしれません。
SICPサポートが追加された後、ラケットで次のようなコードを書くことができます。
#lang sicp
(#%require sicp-pict)
(Paint einstein)
【ナイススタート】続けて、あなたはSchemeを楽しむでしょう!]
Schemeでは、プログラムは環境で開発されます。環境は、識別子から値へのマッピングを定義します。一部の値は関数、一部は数値などです。関数を定義すると、次のようになります。
(define (sqrt x)
(sqrt-iter 1.0 x))
識別子x
はsqrt
への引数としてバインドされ、値1.0は数値であり、識別子sqrt-iter
は環境から取得されます。
「sqrt-iter
はどこに定義されていますか?それは何にバインドされていますか?」これはユーザーが定義するものではないため、sqrt-iter
は、Schemeに組み込まれている環境から取得するか、Schemeにインポートする必要があります。何もインポートしておらず、sqrt-iter
がSchemeで定義されていません(R5RSなどのリソースを参照してください)。したがって、sqrt-iter
はバインドされていません。
同じロジックは、Word
の使用を含むすべての識別子に適用されます。
word?
の実装では、構文キーワードlet
を使用して、新しいバインドされた識別子を導入します。 (number? number?)
を記述する場合、新しい識別子number?
(左側)を導入し、それを環境(Schemeで定義されています)からのnumber?
(右側)にバインドします。これにlet
を使用しても、実際には何も買いません。 word?
のコードは次のように実装できます。
(define (word? x)
(or (symbol? x) (number? x) (string? x))) ;; number?