[Gardeners] Potting Soil: Count the Colons
Peter Schuller
peter.schuller at infidyne.com
Sun Apr 30 13:10:00 CDT 2006
> Another point about packages, though not specifically about colons: if
> you find yourself naming a lot of functions or variables foo-this and
> bar-that (e.g. mail-read, mail-send, mail-retrieve), this should
> signal to you that these functions belong in their own package:
> mail:read, mail:send, mail:retrieve.
What are people's opinion about the above in the contest of CLOS accessor
methods (or other methods)? (Assuming you don't want to use a package for
each class...)
I find the one thing that annoys the hell out of me with CLOS is that I cannot
decide on how I prefer to name methods. In message passing systems this
problem is eliminated due to the implicit namespace created by each class,
but this is of course not the case in CLOS. I have seen various versions but
none of them seem clearly superior:
(1) Just use the verb/noun; i.e., "do-stuff".
Least verbose, reads nicely and feels natural. The problem is that you very
very quickly start running into name clashes; and renaming slots just to fix
this feels dirty to me (I have even managed to run into a clash between two
versions of SBCL in a <100 line test program the first time I was fiddling
with CLOS... turned me off this pretty quick).
(2) Use class-do-stuff (e.g., socket-read etc).
Mostly eliminates nameclashes, but requires a lot of typing and steals
horizontal space in code. On the other hand it does provide a
self-documenting factor to the code (i.e., it specifies which class is
providing the interface, even if the actual dispatched method may be
specializing on something mroe specific).
What are people's opinion? I must say that for accessors I would probably
prefer explicit slot access, if it weren't for the fact that it bypasses
accessor methods.
What are people's opinions?
I think I would prefer being able to use proper names accessors (no prefixes
or similar), have the accessor methods' name be irrelevant and then use
(slot-value) or similar for access by name (is there something like this that
I am missing?). In other words, I would like something like:
(defclass person ()
((age .....) ; default accessor generated
(...)
(calculated-attribute ....)))
(defreader (person calculated-attribute) (person)
(some-function (primitive-slot-value person 'calculated-attribute)))
(defwriter (person calculated-attribute) (person value)
(setf (primitive-slot-value person 'calculated-attribute) (....))
(let ((p (make-instance 'person :age 47)))
.... (slot-value p 'calculated-attribute))
On the one hand it is a bit "ugly" to special-case accessors instead of just
letting them be regular functions, but on the other hand accessors are
particularly prone to name clashes and all these naming difficulties.
--
/ Peter Schuller, InfiDyne Technologies HB
PGP userID: 0xE9758B7D or 'Peter Schuller <peter.schuller at infidyne.com>'
Key retrieval: Send an E-Mail to getpgpkey at scode.org
E-Mail: peter.schuller at infidyne.com Web: http://www.scode.org
More information about the Gardeners
mailing list