[elephant-devel] Elephant and inheritance
Pierre THIERRY
nowhere.man at levallois.eu.org
Tue Nov 7 16:44:32 UTC 2006
Scribit Ian Eslick dies 11/10/2006 hora 11:29:
> If you have a non-persistent base class, should the semantics of the
> slot storage change based on whether it's included in a persistent
> subclass?
When you inherit from a class, you expect the sub-class to have all the
properties that the super-class has, plus it's specific ones. I think
the current design of Elephant breaks that expectation.
I really think that the most sensible way of dealing with this is to
make all effective slots persistent, and provide options to alter that
behaviour. This :persist option could accept either a keyword for a
predefined persistence scheme or a list of slots.
Let's take a base class:
(defclass foo ()
((bar)))
We could have the following sub-classes:
(defclass sub-foo-1 (foo)
((baz)
(fubar))
(:metaclass persistent-metaclass))
; persistent-slots: (bar baz fubar)
; this could be (:persist :effective-slots)
(defclass sub-foo-2 (foo)
((baz)
(fubar))
(:metaclass persistent-metaclass)
(:persist :direct-slots))
; persistent-slots: (baz fubar)
(defclass sub-foo-3 (foo)
((baz)
(fubar))
(:metaclass persistent-metaclass)
(:persist :inherited-slots))
; persistent-slots: (bar)
(defclass sub-foo-4 (foo)
((baz)
(fubar))
(:metaclass persistent-metaclass)
(:persist (bar baz)))
; persistent-slots: (bar baz)
There could also be a :transient option to achieve the opposite...
As I never really used the MOP, I'm not sure how it is harder to achieve
than the current behaviour, but I think the flexibility and
expressiveness of this is worth the effort.
> Now what happens if we inherit from sub-foo above?
>
> (defclass sub-sub-foo (sub-foo)
> ((qux))
> (:metaclass ele:persistent-metaclass)) ;; protocol will assert an
> error if subclass of persistent isn't persistent
>
> In this case the normal CLOS machinery will pick up the non-direct slots
> from subclasses and the bar and myfoo
> slots will be non-transient. There may be a way to override this to
> search for subclass specifications of :persist-subclass-slots and then
> go ahead and promote :transient effective slots to :persistent but all
> the cases and interactions can start to become hairy.
>
> I think the currently policy is the simplest and least bug prone, even
> though it forces the increased verboseness of the first example.
>
> Thoughts?
I definitely agree on the hairiness of a more expressive alternative...
I'd like to come up with a proposal for a sensible and consistent of
dealing with these corner cases elegantly. I'll try to come up with a
patch also, if I manage to grasp how MOP works.
Hopefully,
Nowhere man
--
nowhere.man at levallois.eu.org
OpenPGP 0xD9D50D8A
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 189 bytes
Desc: Digital signature
URL: <https://mailman.common-lisp.net/pipermail/elephant-devel/attachments/20061107/646e657a/attachment.sig>
More information about the elephant-devel
mailing list