sicp.io
2.4.2 · Управляемая данными диспетчеризация

Метка типа и выбор операции по таблице

Обобщенный интерфейс связывает имя операции с типом данных и берет подходящую процедуру из одной таблицы вместо ветвления в каждом вызове.

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

Как таблица операций сохраняет единый интерфейс для различных представлений?

  • Прикрепление явной метки типа к содержимому представления
  • Использование пары из операции и типа в качестве ключа диспетчеризации
  • Разделение формул magnitude для прямоугольного и полярного представлений
  • Вызов единого обобщенного интерфейса magnitude для обоих представлений

Каждая запись таблицы связывает ключ (magnitude type) с процедурой, которая понимает только содержимое этого типа. Прямоугольная процедура вычисляет квадратный корень из x в квадрате плюс y в квадрате, тогда как полярная процедура считывает сохраненный радиус.

apply-generic удаляет метку только после того, как get выберет подходящую процедуру. Клиентский код указывает magnitude и передает данные с меткой, не проверяя, какое именно представление в них содержится. Добавление нового представления изменяет таблицу, а не обобщенный интерфейс.

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

    Первая программа возвращает (5.0 5.0). Вторая программа возвращает (13.0 13.0).

    На что обратить внимание в трассе

    Проследите за тем, как get сравнивает ключ операции и типа перед тем, как apply-generic передаст только содержимое выбранной процедуре. Прямоугольный запуск доходит до sqrt, а полярный запуск возвращает первое поле содержимого.

    Попробуйте сами

    Измените программу и сравните результат.

    Добавьте запись magnitude для одномерного представления с меткой linear, а затем вызовите неизмененный интерфейс apply-generic с сохраненной длиной 9.0.

    Показать подсказку

    Новым ключом будет (magnitude linear). Соответствующая процедура может вернуть первое поле содержимого.

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

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