On 1 Dec 2010, at 16:25, Daniel Weinreb wrote:
> I call the set of defgenerics (plus the factory functions) the
> "protocol". The word "type" is sort of right but carries a lot of
> connotations and freight that I'd rather avoid.
In the Haskell community, these beasts are called 'type classes'.
> How can we provide the same thing in Common Lisp? And without
> changing CLOS? In fact, without adding any new language feature at
> all?
Your suggestions to use packages for this kind of separation is good. There is
another alternative that is actually already in use as well: In the CLOS MOP
you have a distinction between user-level functions and extension functions. A
typical example is the slot instance protocol which is specified like this:
(defun slot-value (object slot)
(let ((slot-definition
(find slot (class-slots (class-of object))
:key #'slot-definition-name)))
(if slot-definition
(slot-value-using-class class object slot-definition)
(slot-missing class object slot))))
etc. for the other slot accessors. The important point for the sake of this
discussion is that there is a user-level function slot-value that is supposed
to be used as the front-end API, whereas slot-value-using-class exists for
extensions of the CLOS functionality. Slot-value is actually a plain function,
while slot-value-using-class is a generic function. I think this is a good way
to organize your code and makes a clear distinction between user APIs and
extension APIs. It may not work in all cases, but I think it's good to try this
in your own projects. There is no real cost involved if the user-level
functions can be inlined.
> I admit that there's a significant problem, namely the same problem
> that we always have with packages. Because resolution of packages
> happens at runtime, it is difficult-to-impossible, in some cases, to
> change the package declarations during interactive debugging and have
> the effect that the environment behaves as if you had changed the
> package declaration and recompiled from scratch. All I can say is
> that we really ought to do something about the problems with packages,
> even if you don't buy anything I'm saying here.
A really strong point of packages is that they resolve symbols at read-time,
while most module systems in the wild resolve identifiers at a later stage.
This is a strong point because this means that packages can (a) make finer
distinctions than module systems, and (b) can provide information hiding
mechanisms (public vs. private symbols) completely orthogonal to whatever
language constructs you may come up with. (a) is good because it's the main
reason why macros are actually safe with regard to hygiene in all relevant
practical cases, and (b) is good because you don't have to reinvent the wheel
with regard to information hiding over and over again.
Any suggestions to change/improve packages should ensure that these strong
points remain, IMHO.
Pascal
--
Pascal Costanza, mailto:[email protected], http://p-cos.net
Vrije Universiteit Brussel
Software Languages Lab
Pleinlaan 2, B-1050 Brussel, Belgium
_______________________________________________
pro mailing list
[email protected]
http://common-lisp.net/cgi-bin/mailman/listinfo/pro