Я отвечу на этот вопрос постепенно. Начнем с =
предиката эквивалентности. =
Предикат используется для проверки , являются ли два числа равны. Если вы укажете что-либо еще, кроме числа, это вызовет ошибку:
(= 2 3) => #f
(= 2.5 2.5) => #t
(= '() '()) => error
eq?
Предикат используются для проверки два его клиентов отражают параметров , один и тот же объект в памяти. Например:
(define x '(2 3))
(define y '(2 3))
(eq? x y) => #f
(define y x)
(eq? x y) => #t
Однако обратите внимание, что '()
в памяти есть только один пустой список (на самом деле пустой список не существует в памяти, но указатель на ячейку памяти 0
рассматривается как пустой список). Следовательно, при сравнении пустые списки eq?
всегда будут возвращаться #t
(потому что они представляют один и тот же объект в памяти):
(define x '())
(define y '())
(eq? x y) => #t
Теперь в зависимости от реализации eq?
может возвращаться или не возвращаться #t
для примитивных значений, таких как числа, строки и т. Д. Например:
(eq? 2 2) => depends upon the implementation
(eq? "a" "a") => depends upon the implementation
Вот eqv?
тут-то и появляется предикат. Это eqv?
в точности то же самое, что и eq?
предикат, за исключением того, что он всегда будет возвращать #t
одни и те же примитивные значения. Например:
(eqv? 2 2) => #t
(eqv? "a" "a") => depends upon the implementation
Следовательно eqv?
, это расширенный набор, eq?
и в большинстве случаев вы должны использовать eqv?
вместо него eq?
.
Наконец, мы подошли к equal?
сказуемому. equal?
Предикат точно так же , как и eqv?
предикат, за исключением того, что она также может быть использована для проверки два списков, векторы и т.д. имеют соответствующие элементы , которые удовлетворяют eqv?
предикат. Например:
(define x '(2 3))
(define y '(2 3))
(equal? x y) => #t
(eqv? x y) => #f
В общем:
- Используйте
=
предикат, если хотите проверить, эквивалентны ли два числа.
- Используйте
eqv?
предикат, если хотите проверить, эквивалентны ли два нечисловых значения.
- Используйте
equal?
предикат, если хотите проверить, эквивалентны ли два списка, вектора и т. Д.
- Не используйте
eq?
предикат, если вы точно не знаете, что делаете.
eqv?
, что означает нечто отличное отeq?
илиequal?