Alright, this has been floating around for some time and it is time to write it up.
Several object-oriented languages (e.g., Java, Ruby, C++, etc.) have ways to define equality and comparison operators or methods. In Java the Object class defines the equals method, which can be specialized in user code and the Comparable<T> interface.
In Common Lisp, while all the machinery is there to provide such facilities, there has been no push to provide them. I think there are two reasons for this. The first one lies in the widespread use of :test keywords and the programming style it encourages, especially when writing libraries. The second in the influential KMP's paper on The Best of Intentions: EQUAL Rights - and Wrongs - in Lisp.
The first reason does not really needs discussing, the second, a bit. In my honest opinion, there are no real reasons not to have a notion of generic equality (and comparisons) on top of the standard :test machinery, provided that some caution is taken.
Having said so, I built methods for the following generic functions.
(defgeneric AEQUALIS (a b &rest keys &key recursive-p &allow-other-keys) (:method ((a T) (b T) &rest keys &key recursive-p &allow-other-keys) (eq a b)) ) (defgeneric COMPARE (a b &rest keys &key recursive-p &allow-other-keys) ...)
AEQUALIS is Latin for "equal". The generic function COMPARE returns <, >, =, or /=.
I prepared a specification for them (and an implementation) in order to post a CDR. You can find it in the CLEQCMP directory on my Google docs.
Comments welcome.
Enjoy
(cheers)