LoginSignup
8

More than 5 years have passed since last update.

RacketでSICP

Posted at

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 を書かなくてよく手軽である。

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8