Решение упражнения 2.52 из SICP

7 February, 2008 (20:23) | Решения упражнений

Описанные в каждом из пунктов упражнения изменения можно внести в результат, переопределив соответствующие процедуры указанным ниже образом:

(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