Category: SICP

Субтитры к видео лекциям SICP

12 March, 2008 (23:23) | Видео | 17 comments

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

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

7 March, 2008 (20:59) | Решения упражнений | No comments

Сказать, какой смысл определять комплексные числа с действительными и мнимыми частями, не являющимися действительными числами, мне трудно. Тем не менее, легко представить, что в системе существует несколько различных представлений действительных чисел (например, различающихся точностью и объемом требуемой памяти). В таком случае задача имеет смысл.
Я не буду приводить весь код модифицированной системы, а просто укажу какие […]

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

5 March, 2008 (21:09) | Решения упражнений | 4 comments

Определение операции проецирования project похоже на определение операции raise.
Мы также вводим обобщенную операцию:
(define (project x) (apply-generic ‘project x))
и добавляем в пакеты соответствующие строки, реализующие для каждого типа в башне проецирование на предыдущий:
;integer package
;rational package
(define (rational->integer r)
  (make-integer (round (/ (numer r) (denom r)))))
(put ‘project ‘(rational) rational->integer)
;real package
(define (real->rational x)
  (make-rational (numerator x) (denominator x)))
(put ‘project […]

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

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

Для простоты я буду рассматривать вариант приведения типов только для бинарных операций, который соответствует рассмотренному в основном тексте книги варианту apply-generic.
Я модифицирую процедуру apply-generic следующим образом: если операции для двух аргументов заданных типов не нашлось, я сравню их типы. Если типы одинаковы, я попытаюсь поднять оба аргумента по башне типов и, если это возможно, выполнить операцию […]

План лекций по SICP из Питера

2 March, 2008 (22:45) | Материалы, Преподавание | No comments

Евгений Кирпичев с февраля этого года читает в ИТМО СПбГУ спецкурс, основанный на книге и видео-лекциях “Структура и интерпретация компьютерных программ”. Планы своих лекций Евгений выложил в открытый доступ на вики питерской Haskell User Group. Пока что доступны две первые лекции:
Лекция 1. Основы лямбда-исчисления и лиспа. Итерация и рекурсия.
Лекция 2. Функции высшего порядка и данные.
К […]

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

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

Начнем с обобщенной процедуры raise, которая будет поднимать объект на один уровень в башне типов. Она записывается абсолютно аналогично остальным обобщенным операциям:
(define (raise x) (apply-generic ‘raise x))
Просто. Но для того, чтобы она заработала, необходимо определить конкретные реализации подъема типа в башне для всех типов, кроме последнего, самого верхнего в иерархии. Мне кажется, что помещать соответствующие процедуры […]

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

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

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

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

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

Идея Хьюго о добавлении процедур приведения типов к самим себе, скажем так, не слишком светлая.
а. Посмотрим, что происходит при вызове обобщенной процедуры exp, определенной только для обычных чисел, с двумя комплексными параметрами в случае, когда заданы процедуры приведения типов к себе, предложенные Хьюго. Сначала exp вызовет apply-generic для операции exp и двух комплексных чисел. apply-generic […]

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

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

Это упражнение аналогично предыдущему, поэтому буду краток, но остановлюсь на интересных деталях.
Обобщенная процедура =zero? определяется следующим типичным образом:
(define (=zero? x) (apply-generic ‘=zero? x))

В пакет для работы с обычными числами добавляем строки:
(define (=zero? x) (= x 0))
(put ‘=zero? ‘(scheme-number) =zero?)
В пакет рациональных чисел добавляем:
(define (=zero? x) (= (numer x) 0))
(put ‘=zero? ‘(rational) =zero?)
В пакет комплексных чисел […]

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

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

Первым делом, определим саму обобщенную операцию проверки эквивалентности equ?. Мы еще не определяли обобщенных операций, являющихся предикатами. Но никаких сложностей с этим не возникает, ведь предикат - это всего лишь частный случай обыкновенной процедуры, который возвращает булево значение (истина или ложь). Таким образом определяется обобщенный предикат так же, как любая обобщенная операция:
(define (equ? x y) […]