Category: SICP

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

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

Это простое упражнение, проверяющее степень усвоения базового материала об использовании кавычки для представления символьных данных. Ответы приведены ниже:
> (list ‘a ‘b ‘c)
(a b c)
> (list (list ‘george))
((george))
> (cdr ‘((x1 x2) (y1 y2)))
((y1 y2))
> (cadr ‘((x1 x2) (y1 y2)))
(y1 y2)
> (pair? (car ‘(a short list)))
#f
> (memq ‘red ‘((red shoes) (blue socks)))
#f
> (memq ‘red ‘(red shoes blue […]

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

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

Описанные в каждом из пунктов упражнения изменения можно внести в результат, переопределив соответствующие процедуры указанным ниже образом:
(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))
            […]

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

6 February, 2008 (21:16) | Решения упражнений | No comments

Определение below напрямую абсолютно аналогично определению beside. Отличия только в том, как происходит разбиение исходной рамки на две. В beside исходная рамка (0.0, 0.0) - (1.0, 1.0) разбивается на две по вертикали : (0.0, 0.0) - (0.5, 1.0) и (0.5, 0.0) - (1.0, 1.0).  В below та же исходная рамка разбивается несколько иначе (по горизонтали): (0.0, 0.0) […]

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

6 February, 2008 (20:46) | Решения упражнений | No comments

Для горизонтального отражения и поворотов на 180 и 270 градусов против часовой стрелки будем также применять transform-painter. Схематически каждое из этих преобразований обозначено на рисунке ниже:

Думаю, чертеж объясняет в даном случае лучше слов. Таким образом мы легко получаем следующие определения процедур:
(define (flip-horiz painter)
  (transform-painter painter
                     (make-vector 1.0 0.0)
                     (make-vector 0.0 0.0)
                     (make-vector 1.0 1.0)))
(define (rotate-180 […]

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

5 February, 2008 (21:25) | Решения упражнений | 2 comments

Сначала простое. Рисовалка, обводящая рамку просто строит 4 отрезка, которые являются сторонами рамки, то есть соединяют точки (0, 0), (1, 0), (1, 1) и (0, 1):
(define outline-painter
  (segments->painter (list (make-segment (make-vect 0 0)
                                         (make-vect 1 0))
                           (make-segment (make-vect 1 0)
                                         (make-vect 1 1))
                           (make-segment (make-vect 1 1)
                                         (make-vect 0 1))
                           (make-segment (make-vect 0 1)
                                         (make-vect […]

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

4 February, 2008 (21:57) | Решения упражнений | No comments

Снова будем для представления направленного отрезка пару. На этот раз элементами пары будут вектора к началу и концу отрезка из начала координат.
Конструктор и селекторы будут такими:
(define (make-segment start end)
(cons start end))

(define (start-segment segment)
(car segment))

(define (end-segment segment)
(cdr segment))

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

4 February, 2008 (21:36) | Решения упражнений | No comments

Итак, селекторы для первого варианта представления рамки записываются следующим образом:
(define (origin-frame frame)
(car frame))

(define (edge1-frame frame)
(cadr frame))

(define (edge2-frame frame)
(caddr frame))
Селекторы для второго варианта выглядят так:
(define (origin-frame frame)
(car frame))

(define (edge1-frame frame)
(cadr frame))

(define (edge2-frame frame)
(cddr frame))
Как видим, отличие лишь в последнем селекторе, что легко пояснить тем, […]

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

4 February, 2008 (21:15) | Решения упражнений | 1 comment

Это упражнение не вызовет труда у тех, кто разобрался с концепциями барьеров абстракции, конструкторов и селекторов.
Для представления векторов я выбрал пары. Можно было бы избрать и альтернативную форму, например списки, что было бы более удобно при работе с многомерными векторами. Но в случае двумерного пространства пара видится простейшим способом представления.
Конструктор и селекторы для векторов выглядят […]

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

4 February, 2008 (20:56) | Решения упражнений | No comments

У процедур right-split и up-split есть очень много общего. По сути, они отличаются лишь порядком вызова операций beside и below. Таким образом мы можем ввести обобщенную операцию generic-split, которая будет задавать схему работы, общую для right-split и up-split, и процедуру высшего порядка split, которая с помощью generic-split по заданным операциям (главной и вложенной) будет генерировать конкретную […]

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

4 February, 2008 (20:19) | Решения упражнений | No comments

Процедура up-split очень похожа на приводящуюся в книге right-split. Если right-split оставляет в левой части рамки старую рисовалку (ох и перевод!), а правую делит на две расположенные одна под другой части и вызывает себя для них рекурсивно, то up-split оставляет старую рисовалку в нижней половине рамки, а верхнюю делит на две части, расположенные рядом по […]