Просто чтобы добавить к Оскару ответ.Существуют специфичные для типа процедуры, такие как string=?
, char=?
и =
для чисел, но для сравнения в общем случае существует 3:
eq?
тестов, если два аргумента имеют одинаковое значение, как в созданном в тот же момент момент или указатель равен. eqv?
проверяет, выглядят ли два примитивных / скалярных / атомарных значения одинаково при отображении equal?
проверяет, выглядят ли два значения одинаково
Кроме того,что #t
для eq?
гарантированно равно #t
для eqv?
abd, что #t
для eqv?
гарантированно равно #t
для equal?
.
Я прочитал книги, которые полностью пропускают eqv?
и просто держу eq?
и equal?
в качестве общего сравнения.Изрядное количество процедур, которые сравнивают вещи, имеют 3 варианта 3 методов сравнения по всем направлениям.Например.member
(equal?
), memv
(eqv?
), memq
(eq?
).
О eq?
: мы гарантируем, что '()
, #t
, #f
и символы, такие как 'test
, будут каждый раз принимать одно и то же значение, поэтому они всегда равны указателю,Другие значения могут быть, например, число от миллиарда, но у вас нет гарантии, что все реализации сделают это.(eq? 10 10) ; ==> #f
является правильным в соответствии со стандартом, а также (eq? '(a) '(a)) ; ==> #t
.На самом деле эти два примера могут иметь любой результат, и это нормально для отчета.Обратите внимание, как я говорю, вы гарантированно будете #t
с eqv?
, если eq?
yuilds #t
, но не наоборот.Если что-то eqv?
, вы все еще не представляете, что будет eq?
.