Tôi sẽ trả lời câu hỏi này dần dần. Hãy bắt đầu với =
vị từ tương đương. Vị =
từ được sử dụng để kiểm tra xem hai số có bằng nhau hay không. Nếu bạn cung cấp cho nó bất kỳ thứ gì khác ngoài một số thì nó sẽ phát sinh lỗi:
(= 2 3) => #f
(= 2.5 2.5) => #t
(= '() '()) => error
Vị eq?
từ được sử dụng để kiểm tra xem hai tham số của nó có đại diện cho cùng một đối tượng trong bộ nhớ hay không. Ví dụ:
(define x '(2 3))
(define y '(2 3))
(eq? x y) => #f
(define y x)
(eq? x y) => #t
Tuy nhiên, lưu ý rằng chỉ có một danh sách trống '()
trong bộ nhớ (thực tế danh sách trống không tồn tại trong bộ nhớ, nhưng một con trỏ đến vị trí bộ nhớ 0
được coi là danh sách trống). Do đó, khi so sánh các danh sách trống eq?
sẽ luôn trả về #t
(vì chúng đại diện cho cùng một đối tượng trong bộ nhớ):
(define x '())
(define y '())
(eq? x y) => #t
Bây giờ tùy thuộc vào việc triển khai eq?
có thể trả về hoặc không trả về #t
các giá trị nguyên thủy như số, chuỗi, v.v. Ví dụ:
(eq? 2 2) => depends upon the implementation
(eq? "a" "a") => depends upon the implementation
Đây là nơi eqv?
vị từ đi vào hình ảnh. Giống eqv?
hệt như eq?
vị từ, ngoại trừ việc nó sẽ luôn trả về #t
các giá trị nguyên thủy giống nhau. Ví dụ:
(eqv? 2 2) => #t
(eqv? "a" "a") => depends upon the implementation
Do đó, eqv?
là một tập hợp siêu eq?
và đối với hầu hết các trường hợp, bạn nên sử dụng eqv?
thay thế eq?
.
Cuối cùng chúng ta đến equal?
vị ngữ. Vị equal?
từ hoàn toàn giống với eqv?
vị từ, ngoại trừ việc nó cũng có thể được sử dụng để kiểm tra xem hai danh sách, vectơ, v.v. có các phần tử tương ứng thỏa mãn eqv?
vị từ hay không. Ví dụ:
(define x '(2 3))
(define y '(2 3))
(equal? x y) => #t
(eqv? x y) => #f
Nói chung:
- Sử dụng
=
vị từ khi bạn muốn kiểm tra xem hai số có tương đương nhau không.
- Sử dụng
eqv?
vị từ khi bạn muốn kiểm tra xem hai giá trị không phải số có tương đương hay không.
- Sử dụng
equal?
vị từ khi bạn muốn kiểm tra xem hai danh sách, vectơ, v.v. có tương đương nhau hay không.
- Không sử dụng
eq?
vị ngữ trừ khi bạn biết chính xác mình đang làm gì.
eqv?
, có nghĩa là một cái gì đó khác vớieq?
hoặcequal?