Процедурное представление пар и точек
Пары и точки представляются в виде процедур, а их компоненты извлекаются только через сообщения селекторов, а не через сохраненные позиции пары.
Если конструкторы и селекторы удовлетворяют одному и тому же контракту, должно ли абстрактное значение данных иметь одно конкретное физическое представление?
- Понимание контракта конструкторов и селекторов как смысла абстрактных данных
- Представление пары процедурой, принимающей процедуру селектора
- Извлечение компонентов вложенных процедурных пар без прямого хранения в car или cdr
- Использование диспетчеризации сообщений как еще одного процедурного представления
- Сохранение независимости клиентского кода от способа представления
cons-proc не выделяет обычную пару для двух своих компонентов. Процедура возвращает процедуру, которая запоминает x и y, а затем передает оба значения селектору. car-proc и cdr-proc передают селекторы, выбирающие один компонент. Вложенные значения работают точно так же, потому что операции над парами определяет контракт, а не печатная форма хранения.
В примере с точкой используется диспетчеризация сообщений. make-point возвращает процедуру, отвечающую на сообщения x, y и sum. Селекторы знают только эти сообщения. Обычная пара, вектор или другое замыкание могут заменить эту реализацию, если сохраняется то же наблюдаемое поведение конструкторов и селекторов.
- Вывод
- —
- Значение
- —
- Диагностика
- —
Программа с процедурными парами возвращает (left right 1 2 3). Точка с передачей сообщений возвращает (3 4 7 unknown-message).
Отделите вызовы конструкторов, создающие замыкания, от вызовов селекторов, которые затем вызывают эти замыкания. Во вложенной паре проследите, как результат cdr-proc оказывается еще одной процедурной парой. В примере с точкой найдите одно захваченное окружение x и y, обслуживающее несколько сообщений.
Измените программу и сравните результат.
Добавьте в make-point сообщение swap, возвращающее новую процедурную точку с переставленными местами x и y. Для проверки результата используйте только x-point и y-point.
Показать подсказку
Новую точку можно создать вызовом make-point внутри процедуры диспетчеризации, при этом клиентам по-прежнему не требуется доступ к представлению.