Month: February, 2008

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

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

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

Итак, мы хотим, чтобы внутреннее представление обычных чисел в нашей обобщенной системе совпадало со внутренним представлением чисел в Scheme. С числами в таком представлении работать удобнее, так как они выглядят естественнее.
Если мы вспомним, что процедуры attach-tag, type-tag и contents соответственно помечают данные типом, определяют тип данных и получают непомеченные данные из помеченных, то сразу же […]

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

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

Объект z, с которым мы работаем в этом упражнении и для которого мы хотим вычислить модуль (magnitude), - это дважды помеченная пара, представляющая собой комплексное число в декартовой форме. Он состоит из метки complex, за которой следует метка rectangular, а уже затем идет представление числа.
Процедура magnitude задана в разделе 2.4.3 и выглядит следующим образом:
(define (magnitude z) (apply-generic ‘magnitude z))
Когда мы […]

О комментариях

24 February, 2008 (13:33) | Разное | 4 comments

Этот пост не о SICP.
Я немного подправил работу с комментариями таким образом, чтобы сделать публикацию фрагментов кода в них более удобной. Если вы хотите включить в комментарий код, окружите его тегами <code> и </code>.  В этом случае будет сохранено его форматирование, и код будет лучше читаться.
Также вы можете выделять фрагменты комментария полужирным шрифтом либо курсивом, […]

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

22 February, 2008 (14:16) | Решения упражнений | 2 comments

Рассмотрим, что нам нужно сделать при добавлении нового типа или новой операции в систему с обобщенными операциями при разных стратегиях представления операций и типов.
1. Обобщенные операции с явной диспетчеризацией.При добавлении типа нам нужно будет:

добавить специфичные операции типа по числу операций в системе;
изменить все обобщенные операции, добавив в каждую условия проверки метки нового типа и вызова […]

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

22 February, 2008 (13:01) | Решения упражнений | No comments

Это весьма интересное упражнение, поскольку оно подводит нас очень близко к такой популярной сейчас в разработке программ парадигме, как объектно-ориентированное программирование. Действительно, передача сообщений - это фундамент, на котором построено ООП.
Собственно решение упражнения приведено ниже:
(define (make-from-mag-ang r a)
(define (dispatch op)
(cond ((eq? op ‘real-part) (* r (cos a)))
[…]