A predicate is a procedure that always returns a boolean
value (#t or #f). An equivalence predicate is
the computational analogue of a mathematical equivalence relation (it is
symmetric, reflexive, and transitive). Of the equivalence predicates
described in this section, eq?
is the finest or most
discriminating, and equal?
is the coarsest. Eqv?
is
slightly less discriminating than eq?
.
eqv? obj1 obj2 | procedure |
The The
The
(eqv? 'a 'a) ==> #t (eqv? 'a 'b) ==> #f (eqv? 2 2) ==> #t (eqv? '() '()) ==> #t (eqv? 100000000 100000000) ==> #t (eqv? (cons 1 2) (cons 1 2)) ==> #f (eqv? (lambda () 1) (lambda () 2)) ==> #f (eqv? #f 'nil) ==> #f (let ((p (lambda (x) x))) (eqv? p p)) ==> #t The following examples illustrate cases in which the above rules do
not fully specify the behavior of (eqv? "" "") ==> unspecified (eqv? '#() '#()) ==> unspecified (eqv? (lambda (x) x) (lambda (x) x)) ==> unspecified (eqv? (lambda (x) x) (lambda (y) y)) ==> unspecified The next set of examples shows the use of (define gen-counter (lambda () (let ((n 0)) (lambda () (set! n (+ n 1)) n)))) (let ((g (gen-counter))) (eqv? g g)) ==> #t (eqv? (gen-counter) (gen-counter)) ==> #f (define gen-loser (lambda () (let ((n 0)) (lambda () (set! n (+ n 1)) 27)))) (let ((g (gen-loser))) (eqv? g g)) ==> #t (eqv? (gen-loser) (gen-loser)) ==> unspecified (letrec ((f (lambda () (if (eqv? f g) 'both 'f))) (g (lambda () (if (eqv? f g) 'both 'g)))) (eqv? f g)) ==> unspecified (letrec ((f (lambda () (if (eqv? f g) 'f 'both))) (g (lambda () (if (eqv? f g) 'g 'both)))) (eqv? f g)) ==> #f Since it is an error to modify constant objects (those returned by
literal expressions), implementations are permitted, though not
required, to share structure between constants where appropriate. Thus
the value of (eqv? '(a) '(a)) ==> unspecified (eqv? "a" "a") ==> unspecified (eqv? '(b) (cdr '(a b))) ==> unspecified (let ((x '(a))) (eqv? x x)) ==> #t
Rationale:
The above definition of
|
eq? obj1 obj2 | procedure |
(eq? 'a 'a) ==> #t (eq? '(a) '(a)) ==> unspecified (eq? (list 'a) (list 'a)) ==> #f (eq? "a" "a") ==> unspecified (eq? "" "") ==> unspecified (eq? '() '()) ==> #t (eq? 2 2) ==> unspecified (eq? #\A #\A) ==> unspecified (eq? car car) ==> #t (let ((n (+ 2 3))) (eq? n n)) ==> unspecified (let ((x '(a))) (eq? x x)) ==> #t (let ((x '#())) (eq? x x)) ==> #t (let ((p (lambda (x) x))) (eq? p p)) ==> #t Rationale: It will usually be possible to implement |
equal? obj1 obj2 | library procedure |
(equal? 'a 'a) ==> #t (equal? '(a) '(a)) ==> #t (equal? '(a (b) c) '(a (b) c)) ==> #t (equal? "abc" "abc") ==> #t (equal? 2 2) ==> #t (equal? (make-vector 5 'a) (make-vector 5 'a)) ==> #t (equal? (lambda (x) x) (lambda (y) y)) ==> unspecified |