Odpowiem na to pytanie stopniowo. Zacznijmy od predykatu równoważności =
. Predykat =
służy do sprawdzania, czy dwie liczby są równe. Jeśli podasz mu nic innego, jak wiele to będzie podnieść błąd:
(= 2 3) => #f
(= 2.5 2.5) => #t
(= '() '()) => error
eq?
orzecznikiem jest używany w celu sprawdzenia, czy jej dwa parametry respresent tego samego obiektu w pamięci.Na przykład:
(define x '(2 3))
(define y '(2 3))
(eq? x y) => #f
(define y x)
(eq? x y) => #t
Należy jednak pamiętać, że istnieje tylko jedna pusta lista '()
w pamięci (właściwie pusta lista nie istnieje w pamięci, ale wskaźnik do lokalizacji pamięci 0
jest uważana za pustą listę). Dlatego przy porównywaniu pustych list eq?
zawsze zwróci #t
(ponieważ reprezentują one ten sam obiekt w pamięci):
(define x '())
(define y '())
(eq? x y) => #t
Teraz w zależności od implementacji eq?
mogą lub nie mogą wrócić #t
dla wartości pierwotnych, takich jak liczby, ciągi, etc Na przykład:
(eq? 2 2) => depends upon the implementation
(eq? "a" "a") => depends upon the implementation
Tutaj pojawia się predykat eqv?
. Numer eqv?
jest dokładnie taki sam, jak predykatu eq?
, z tym że zawsze będzie zwracał #t
dla tych samych wartości pierwotnych. Na przykład:
(eqv? 2 2) => #t
(eqv? "a" "a") => depends upon the implementation
Stąd eqv?
jest rozszerzeniem eq?
i w większości przypadków należy użyć eqv?
zamiast eq?
.
Wreszcie dochodzimy do predykatu equal?
. Predykat equal?
jest dokładnie taki sam jak predykat eqv?
, z tym wyjątkiem, że można go również użyć do sprawdzenia, czy dwie listy, wektory itp. Mają odpowiednie elementy, które spełniają predykat eqv?
. Na przykład:
(define x '(2 3))
(define y '(2 3))
(equal? x y) => #t
(eqv? x y) => #f
ogólnie:
- Użyj
=
orzecznik gdy chcesz sprawdzić, czy dwie liczby są równoważne.
- Użyj predykatu
eqv?
, aby przetestować, czy dwie wartości nieliczbowe są równoważne.
- Użyj predykatu
equal?
, aby sprawdzić, czy dwie listy, wektory itp. Są równoważne.
- Nie używaj predykatu
eq?
, chyba że wiesz dokładnie, co robisz.
i istnieje również "eqv?", Co oznacza coś innego niż "eq?" Lub "equal?" – newacct