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 0
boş 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?