Я відповім на це питання поступово. Почнемо з =
предиката еквівалентності. =
Предикат використовується для перевірки , є чи два числа рівні. Якщо ви надасте щось інше, крім числа, це призведе до помилки:
(= 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?