SICP 読み (30)

2.2.4 図形言語に突入。しばらく図形は表示されない形で色々とメモを。
painter というとっても抽象的な概念がいきなり導入される。追加でいくつか同様な抽象的な手続きも導入。忘れるのが早いので控えておく。

  • beside 受け取った painter を左右に配置
  • below 受け取った painter を上下に配置
  • flip-vert 受け取った painter を上下逆転
  • flip-horiz 受け取った painter を左右逆転

# 基本的には新しい painter を返す、と見て良いハズ。

とゆー事は以下のソレは

(define wave2 (beside wave (flip-vert wave)))

wave と上下逆転な wave を左右に配置、となるし

(define wave4 (below wave2 wave2))

は wave2 を上下に配置、となるのか。一瞬手続きの定義か、と思ってしまった。

それにしても「閉包性 (原文だと closure とか closure property とか)」という言葉がやたらに出てくるな。これが何を指しているか、なイメージが微妙。これは別途調べてみる事にして、この後に出てくるいくつかの手続きの類について。

flipped-pair

wave4 の抽象手続きが以下のように紹介されている。

(define (flipped-pair painter)
  (let ((painter2 (beside painter (flip-vert painter))))
    (below painter2 painter2)))

元画像とそれを上下逆転したものを左右に並べたものを二つほど上下に配置、か。

wave4 が以下のように定義されているけど

(define wave4 (flipped-pairs wave))

これを置き換えてみると以下か。

(below (beside wave (flip-vert wave)) (beside wave (flip-vert wave)))

これ、画像のサイズをどうやって決定しているのかは不明だが、そのあたりの具体的な実装についてはスルーした方が良さげ。

又、再帰的な演算とゆー事で右に半分なソレが以下。

(define (right-split painter n)
  (if (= n 0)
      painter
      (let ((smaller (right-split painter (- n 1))))
	(beside painter (below smaller smaller)))))

ふむふむ。コードを見れば理屈は分かるな (上記のナニはスルー)。置き換えは略。

あるいは以下。これは長い。

(define (corner-split painter n)
  (if (= n 0)
      painter
      (let ((up (up-split painter (- n 1)))
	    (right (right-split painter (- n 1))))
	(let ((top-left (beside up up))
	      (bottom-right (below right right))
	      (corner (corner-split painter (- n 1))))
	  (beside (below painter top-left)
		  (below bottom-right corner))))))

問題 2.44 も含め、試験なソレは作れんものか。なんだっけ、driver ではなくって stub って言うんだったか。