Risponderò a questa domanda in modo incrementale. Cominciamo con il =
predicato di equivalenza. Il =
predicato viene utilizzato per verificare se due numeri sono uguali. Se fornisci qualcos'altro tranne un numero, verrà generato un errore:
(= 2 3) => #f
(= 2.5 2.5) => #t
(= '() '()) => error
Il eq?
predicato viene utilizzato per verificare se i suoi due parametri rappresentano lo stesso oggetto in memoria. Per esempio:
(define x '(2 3))
(define y '(2 3))
(eq? x y) => #f
(define y x)
(eq? x y) => #t
Nota tuttavia che c'è solo un elenco vuoto '()
in memoria (in realtà l'elenco vuoto non esiste in memoria, ma un puntatore alla posizione di memoria 0
è considerato come l'elenco vuoto). Pertanto, quando si confrontano elenchi vuoti, eq?
verranno sempre restituiti #t
(perché rappresentano lo stesso oggetto in memoria):
(define x '())
(define y '())
(eq? x y) => #t
Ora, a seconda dell'implementazione, eq?
può o meno restituire #t
valori primitivi come numeri, stringhe, ecc. Ad esempio:
(eq? 2 2) => depends upon the implementation
(eq? "a" "a") => depends upon the implementation
È qui che eqv?
entra in gioco il predicato. Il eqv?
è esattamente lo stesso del eq?
predicato, tranne per il fatto che restituirà sempre gli #t
stessi valori primitivi. Per esempio:
(eqv? 2 2) => #t
(eqv? "a" "a") => depends upon the implementation
Quindi eqv?
è un superset di eq?
e per la maggior parte dei casi dovresti usare al eqv?
posto di eq?
.
Infine veniamo al equal?
predicato. Il equal?
predicato è esattamente lo stesso del eqv?
predicato, tranne per il fatto che può anche essere utilizzato per verificare se due elenchi, vettori, ecc. Hanno elementi corrispondenti che soddisfano il eqv?
predicato. Per esempio:
(define x '(2 3))
(define y '(2 3))
(equal? x y) => #t
(eqv? x y) => #f
In generale:
- Usa il
=
predicato quando desideri verificare se due numeri sono equivalenti.
- Usa il
eqv?
predicato quando desideri verificare se due valori non numerici sono equivalenti.
- Usa il
equal?
predicato quando desideri verificare se due elenchi, vettori, ecc. Sono equivalenti.
- Non usare il
eq?
predicato a meno che tu non sappia esattamente cosa stai facendo.
eqv?
, il che significa qualcosa di diverso daeq?
oequal?