読者です 読者をやめる 読者になる 読者になる

@uents blog

Code wins arguments.

SICP 読書ノート#11 - 2.2.4 図形言語(1) (pp.73-83)

SICP Scheme

Racket supports The SICP Picuture Languageを使う

色々試行錯誤したが、図形言語を単に試すだけならこれがいちばん簡単だった。

Racket REPLから、

(require (planet "sicp.ss" ("soegaard" "sicp.plt" 2 1)))

を実行し、

(paint diagonal-shading)

で、グラデーション付きの画像が出る。

image

(paint-hires diagonal-shading)

で、高解像度の画像。

image

(paint einstein)

で、Rogersの替わりにEinstein。

image

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画像も出る。

image

vector、segment、painterの実装もほとんど含まれているので、後は、

  • right-split
  • up-split
  • corner-split
  • square-limit

を追加すれば、残りの例も試すことができる。

(paint (right-split wave 4))
(paint (corner-split einstein 4))

image

ただこれではあまりに勉強にならないので、次回はRacket Graphics Legacy Libraryを使ってみる。


※「SICP読書ノート」の目次はこちら