[cdr-discuss] Names for the equality generic function

Pascal Costanza pc at p-cos.net
Thu Feb 17 10:40:59 UTC 2011


On 17 Feb 2011, at 10:14, Christophe Rhodes wrote:

> Terje Norderhaug <terje at in-progress.com> writes:
> 
>> I have an alternative to coming up with different names for the
>> generic equivalent to Common Lisp functions:
>> 
>>   Give the generic functions the same name as the equivalent Common
>>   Lisp functions and intern them in a new package that doesn't use
>>   the CL package.
> 
> Well, here's yet another alternative: trampoline the Common Lisp
> functions to generic functions of the same name in a new package that
> doesn't use Common Lisp.  (This is what I have done with the sequence
> functions, to reasonable success).
> 
> Not that I think that a normal generic function for EQUAL/EQUALP (or
> whatever you want to call it) is in any way a good idea; it is a perfect
> example of a context-sensitive function, and modelling that with
> standard generic functions does not automate the inclusion of context.

Once it's a generic function, turning it into a context-sensitive function is not so hard anymore:

(defmethod equalp ((o1 my-class) (o2 my-class))
  (case *my-context*
    (do ...)
    (di ...)
    (da ...)
    (otherwise ... default ...)))

...or with ContextL:

(define-layered-function my-equalp (o1 o2)
  (:method :in do (...) ...)
  (:method :in di (...) ...)
  (:method :in da (...) ...)
  (:method (...) ... default ...))

(defmethod equalp ((o1 my-class) (o2 my-class))
  (my-equalp o1 o2))

The generic function equalp ensures that your own comparison methods are more easily available to other third-party code, and that's the main purpose of making it generic.

(If an existing function gets genericized, my vote would be for equalp, because I think equal still has good uses as a primitive comparison function, whereas I'm not so convinced of the utility of equalp.)


Pascal

-- 
Pascal Costanza, mailto:pc at p-cos.net, http://p-cos.net
Vrije Universiteit Brussel
Software Languages Lab
Pleinlaan 2, B-1050 Brussel, Belgium










More information about the cdr-discuss mailing list