[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: :accessor-prefix bug
- To: Gregor.pa@Xerox.COM
- Subject: Re: :accessor-prefix bug
- From: Warren Harris <harris%hplwhh@hplabs.HP.COM>
- Date: Wed, 30 Sep 87 11:00:12 PDT
- Cc: CommonLoops.PA@Xerox.COM
- In-reply-to: Your message of 29 Sep 87 22:00:00 -0700. <870929-220237-1512@Xerox>
- Redistributed: CommonLoops.PA
> * intern the symbols in the package of the prefix symbol
> - often, this is likely to solve the problem presented in the second
> bullet, but it won't work in general and is kind of a crock.
Is there any logical justification for why this solution won't work?
:Accessor-prefix could be considered to be supplying not only part of the
name, but also the default package. I certainly find this:
(defclass my::foo ()
((lisp::list)
(my::element)
...)
(:accessor-prefix my::foo-))
preferable to:
(defclass my::foo ()
((lisp::list :accessor my::foo-list)
(my::element :accessor my::foo-element)
...))
There are also some of us who still refuse to use prefixes on slot
accessors because they obscure the genericness we are trying to achieve
through subclassing. I don't want to have to remember that certain slots
of a class are accessed with that class name as a prefix, and other slots
are accessed with some parent classes name for a prefix. In this case I
find :accessor-prefix NIL to be an invaluable shorthand to enumerating
every slot name twice, once for the slot itself and once for the accessor
function.
If by taking away :accessor-prefix you're trying to keep us from being lazy
(and inadvertantly defining accessors for slots that shouldn't have them by
indiscriminant use of :accessor-prefix) perhaps this reason should be
officially stated.
Regarding with-slots: I've recently heard that in the future you're going
to have to enumerate the slots you want to use in a with-slots form. I
find the thought of doing this repulsive. Most of my methods tend to take
the form:
(defmethod m ((f foo) ...)
(with-slots ((f :use-accessors nil))
...))
and thus behave like classical methods anyway. This isn't because I don't
know how to use multimethods (I use them when appropriate), but because
classical methods in general are what you want 80% of the time. The use of
"with-slots ... :use-accessors nil" (or slot-value for that matter) in CLOS
is not just an ugly "back door" that violates encapsulation or is used for
optimization, but is a necessity when specializing slot accessor methods.
I haven't heard a good argument for denying methods on a class privileged
access to that class's slots (of course multimethods complicates this, but
that what :prefix is for), so I don't think taking away with-slots (by
making it so painful to use) is the thing to do. Perhaps examples of
problematic usage of with-slots and its :prefix option could shed some
light.