Решение упражнения 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