[pro] Initialization of shared slots

Martin Simmons martin at lispworks.com
Mon Jan 10 18:33:17 UTC 2011


>>>>> On Sat, 08 Jan 2011 18:07:48 +0300, Samium Gromoff said:
> 
> On Sat, 8 Jan 2011 15:48:33 +0100, Pascal Costanza <pc at p-cos.net> wrote:
> > 
> > On 8 Jan 2011, at 14:15, Samium Gromoff wrote:
> > 
> > > On Fri, 7 Jan 2011 23:42:23 +0100, Pascal Costanza <pc at p-cos.net> wrote:
> > >> There is no real advantage in having shared slots over global special
> > >> variables. On top of that, the slot access protocols in the CLOS MOP
> > >> also don't work that well in conjunction with shared slots. So it's
> > >> better to avoid them. Fortunately, this is the only feature in CLOS that
> > >> doesn't make any sense, as far as I can tell.
> > > 
> > > This is sad, indeed, as shared slots could have been used to associate
> > > information with sub-lattice of the class relationship lattice.  I have
> > > been tempted to do exactly this, multiple times, having, instead, to
> > > resort to manual storage of this information.
> > 
> > What exactly would you like to do? There are ways to do such things using the CLOS MOP...
> 
> Ok, real world code, beware.  While reading, only pay attention how
> VCS-TYPE-MIXIN threads through the "slices".
> 
> (defclass vcs-type-mixin ()
>  (# the following slot is absent in real code, I have to emulate it
>   (enabled-p :accessor vcs-type-enabled-p :allocation :class)
>   (vcs-type :reader vcs-type :initarg :vcs-type)))
> 
> ;;;;; VCS slice (protocol classes)
> ;;; exhaustive partition of VCS-TYPE-MIXIN
> (defclass git (vcs-type-mixin)                            () (:default-initargs :vcs-type 'git))
> (defclass nongit-mixin ()                                 ())
> (defclass hg (vcs-type-mixin nongit-mixin)                () (:default-initargs :vcs-type 'hg))
> (defclass darcs (vcs-type-mixin nongit-mixin)             () (:default-initargs :vcs-type 'darcs))
> (defclass cvs (vcs-type-mixin wrinkle-mixin nongit-mixin) () (:default-initargs :vcs-type 'cvs))
> (defclass svn (vcs-type-mixin wrinkle-mixin nongit-mixin) () (:default-initargs :vcs-type 'svn))
> (defclass tarball (vcs-type-mixin nongit-mixin)           () (:default-initargs :vcs-type 'tarball))
> ...
> (defun vcs-enabled-p (type)
>   "Problem function."
>   (class-slot type 'enabled-p))
> 
> ...I want to be able to use VCS-ENABLED-P on any slice before
> instantiable classes are instantiated.

Another reason why this won't work is that you only have one slot -- the same
value is shared between every subclass of vcs-type-mixin.  Adding a separate
slot to each subclass is a pain.

-- 
Martin Simmons
LispWorks Ltd
http://www.lispworks.com/




More information about the pro mailing list