Month: February, 2008

Как получить видео лекции SICP, если у вас нет безлимитки. Часть 3.

9 February, 2008 (13:02) | Видео, Материалы | 2 comments

Окончание истории. Начало читайте здесь, а продолжение здесь.
Субботним зимним утром я отправился на почтовое отделение с целью получить свои законные диски с видео-материалами SICP, которые по всем расчетам просто обязаны были дойти до нашей забытой богом почты.
После непродолжительного разбирательства выяснилось, что бандероль действительно уже пришла и ждет своего адресата. Заплатив 42 гривны 10 копеек (чуть […]

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

8 February, 2008 (22:10) | Решения упражнений | 1 comment

Как требуется в условии упражнения, будем менять только конструкторы и селекторы для суммы и произведения так, чтобы сделать возможной работу с произвольным числом слагаемых и множителей. Начнем с суммы.
Мы будем представлять сумму как список из символа + и последующего произвольного количества слагаемых. 
Селектор addend вообще не меняется:
(define (addend s) (cadr s))
Селектор augend будет возвращать либо одно последнее […]

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

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

Сначала модифицируем процедуру deriv с тем, чтобы она распознавала и операцию возведения в степень:
(define (deriv exp var)
  (cond ((number? exp) 0)
        ((variable? exp)
         (if (same-variable? exp var) 1 0))
        ((sum? exp)
         (make-sum (deriv (addend exp) var)
                   (deriv (augend exp) var)))
        ((product? exp)
         (make-sum
           (make-product (multiplier exp)
                         (deriv (multiplicand exp) var))
           (make-product (deriv (multiplier exp) var)
                         […]

Как получить видео лекции SICP, если у вас нет безлимитки. Часть 2.

7 February, 2008 (23:23) | Видео, Материалы | 1 comment

Продолжение истории. Начало читайте здесь.
При столкновении красивой теории с жестокой реальностью рождается горькая практика. В моем случае оптимистичные ожидания получить диски с видео лекций курса “Структура и интерпретация компьютерных программ” еще к концу прошлой недели не оправдались.
Сегодня прошло 9 дней с момента отправки бандероли, и я посетил свое почтовое отделение, ожидая обнаружить диски […]

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

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

В примечании 34 описывается особая форма quote и идентичность ее действия кавычке. Кроме того, указывается, что знак кавычки является просто сокращением для формы quote. Таким образом запись
(car ”abracadabra)
является лишь сокращенной формой записи для выражения
(car (quote (quote abracadabra)))
Первая quote заставляет интерпретатор понимать остаток записи буквально как список. Вполне очевидно, что для этого списка операция car возвращает символ […]

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

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

В соответствии с примечанием реализуем процедуру equal? таким образом, чтобы она корректно работала и с числами тоже. Отметим также, что мы считаем два пустых списка эквивалентными.
Процедуру equal? можно определить таким образом:
(define (equal? a b)
  (or (and (null? a)
           (null? b))
      (and (number? a)
           (number? b)
           (= a b))
      (and (symbol? a)
           (symbol? b)
           (eq? a […]

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