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