# [plt-scheme] When does eqv? differ from eq? , from equal?

On Mon, Oct 6, 2008 at 6:53 PM, Alan Watson <alan at alan-watson.org> wrote:
>* Assuming that "it takes time" means "is not a pointer comparison", then:
*>*
*>>* it takes time to equate 10000000000 with 10000000000
*>*
*>* Not with 61-bit fixnums. :-)
*>*
*>>* but not (list 1 2 3) with (list 1 2 3)
*>*
*>* Not if all exact integers are represented as bignums or otherwise boxed. :-)
*
By "it takes time", I meant "eqv? will take more than constant time,
if it has to". That is, eqv? will take an arbitrary amount of time to
compare big enough bignums, but other structures -- even if immutable
-- it will not.
>>* However, we can observe the differences in
*>>* space consumption between a list of bignums that are all eq? (not much
*>>* space used), versus a list of bignums that are all eqv? but not eq?
*>>* (potentially lots of space used).
*>*
*>* Whether two numerical values that are eqv? are also eq? depends on the
*>* implementation. If an implementation hashes boxed numerical values, they can
*>* easily be eq? even if they are the result of different expressions. And I am
*>* not making this up; MACLISP did precisely this.
*
Hashing breaks down the extensional/intensional distinction. If your
implementation hashes its values, a lot of these issues become moot
and more cases of eq?, eqv?, and equal? become indistinguishable.
>>* I only use eq? when I really, really mean it
*>*
*>* But what do you really, really mean? For any arguments for which eq? gives a
*>* reliable result (by which I mean, a result that does not depend on the
*>* implementation), eqv? will give you the same result.
*
What I meant was, I only use eq? when I really mean "pointer equality"
-- generally for comparing two mutable structures, though I also use
it for symbols. In those cases I don't really care about bignum
equality, so eqv? is a non-issue. When I want to compare the contents
of values, I use a typed comparison like = or string=? if I can,
otherwise I use equal?.
--
Carl Eastlund