Vou responder a essa pergunta aos poucos. Vamos começar com o =
predicado de equivalência. O =
predicado é usado para verificar se dois números são iguais. Se você fornecer qualquer coisa além de um número, ele gerará um erro:
(= 2 3) => #f
(= 2.5 2.5) => #t
(= '() '()) => error
O eq?
predicado é usado para verificar se seus dois parâmetros representam o mesmo objeto na memória. Por exemplo:
(define x '(2 3))
(define y '(2 3))
(eq? x y) => #f
(define y x)
(eq? x y) => #t
Observe, entretanto, que há apenas uma lista vazia '()
na memória (na verdade, a lista vazia não existe na memória, mas um ponteiro para o local da memória 0
é considerado a lista vazia). Portanto, ao comparar listas vazias eq?
sempre retornará #t
(porque representam o mesmo objeto na memória):
(define x '())
(define y '())
(eq? x y) => #t
Agora, dependendo da implementação eq?
pode ou não retornar #t
para valores primitivos, como números, strings, etc. Por exemplo:
(eq? 2 2) => depends upon the implementation
(eq? "a" "a") => depends upon the implementation
É aqui que o eqv?
predicado entra em cena. O eqv?
é exatamente o mesmo que o eq?
predicado, exceto que sempre retornará #t
para os mesmos valores primitivos. Por exemplo:
(eqv? 2 2) => #t
(eqv? "a" "a") => depends upon the implementation
Portanto, eqv?
é um superconjunto de eq?
e, na maioria dos casos, você deve usar em eqv?
vez de eq?
.
Finalmente chegamos ao equal?
predicado. O equal?
predicado é exatamente o mesmo que o eqv?
predicado, exceto que também pode ser usado para testar se duas listas, vetores, etc. têm elementos correspondentes que satisfazem o eqv?
predicado. Por exemplo:
(define x '(2 3))
(define y '(2 3))
(equal? x y) => #t
(eqv? x y) => #f
Em geral:
- Use o
=
predicado quando quiser testar se dois números são equivalentes.
- Use o
eqv?
predicado quando desejar testar se dois valores não numéricos são equivalentes.
- Use o
equal?
predicado quando quiser testar se duas listas, vetores, etc. são equivalentes.
- Não use o
eq?
predicado, a menos que saiba exatamente o que está fazendo.
eqv?
, o que significa algo diferente deeq?
ouequal?