SICP問題2.52

頑健(robust)な設計のための言語レベル
成層設計(stratified design)
レベルに合わせた作業

a. 問題2.49の基本的 wave ペインタに(例えば笑っているような)線分を加えよ(低レベル)

(define (wave frame)
  ((segment->painter
    (list
     (make-segment (make-vect 0 0.84) (make-vect 0.14 0.59))
     (make-segment (make-vect 0.14 0.59) (make-vect 0.30 0.65))
     (make-segment (make-vect 0.30 0.65) (make-vect 0.41 0.65))
     (make-segment (make-vect 0.41 0.65) (make-vect 0.35 0.86))
     (make-segment (make-vect 0.35 0.86) (make-vect 0.41 1.00))
     (make-segment (make-vect 0.60 1.00) (make-vect 0.65 0.84))
     (make-segment (make-vect 0.65 0.84) (make-vect 0.61 0.65))
     (make-segment (make-vect 0.61 0.65) (make-vect 0.75 0.65))
     (make-segment (make-vect 0.75 0.65) (make-vect 1.00 0.35))
     (make-segment (make-vect 1.00 0.14) (make-vect 0.61 0.44))
     (make-segment (make-vect 0.61 0.44) (make-vect 0.76 0.00))
     (make-segment (make-vect 0.60 0.0) (make-vect 0.51 0.30))
     (make-segment (make-vect 0.51 0.30) (make-vect 0.41 0.00))
     (make-segment (make-vect 0.26 0.00) (make-vect 0.35 0.51))
     (make-segment (make-vect 0.35 0.51) (make-vect 0.30 0.59))
     (make-segment (make-vect 0.30 0.59) (make-vect 0.16 0.40))
     (make-segment (make-vect 0.16 0.40) (make-vect 0.00 0.65))
     (make-segment (make-vect 0.40 0.75) (make-vect 0.60 0.78))
     (make-segment (make-vect 0.40 0.75) (make-vect 0.50 0.70))
     (make-segment (make-vect 0.60 0.78) (make-vect 0.50 0.70))
)) frame))

b. corner-split で構成されるパターンを(例えば二つでなくup-split と right-splitのコピーを使うことで)変更せよ。ということだが、どうやら二つではなく、一つだけ使えということらしいので、簡単に修正

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

c. square-limit で square-of-four を使う版を、隅を異なるパターン(例えばRogers氏を、四角の隅では外側を向かせるように)修正せよ。

(define (square-limit painter n)
  (let ((combine4 (square-of-four flip-vert rotate180
                                  identity flip-horiz)))
    (combine4 (corner-split painter n))))