Песочница

Равенство и идентичность

Лиспекс различает равенство атомов и идентичности (eq?, eqv?), глубокое структурное равенство (equal?) и числовое равенство (=).

Когда это нужно

Выбирайте равенство по смыслу. Для чисел подходит математическое равенство, для атомов или того же составного объекта равенство по идентичности, а для структур данных глубокое равенство.

Проверьте запуском

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? и его отрицание

Частая ошибка

= принимает только числа. == и != это структурные псевдонимы.

Текущие границы

  • Равенство процедур никогда не сравнивает их тела структурно.

Куда дальше

Виды значений и их идентичность описаны в главе о данных, а операции, создающие отдельные объекты, собраны в справочнике агрегатов.

Типы данных · Процедуры агрегатов