SICP 読書ノート#11 - 2.2.4 図形言語(1) (pp.73-83)
Racket supports The SICP Picuture Languageを使う
色々試行錯誤したが、図形言語を単に試すだけならこれがいちばん簡単だった。
- http://planet.racket-lang.org/package-source/soegaard/sicp.plt/2/1/planet-docs/sicp-manual/index.html
- http://d.hatena.ne.jp/tetsu_miyagawa/20130512/1368350808
Racket REPLから、
(require (planet "sicp.ss" ("soegaard" "sicp.plt" 2 1)))
を実行し、
(paint diagonal-shading)
で、グラデーション付きの画像が出る。
(paint-hires diagonal-shading)
で、高解像度の画像。
(paint einstein)
で、Rogersの替わりにEinstein。
Einsteinは高解像度で出そうとすると、なぜかエラー。 Segment形式に変換されたEinsteinの画像のデータ構造がpaint-hiresにマッチしないのかな。
planet/sicp.ssはSICPのテキストコードもほとんど含んでいるようなので、
(define wave (segments->painter (list (make-segment (make-vect 0.2 0.0) (make-vect 0.4 0.4)) (make-segment (make-vect 0.4 0.4) (make-vect 0.3 0.5)) (make-segment (make-vect 0.3 0.5) (make-vect 0.1 0.3)) (make-segment (make-vect 0.1 0.3) (make-vect 0.0 0.6)) (make-segment (make-vect 0.0 0.8) (make-vect 0.1 0.5)) (make-segment (make-vect 0.1 0.5) (make-vect 0.3 0.6)) (make-segment (make-vect 0.3 0.6) (make-vect 0.4 0.6)) (make-segment (make-vect 0.4 0.6) (make-vect 0.3 0.8)) (make-segment (make-vect 0.3 0.8) (make-vect 0.4 1.0)) (make-segment (make-vect 0.6 1.0) (make-vect 0.7 0.8)) (make-segment (make-vect 0.7 0.8) (make-vect 0.6 0.6)) (make-segment (make-vect 0.6 0.6) (make-vect 0.8 0.6)) (make-segment (make-vect 0.8 0.6) (make-vect 1.0 0.4)) (make-segment (make-vect 1.0 0.2) (make-vect 0.6 0.4)) (make-segment (make-vect 0.6 0.4) (make-vect 0.8 0.0)) (make-segment (make-vect 0.7 0.0) (make-vect 0.5 0.3)) (make-segment (make-vect 0.5 0.3) (make-vect 0.3 0.0))))) (paint wave)
とするだけで、wave画像も出る。
vector、segment、painterの実装もほとんど含まれているので、後は、
- right-split
- up-split
- corner-split
- square-limit
を追加すれば、残りの例も試すことができる。
(paint (right-split wave 4)) (paint (corner-split einstein 4))
ただこれではあまりに勉強にならないので、次回はRacket Graphics Legacy Libraryを使ってみる。