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))))