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 #tpara 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á #tpara 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?