[pro] Initialization of shared slots
Samium Gromoff
_deepfire at feelingofgreen.ru
Sat Jan 8 15:07:48 UTC 2011
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))
;;;;; product slice (protocol classes)
;;; exhaustive partition of type product of VCS-TYPE, TRANSPORT-MIXIN, CLONE-SEPARATION-MIXIN, and
;;; FETCH-INDIRECTION-MIXIN
(defclass git-native (git native direct-fetch clone-is-fetch) () (:default-initargs :schema 'git))
(defclass git-http (git http direct-fetch clone-is-fetch) ())
;;; ...... 8< ......
(defclass git-combined (git-native git-http combined) ())
;;; ...... >8 ......
(defclass hg-http (hg http indirect-fetch separate-clone) ())
(defclass darcs-http (darcs http indirect-fetch separate-clone) ())
(defclass cvs-rsync (cvs rsync indirect-fetch clone-is-fetch) ())
(defclass cvs-native (cvs native direct-fetch clone-is-fetch) () (:default-initargs :schema '|:PSERVER|))
(defclass tarball-http (tarball http direct-fetch clone-is-fetch) ((initial-version :accessor initial-tarball-version :initarg :initial-version)))
(defclass svn-rsync (svn rsync indirect-fetch clone-is-fetch) ())
;;; ...... 8< ......
(defclass svn-direct (svn direct-fetch) ())
;;; ...... >8 ......
(defclass svn-http (svn-direct http #| direct |# clone-is-fetch) ())
(defclass svn-native (svn-direct native #| direct |# clone-is-fetch) () (:default-initargs :schema 'svn))
;;;;; intermediate slice (protocol classes)
;;; Location * VCS
(defclass git-remote (remote git) ())
(defclass darcs-remote (remote darcs) ())
(defclass hg-remote (remote hg) ())
(defclass cvs-remote (remote cvs) ())
(defclass svn-remote (remote svn) ())
(defclass tarball-remote (remote tarball) ())
;;;;; instantiable classes
;;; almost most specific (due to GATE mixin), exhaustive partition of REMOTE
(defclass git-native-remote (git-remote git-native) ())
(defclass git-http-remote (git-remote git-http) ())
(defclass git-combined-remote (git-remote git-combined) ())
(defclass hg-http-remote (hg-remote hg-http) ())
(defclass darcs-http-remote (darcs-remote darcs-http) ())
(defclass cvs-rsync-remote (cvs-remote cvs-rsync) ())
(defclass cvs-native-remote (cvs-remote cvs-native) ())
(defclass svn-rsync-remote (svn-remote svn-rsync) ())
(defclass svn-http-remote (svn-remote svn-http) ())
(defclass svn-native-remote (svn-remote svn-native) ())
(defclass tarball-http-remote (tarball-remote tarball-http) ())
(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.
--
regards,
Samium Gromoff
--
"Actually I made up the term 'object-oriented', and I can tell you I
did not have C++ in mind." - Alan Kay (OOPSLA 1997 Keynote)
More information about the pro
mailing list