sicp.io
2.1.2 · Что такое данные

Процедурное представление пар и точек

Пары и точки представляются в виде процедур, а их компоненты извлекаются только через сообщения селекторов, а не через сохраненные позиции пары.

Вопрос для размышления

Если конструкторы и селекторы удовлетворяют одному и тому же контракту, должно ли абстрактное значение данных иметь одно конкретное физическое представление?

  • Понимание контракта конструкторов и селекторов как смысла абстрактных данных
  • Представление пары процедурой, принимающей процедуру селектора
  • Извлечение компонентов вложенных процедурных пар без прямого хранения в car или cdr
  • Использование диспетчеризации сообщений как еще одного процедурного представления
  • Сохранение независимости клиентского кода от способа представления

cons-proc не выделяет обычную пару для двух своих компонентов. Процедура возвращает процедуру, которая запоминает x и y, а затем передает оба значения селектору. car-proc и cdr-proc передают селекторы, выбирающие один компонент. Вложенные значения работают точно так же, потому что операции над парами определяет контракт, а не печатная форма хранения.

В примере с точкой используется диспетчеризация сообщений. make-point возвращает процедуру, отвечающую на сообщения x, y и sum. Селекторы знают только эти сообщения. Обычная пара, вектор или другое замыкание могут заменить эту реализацию, если сохраняется то же наблюдаемое поведение конструкторов и селекторов.

Код SICP421 из 1,048,576 байт UTF-8
Примеры
Результат
Вывод
Значение
Диагностика
Трасса выполнения0 / 0 событий
    Запуски происходят внутри браузера с отображением результата программы и трассы выполнения.
    Ожидаемый результат

    Программа с процедурными парами возвращает (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 внутри процедуры диспетчеризации, при этом клиентам по-прежнему не требуется доступ к представлению.

    Завершить этот урок

    В этой главе пройдено 0 из 20 уроков0%