Bu soruyu adım adım cevaplayacağım. =Eşdeğerlik yüklemiyle başlayalım . =Yüklem iki sayı eşit olup olmadığını kontrol etmek için kullanılır. Bir sayı dışında bir şey verirseniz, o zaman bir hataya neden olur:
(= 2 3) => #f
(= 2.5 2.5) => #t
(= '() '()) => error
eq?Yüklem iki parametre hafızasında aynı nesne respresent olmadığını kontrol etmek için kullanılır. Örneğin:
(define x '(2 3))
(define y '(2 3))
(eq? x y) => #f
(define y x)
(eq? x y) => #t
Bununla birlikte, '()bellekte yalnızca bir boş liste olduğunu unutmayın (aslında boş liste bellekte yoktur, ancak bellek konumuna bir işaretçi 0boş liste olarak kabul edilir). Dolayısıyla, boş listeleri karşılaştırırken eq?her zaman geri dönecektir #t(çünkü bellekte aynı nesneyi temsil ederler):
(define x '())
(define y '())
(eq? x y) => #t
Şimdi uygulamaya bağlı olarak sayılar, dizeler vb. Gibi ilkel değerler için eq?dönebilir veya dönmeyebilir #t. Örneğin:
(eq? 2 2) => depends upon the implementation
(eq? "a" "a") => depends upon the implementation
Bu, eqv?yüklemin ortaya çıktığı yerdir . Her zaman aynı ilkel değerler için dönmesi dışında eqv?, eq?yüklem ile tamamen aynıdır #t. Örneğin:
(eqv? 2 2) => #t
(eqv? "a" "a") => depends upon the implementation
Bu nedenle eqv?, bir üst kümesidir eq?ve çoğu durumda eqv?bunun yerine kullanmanız gerekir eq?.
Sonunda equal?yüklemeye geldik . equal?Öncül tam olarak aynı eqv?zamanda, iki listeleri, vektörler, vb tatmin elemanları ilgili olup olmadığını test etmek için kullanılabilir dışında yüklemi eqv?yüklemi. Örneğin:
(define x '(2 3))
(define y '(2 3))
(equal? x y) => #t
(eqv? x y) => #f
Genel olarak:
=İki sayının eşdeğer olup olmadığını test etmek istediğinizde yüklemi kullanın .
eqv?İki sayısal olmayan değerin eşdeğer olup olmadığını test etmek istediğinizde yüklemi kullanın .
equal?İki listenin, vektörün vb. Eşdeğer olup olmadığını test etmek istediğinizde yüklemi kullanın .
eq?Tam olarak ne yaptığınızı bilmediğiniz sürece yüklemeyi kullanmayın .
eqv?hangi farklı bir şey anlamına gelireq?veyaequal?