Je vais répondre à cette question de manière progressive. Commençons par le =
prédicat d'équivalence. Le site =
Le prédicat est utilisé pour vérifier si deux nombres sont égaux. Si vous lui fournissez autre chose qu'un nombre, il déclenchera une erreur :
(= 2 3) => #f
(= 2.5 2.5) => #t
(= '() '()) => error
En eq?
Le prédicat est utilisé pour vérifier si ses deux paramètres représentent le même objet en mémoire. Par exemple :
(define x '(2 3))
(define y '(2 3))
(eq? x y) => #f
(define y x)
(eq? x y) => #t
Notez cependant qu'il n'y a qu'une seule liste vide '()
en mémoire (en fait, la liste vide n'existe pas en mémoire, mais un pointeur vers l'emplacement mémoire 0
est considérée comme la liste vide). Par conséquent, lorsque l'on compare des listes vides eq?
retournera toujours #t
(car ils représentent le même objet en mémoire) :
(define x '())
(define y '())
(eq? x y) => #t
Maintenant, en fonction de l'implémentation eq?
peut ou ne peut pas revenir #t
pour les valeurs primitives telles que les nombres, les chaînes de caractères, etc. Par exemple :
(eq? 2 2) => depends upon the implementation
(eq? "a" "a") => depends upon the implementation
C'est là que le eqv?
Le prédicat entre en jeu. Le site eqv?
est exactement le même que le eq?
sauf qu'il retournera toujours #t
pour les mêmes valeurs primitives. Par exemple :
(eqv? 2 2) => #t
(eqv? "a" "a") => depends upon the implementation
Par conséquent, eqv?
est un sur-ensemble de eq?
et dans la plupart des cas, vous devriez utiliser eqv?
au lieu de eq?
.
Enfin, nous en arrivons à la equal?
prédicat. Le site equal?
est exactement le même que le prédicat eqv?
sauf qu'il peut également être utilisé pour vérifier si deux listes, vecteurs, etc. ont des éléments correspondants qui satisfont à l'attribut eqv?
prédicat. Par exemple :
(define x '(2 3))
(define y '(2 3))
(equal? x y) => #t
(eqv? x y) => #f
En général :
- Utilisez le
=
lorsque vous souhaitez tester si deux nombres sont équivalents.
- Utilisez le
eqv?
lorsque vous souhaitez tester si deux valeurs non numériques sont équivalentes.
- Utilisez le
equal?
lorsque vous souhaitez tester si deux listes, vecteurs, etc. sont équivalents.
- N'utilisez pas le
eq?
prédicat à moins que vous ne sachiez exactement ce que vous faites.