Ich werde diese Frage schrittweise beantworten. Beginnen wir mit dem =
Äquivalenzprädikat. Das =
Prädikat wird verwendet, um zu überprüfen, ob zwei Zahlen gleich sind. Wenn Sie etwas anderes als eine Nummer angeben, wird ein Fehler ausgegeben:
(= 2 3) => #f
(= 2.5 2.5) => #t
(= '() '()) => error
Das eq?
Prädikat wird verwendet, um zu überprüfen, ob seine beiden Parameter dasselbe Objekt im Speicher darstellen. Zum Beispiel:
(define x '(2 3))
(define y '(2 3))
(eq? x y) => #f
(define y x)
(eq? x y) => #t
Beachten Sie jedoch, dass sich nur eine leere Liste '()
im Speicher befindet (tatsächlich existiert die leere Liste nicht im Speicher, aber ein Zeiger auf den Speicherort 0
wird als leere Liste betrachtet). Daher werden beim Vergleich leerer Listen eq?
immer zurückgegeben #t
(da sie dasselbe Objekt im Speicher darstellen):
(define x '())
(define y '())
(eq? x y) => #t
Abhängig von der Implementierung eq?
kann nun #t
für primitive Werte wie Zahlen, Zeichenfolgen usw. zurückgegeben werden oder nicht . Zum Beispiel:
(eq? 2 2) => depends upon the implementation
(eq? "a" "a") => depends upon the implementation
Hier kommt das eqv?
Prädikat ins Spiel. Das eqv?
ist genau das gleiche wie das eq?
Prädikat, außer dass es immer #t
für dieselben primitiven Werte zurückgibt. Zum Beispiel:
(eqv? 2 2) => #t
(eqv? "a" "a") => depends upon the implementation
Daher eqv?
ist eine Obermenge von eq?
und für die meisten Fälle sollten Sie eqv?
anstelle von verwenden eq?
.
Schließlich kommen wir zum equal?
Prädikat. Das equal?
Prädikat ist genau das gleiche wie das eqv?
Prädikat, außer dass es auch verwendet werden kann, um zu testen, ob zwei Listen, Vektoren usw. entsprechende Elemente haben, die das eqv?
Prädikat erfüllen . Zum Beispiel:
(define x '(2 3))
(define y '(2 3))
(equal? x y) => #t
(eqv? x y) => #f
Im Allgemeinen:
- Verwenden Sie das
=
Prädikat, wenn Sie testen möchten, ob zwei Zahlen gleichwertig sind.
- Verwenden Sie das
eqv?
Prädikat, wenn Sie testen möchten, ob zwei nicht numerische Werte äquivalent sind.
- Verwenden Sie das
equal?
Prädikat, wenn Sie testen möchten, ob zwei Listen, Vektoren usw. gleichwertig sind.
- Verwenden Sie das
eq?
Prädikat nur, wenn Sie genau wissen, was Sie tun.
eqv?
, was etwas anderes bedeutet alseq?
oderequal?