Responderé esta pregunta de forma incremental. Comencemos con el =
predicado de equivalencia. El =
predicado se usa para verificar si dos números son iguales. Si le proporciona algo más que un número, generará un error:
(= 2 3) => #f
(= 2.5 2.5) => #t
(= '() '()) => error
El eq?
predicado se usa para verificar si sus dos parámetros representan el mismo objeto en la memoria. Por ejemplo:
(define x '(2 3))
(define y '(2 3))
(eq? x y) => #f
(define y x)
(eq? x y) => #t
Sin embargo, tenga en cuenta que solo hay una lista vacía '()
en la memoria (en realidad, la lista vacía no existe en la memoria, pero un puntero a la ubicación de la memoria 0
se considera la lista vacía). Por lo tanto, cuando se comparan listas vacías eq?
, siempre se devolverá #t
(porque representan el mismo objeto en la memoria):
(define x '())
(define y '())
(eq? x y) => #t
Ahora, dependiendo de la implementación, eq?
puede o no regresar #t
para valores primitivos como números, cadenas, etc. Por ejemplo:
(eq? 2 2) => depends upon the implementation
(eq? "a" "a") => depends upon the implementation
Aquí es donde eqv?
entra en escena el predicado. El eqv?
es exactamente igual que el eq?
predicado, excepto que siempre regresará #t
para los mismos valores primitivos. Por ejemplo:
(eqv? 2 2) => #t
(eqv? "a" "a") => depends upon the implementation
Por eqv?
lo tanto, es un superconjunto de eq?
y, en la mayoría de los casos, debe usar en eqv?
lugar de eq?
.
Finalmente llegamos al equal?
predicado. El equal?
predicado es exactamente el mismo que el eqv?
predicado, excepto que también se puede usar para probar si dos listas, vectores, etc. tienen elementos correspondientes que satisfacen el eqv?
predicado. Por ejemplo:
(define x '(2 3))
(define y '(2 3))
(equal? x y) => #t
(eqv? x y) => #f
En general:
- Utilice el
=
predicado cuando desee probar si dos números son equivalentes.
- Utilice el
eqv?
predicado cuando desee probar si dos valores no numéricos son equivalentes.
- Utilice el
equal?
predicado cuando desee probar si dos listas, vectores, etc. son equivalentes.
- No use el
eq?
predicado a menos que sepa exactamente lo que está haciendo.
eqv?
, que significa algo diferente deeq?
oequal?