<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
  <meta content="text/html;charset=ISO-8859-1" http-equiv="Content-Type">
</head>
<body bgcolor="#ffffff" text="#000000">
You considered the idea that when you write a library (internal<br>
module, whatever) that defines a new type of Lisp object, it should<br>
not necessarily be apparent to the caller whether the implementation<br>
of objects of that type happen to use CLOS.<br>
<br>
    Hans: Of course, one may want to argue that DEFCLASS forms should
not<br>
    be considered to be an interface definition. Instead, one could call<br>
    for a series of DEFGENERIC forms to define the external interface of<br>
    some "module" and make class definitions be internal.<br>
<br>
In addition to this, you'd use a factory function, rather than having<br>
the client call make-instance, to hide the CLOS nature of the type.<br>
<br>
I agree with you about this, except that I would go farther and use<br>
packages.<br>
<br>
In fact, I wrote a library in this style, called fhash.  It creates an<br>
abstraction that implements a map, just like Common Lisp hash-tables,<br>
except that internally it uses linear search when the number of items<br>
is small, and upgrades to to a real hash table when the number of<br>
items gets large.<br>
<br>
This is very much like what Hans is talking about, with one slight<br>
difference.  In the fhash library, I took the position that Common<br>
Lisp's mechanism for encapsulation is NOT CLOS, not object-oriented<br>
programing, but packages.<br>
<br>
The packge declaration says:<br>
<br>
  (:export<br>
   #:fhash-table<br>
   #:make-fhash-table<br>
   #:getfhash<br>
   #:putfhash<br>
   #:remfhash<br>
   #:clrfhash<br>
   #:mapfhash<br>
   #:fhash-table-p<br>
   #:fhash-table-count<br>
   #:fhash-table-size<br>
   #:fhash-table-test<br>
   #:with-fhash-table-iterator)<br>
<br>
More about why using packages is right, in subsequent<br>
mail, since that could turn into a separate thread.<br>
<br>
-- Dan<br>
<br>
<br>
Hans Hübner wrote:
<blockquote
 cite="mid:AANLkTim6uAmbGNiz_C1BnfOs6D+bBPfeENQV24NBFonb@mail.gmail.com"
 type="cite">
  <p>Hi,</p>
  <p>The company I work for has a Common Lisp style guide that
generally disallows using SLOT-VALUE.  Instead, accessor should be used
so that: BEFORE and :AFTER methods are always invoked when accessing a
slot.  Generally, I think this is a good idea when looking at classes
and instances from the outside.  Slots should be considered as being an
implementation detail, and users (i.e. client code and derived class
methods) should not make assumptions about how functionality is
implemented.</p>
  <p>Now, I often have the need for class instances that are constant
in some respect, i.e. some properties of the instance that are
implemented using slots can't directly be changed.  I often declare
such slots havin only a: READER in the class definition, which makes
the read-only nature of this slot apparent right away.</p>
  <p>Of course, such slots need to be initialized somehow. An :INITARG
sometimes does the trick, but it is more common that the value of such
slots is calculated and recalculated during the lifetime of the
instance, and as such the slot's value must be set.</p>
  <p>Now, from the perspective of seeing the class declaration as
documenting the visible behavior of instances of a class, it does not
seem to be proper to declare an accessor to be used in class-internal
code so that the slot's value can be updated.  Instead, I think that it
is better to use SLOT-VALUE to mess with the guts of an instance from
code that is part of the guts itself.</p>
  <p>Of course, one may want to argue that DEFCLASS forms should not be
considered to be an interface definition. Instead, one could call for a
series of DEFGENERIC forms to define the external interface of some
"module" and make class definitions be internal. From a more practical
perspective, though, class definitions in CL serve both as interface
and implementation definition, thus it seems to be appropriate using
the mechanisms provided by CLOS to support both uses.</p>
  <p>How do others use or avoid SLOT-VALUE? Is it frowned upon in your
company's or project's (verbal) style guide?</p>
  <p>Thanks for your input,<br>
Hans<br>
  </p>
  <pre wrap="">
<hr size="4" width="90%">
_______________________________________________
pro mailing list
<a class="moz-txt-link-abbreviated" href="mailto:pro@common-lisp.net">pro@common-lisp.net</a>
<a class="moz-txt-link-freetext" href="http://common-lisp.net/cgi-bin/mailman/listinfo/pro">http://common-lisp.net/cgi-bin/mailman/listinfo/pro</a>
  </pre>
</blockquote>
</body>
</html>