Я отвечу на этот вопрос постепенно. Начнем с =предиката эквивалентности. =Предикат используется для проверки , являются ли два числа равны. Если вы укажете что-либо еще, кроме числа, это вызовет ошибку:
(= 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?