Решение упражнения 2.52 из SICP
Описанные в каждом из пунктов упражнения изменения можно внести в результат, переопределив соответствующие процедуры указанным ниже образом:
(define wave-painter (segments->painter (append (polyline (make-vect 0 0.15) (make-vect 0.15 0.4) (make-vect 0.3 0.35) (make-vect 0.4 0.35) (make-vect 0.35 0.15) (make-vect 0.4 0)) (polyline (make-vect 0.6 0) (make-vect 0.65 0.15) (make-vect 0.6 0.35) (make-vect 0.75 0.35) (make-vect 1 0.65)) (polyline (make-vect 1 0.85) (make-vect 0.6 0.55) (make-vect 0.75 1)) (polyline (make-vect 0.6 1) (make-vect 0.5 0.7) (make-vect 0.4 1)) (polyline (make-vect 0.25 1) (make-vect 0.35 0.5) (make-vect 0.3 0.4) (make-vect 0.15 0.6) (make-vect 0 0.35)) (polyline (make-vect 0.45 0.25) (make-vect 0.5 0.3) (make-vect 0.55 0.25)))))
(define (corner-split painter n) (if (= n 0) painter (let ((up (up-split painter (- n 1))) (right (right-split painter (- n 1)))) (let ((corner (corner-split painter (- n 1)))) (beside (below painter up) (below right corner))))))
(define (square-limit painter n) (let ((combine4 (square-of-four flip-vert rotate180 identity flip-vert))) (combine4 (corner-split painter n))))
В wave-painter я просто добавил еще одну ломаную (последнюю) для улыбки. Два других пункта выполнены точно в соответствии с рекомендациями из условия упражнения.
Обратите внимание, что в первом случае мы вносим изменение на уровне рисовалки. Во втором случае мы меняем операцию над рисовалками. В третьем случае мы перекомбинируем операции над рисовалками, то есть работаем на еще более высоком уровне.
Comments
Comment from Андрей
Date: March 12, 2008, 3:41 pm
Ошибочка в последней процедуре. identity flip-vert заменить на identity flip-horiz
Comment from Sergey Khenkin
Date: March 12, 2008, 3:52 pm
Да, совершненно верно. Спасибо. Правильный вариант:
(define (square-limit painter n)
(let ((combine4 (square-of-four flip-vert rotate180
identity flip-horiz)))
(combine4 (corner-split painter n))))
Write a comment