Решение упражнения 2.83 из SICP
Начнем с обобщенной процедуры raise, которая будет поднимать объект на один уровень в башне типов. Она записывается абсолютно аналогично остальным обобщенным операциям:
(define (raise x) (apply-generic 'raise x))
Просто. Но для того, чтобы она заработала, необходимо определить конкретные реализации подъема типа в башне для всех типов, кроме последнего, самого верхнего в иерархии. Мне кажется, что помещать соответствующие процедуры подъема объекта типа А к находящемуся непосредственно над ним в башне типу В лучше в пакете, описывающем тип В, так как именно более общий тип должен заботиться о приведении к себе частных. Впрочем, возможно, есть и лучшее решение.
Итак, в пакет для работы с целыми числами (integer) мы не включаем ничего.
В пакет для работы с рациональными числами (rational) включаем строки:
(define (integer->rational n) (make-rational n 1)) (put 'raise '(integer) integer->rational)
В пакет для работы с действительными числами (real) включаем:
(define (rational->real r) (make-real (/ (numer r) (denom r)))) (put 'raise '(rational) rational->real)
Пакет комплексных чисел (complex) дополняем так:
(define (real->complex x) (make-complex-from-real-imag x 0)) (put 'raise '(real) real->complex)
Все. Теперь подъем по иерархии типов с помощью raise будет работать.
Comments
Pingback from SICP по-русски » Решение упражнения 2.85 из SICP
Date: March 5, 2008, 10:06 pm
[…] Определение операции проецирования project похоже на определение операции raise. […]
Write a comment