Песочница

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

Lispex разделяет равенство атомов/идентичности (`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? и его отрицание

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

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

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

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

Куда дальше

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

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