Решение упражнения 2.78 из SICP
Итак, мы хотим, чтобы внутреннее представление обычных чисел в нашей обобщенной системе совпадало со внутренним представлением чисел в Scheme. С числами в таком представлении работать удобнее, так как они выглядят естественнее.
Если мы вспомним, что процедуры attach-tag, type-tag и contents соответственно помечают данные типом, определяют тип данных и получают непомеченные данные из помеченных, то сразу же поймем, что для обычных чисел эти операции тривиальны:
- помечать числа, как и договорились, мы вообще не будем;
- определять тип будем с помощью предиката number?, а типом чисел будем считать scheme-number;
- непомеченные числа у нас совпадают с помеченными.
Таким образом получим следующие определения введенных ранее процедур для работы с помеченными типом данными, в которых числа являются особым случаем:
(define (attach-tag type-tag contents)
(if (number? contents)
contents
(cons type-tag contents)))
(define (type-tag datum)
(cond ((number? datum) 'scheme-number)
((pair? datum) (car datum))
(else (error "Некорректные помеченные данные -- TYPE-TAG" datum))))
(define (contents datum)
(cond ((number? datum) datum)
((pair? datum) (cdr datum))
(else (error "Некорректные помеченные данные -- CONTENTS" datum))))
А вот, хорошо ли это - иметь особые случаи - вопрос для отдельного обсуждения.
Comments
Comment from gorilych
Date: October 18, 2009, 6:19 pm
attach-tag некорректна. Если я придумаю новый тип, в котором содержание (contents) будет выражаться обычным числом, то она будет работать неправильно. Attach-tag вообще не должен анализировать contents. Анализироваться должен type-tag в данном случае. Если он совпадает с scheme-number, то возвращаться должен просто contents.
Write a comment