Метка типа и выбор операции по таблице
Обобщенный интерфейс связывает имя операции с типом данных и берет подходящую процедуру из одной таблицы вместо ветвления в каждом вызове.
Как таблица операций сохраняет единый интерфейс для различных представлений?
- Прикрепление явной метки типа к содержимому представления
- Использование пары из операции и типа в качестве ключа диспетчеризации
- Разделение формул magnitude для прямоугольного и полярного представлений
- Вызов единого обобщенного интерфейса magnitude для обоих представлений
Каждая запись таблицы связывает ключ (magnitude type) с процедурой, которая понимает только содержимое этого типа. Прямоугольная процедура вычисляет квадратный корень из x в квадрате плюс y в квадрате, тогда как полярная процедура считывает сохраненный радиус.
apply-generic удаляет метку только после того, как get выберет подходящую процедуру. Клиентский код указывает magnitude и передает данные с меткой, не проверяя, какое именно представление в них содержится. Добавление нового представления изменяет таблицу, а не обобщенный интерфейс.
- Вывод
- —
- Значение
- —
- Диагностика
- —
Первая программа возвращает (5.0 5.0). Вторая программа возвращает (13.0 13.0).
Проследите за тем, как get сравнивает ключ операции и типа перед тем, как apply-generic передаст только содержимое выбранной процедуре. Прямоугольный запуск доходит до sqrt, а полярный запуск возвращает первое поле содержимого.
Измените программу и сравните результат.
Добавьте запись magnitude для одномерного представления с меткой linear, а затем вызовите неизмененный интерфейс apply-generic с сохраненной длиной 9.0.
Показать подсказку
Новым ключом будет (magnitude linear). Соответствующая процедура может вернуть первое поле содержимого.