Когда это нужно
Выбирайте равенство по смыслу: математическое для чисел, равенство идентичности для атомов или того же составного объекта, глубокое — для структуры данных.
Проверьте запуском
LISPEX
(list (= 2 2.0) (eqv? 2 2.0) (equal? (list 1 2) (list 1 2)))Наблюдаемый результат
OUTPUT
(#t #f #t)Разбор примера
= считает точное 2 и неточное 2.0 одним математическим числом. eqv? сохраняет различие точности. Два отдельно созданных списка — разные объекты, но equal? видит одинаковое содержимое.
Как рассуждать
- В этом профиле
eq?иeqv?совпадают на атомах и сравнивают составные значения по идентичности. eqv?иequal?чувствительны к точности: точное2и неточное2.0различны.equal?рекурсивно сравнивает пары, векторы, байтовые векторы и строки с обнаружением циклов.
Быстрый выбор
| Предикат | Назначение | Поведение для агрегатов |
|---|---|---|
= | математическое равенство чисел | нечисло даёт ошибку области |
eq? | атомы и идентичность объекта | истина только для того же объекта |
eqv? | атомы с учётом точности и идентичность | истина только для того же объекта |
equal? | содержимое вложенных данных | рекурсивное сравнение с защитой от циклов |
== / != | читаемые структурные псевдонимы | equal? и его отрицание |
Частая ошибка
= принимает только числа; == и != — структурные псевдонимы.
Текущие границы
- Равенство процедур никогда не сравнивает их тела структурно.
Куда дальше
Виды значений и их идентичность описаны в главе о данных, а создающие отдельные объекты операции — в справочнике агрегатов.