SICPの問題を実行するのに、Racketというlispの統合開発環境を使っている。
(以前PLT SchemeやDrRacketという名前だった)
素の状態でも1章の問題には対応していて、以下のようにrequireでプラグインを指定することで2章の図の問題も実行できる。これはアインシュタインを表示する。
#lang racket
(require (planet soegaard/sicp:2:1/sicp))
(paint einstein)
以下は古い形式。
#lang racket
(require (planet "sicp.ss" ("soegaard" "sicp.plt" 2 1)))
線分もひける。
(paint (segments->painter (list (make-segment (make-vect 0 0) (make-vect 1 1)))))
インストールされていなければネットワーク上から持ってくる仕組みになっているぽい。すばらしい。manualはここにある。
https://planet.racket-lang.org/package-source/soegaard/sicp.plt/2/1/sicp-manual.txt
https://github.com/sicp-lang/sicp/blob/master/sicp-pict/sicp-manual.txt
以前のバージョンだと、neilさんのsicpパッケージが定番だったが、図の関数の一部が動かなかった。
neil/sicpの使い方は、先頭に
#lang planet neil/sicp
か、または、
#lang racket
(require (planet neil/sicp:1:17/main))
のいずれかを書く。アインシュタインも表示できる。
ただし、線分を引くのは失敗した。
#lang planet neil/sicp
(paint (segments->painter (list (make-segment (make-vect 0 0) (make-vect 1 1)))))
これは expected: list? というエラーになる。
neil/sicp環境だと (cons 1 2) は (mcons 1 2) と表示される。どうやらconsやlistがmconsというmutableなオブジェクトになるようで、普通のlistを作って渡すことができなかった。
ちなみにRacket 5.3.6までだと、neil/sicpをインストールすることで、言語にPLT Schemeが追加される。
その状態だと #lang を書かなくてよく手軽である。