Изменяемая таблица за lookup и insert!
Ассоциативный список за lookup и insert! меняет запись на месте, привязывает новую к таблице и вводит вложенную подтаблицу по второму ключу.
Какие связи должны измениться, когда таблица обновляет одну запись или создает новый вложенный путь ключей?
- Использование assoc для поиска изменяемой записи за заголовком таблицы
- Обновление существующей записи с помощью set-cdr!
- Вставка новой записи путем изменения хвоста таблицы
- Представление таблицы с двумя ключами в виде подтаблиц, содержащих записи
- Различение неудачного поиска и сохраненного значения
Таблица с одним ключом представляет собой изменяемый список, первым элементом которого является закрытый заголовок. lookup ищет только среди записей после этого заголовка. insert! изменяет cdr существующей пары ключ-значение при наличии ключа, в противном случае она изменяет пару заголовка таблицы, так что новая запись становится частью ассоциативного списка. Клиентский код не зависит от порядка вставки или расположения пар.
Таблица с двумя ключами хранит запись первого ключа, чей cdr сам является ассоциативным списком. Вставка нового второго ключа изменяет эту подтаблицу, тогда как новый первый ключ связывает целую подтаблицу с внешней таблицей. Обновление arithmetic с 10 до 11 изменяет существующую самую глубоко вложенную запись вместо создания дубликата. В этих примерах #f используется в качестве результата отсутствия значения, поэтому сохранение #f потребовало бы более богатого протокола lookup.
- Вывод
- —
- Значение
- —
- Диагностика
- —
Первая программа возвращает (9 5 #f (*table* (beta . 5) (alpha . 9))). Вторая программа возвращает (11 20 30 #f (*table* (language (scheme . 30)) (math (algebra . 20) (arithmetic . 11)))).
Сравните обходы assoc, которые находят alpha, с обходом gamma, достигающим конца. Отличите set-cdr! для существующей записи от set-cdr! для заголовка таблицы или подтаблицы, который связывает новую запись. Во вложенном запуске проследите за внешним ключом перед внутренним ключом и убедитесь, что обновление arithmetic изменяет одну существующую пару.
Измените программу и сравните результат.
Добавьте physics в math, обновите scheme до 31 и добавьте вторую запись language. Предскажите порядок внешних и внутренних записей перед запуском, затем объясните, какие обновления изменяют записи, а какие изменяют хвосты таблиц.
Показать подсказку
Присутствующий ключ изменяет cdr своей записи. Отсутствующий ключ создает новую пару и связывает ее в начале соответствующего ассоциативного списка.