Will do.  I will also include a MAKE-PROXY-INSTANCE function that acts
just like MAKE-INSTANCE but creates a proxy instead.   This allows the
users to create  proxy objects that do not get persisted until PERSIST-
OBJECT is called.

I'm relying on these features as this simplifies my approach where I
had base/ephemeral/persistent class structures and hand-crafted
persist-object code.

Yarek

On Dec 28, 9:15 am, Ian Eslick <[email protected]> wrote:
> I believe the current weblocks framework simply uses slot-value so I  
> didn't bother extracting and reproducing the accessors.  This was not  
> intended to be a general solution, but to support the minimal required  
> by weblocks.  This should be easy to add if you'd like to submit a  
> patch.
>
> Ian
>
> On Dec 28, 2008, at 2:42 AM, Yarek Kowalik wrote:
>
>
>
> > That solved that problem, but it now appears that accessors are not
> > generated for the slots.
>
> >          (progn
> >                (defpclass foo () ((ff :accessor foo-ff)))
> >                (defpclass bar () ((bb :accessor bar-bb)))
> >                (let (f b list)
> >                     (setf f (make-instance (weblocks-elephant::return-
> > proxy-classname 'foo)))
> >                     (weblocks::push-end (weblocks-elephant::base-
> > class f) list)
> >                     (foo-ff f) ; failure #1 -- reader not existent
> >                     (setf (foo-ff f) 'ff-val) ; failure #1 -- writer
> > not existent
> >                     (setf b (make-instance (weblocks-elephant::return-
> > proxy-classname 'bar)))
> >                     (weblocks::push-end (weblocks-elephant::base-
> > class b) list)
> >                     (weblocks::push-end (weblocks-elephant::base-
> > class f) list)
> >                     list))
>
> > This code fails as indicated in code comments.  I presume the previous
> > methods did somehow establish the accessors, but failed with
> > initializing the base, this one initializes the base fine, but the
> > proxy definition is incomplete.
>
> > Yarek
>
> > On Dec 27, 3:18 pm, Ian Eslick <[email protected]> wrote:
> >> Thanks for the clear test case.  This was a misunderstanding on my
> >> part of inheritance of class allocated slots.  I just pushed a quick
> >> patch to weblocks-ian which fixes this.  Here's the raw diff.
>
> >> Ian
>
> >> diff -r ca886fa7919c src/store/elephant/proxy.lisp
> >> --- a/src/store/elephant/proxy.lisp     Sat Dec 06 22:40:30 2008  
> >> +0000
> >> +++ b/src/store/elephant/proxy.lisp     Sat Dec 27 18:15:42 2008  
> >> -0500
> >> @@ -4,22 +4,22 @@
> >>   (defvar *view-proxies* (make-hash-table))
>
> >>   (defclass persistent-proxy ()
> >> -  ((base-class :accessor base-
> >> class :initarg :base :allocation :class)
> >> -   (proxy-oid :accessor proxy-oid :initarg :oid :initform nil)))
> >> +  ((proxy-oid :accessor proxy-oid :initarg :oid :initform nil)))
>
> >>   (defun return-proxy-classname (classname)
> >>     (if (gethash classname *proxies*)
> >>         (gethash classname *proxies*)
> >> -    (let* ((persistent-class (find-class classname))
> >> -          (new-name (intern (format nil "~A-~A" classname (gensym))
> >> *package*))
> >> -          (visible-slot-defs (class-visible-slots-impl persistent-
> >> class))
> >> -          (class-def `(defclass ,new-name (persistent-proxy)
> >> -                        (,@(mapcar #'def-to-proxy-slot
> >> -                                   visible-slot-defs))
> >> -                        (:default-initargs :base ',classname))))
> >> -      (eval class-def)
> >> -      (setf (gethash classname *proxies* new-name)
> >> -           new-name))))
> >> +      (let* ((persistent-class (find-class classname))
> >> +            (new-name (intern (format nil "~A-~A" classname  
> >> (gensym))
> >> *package*))
> >> +            (visible-slot-defs (class-visible-slots-impl  
> >> persistent-class))
> >> +            (class-def `(defclass ,new-name (persistent-proxy)
> >> +                          ((base-class :accessor base-
> >> class :allocation :class
> >> +                                       :initform ',classname)
> >> +                           ,@(mapcar #'def-to-proxy-slot
> >> +                                     visible-slot-defs)))))
> >> +       (eval class-def)
> >> +       (setf (gethash classname *proxies* new-name)
> >> +             new-name))))
>
> >>   (defun def-to-proxy-slot (def)
> >>     `(,(weblocks::slot-definition-name def)
>
> >> On Dec 27, 2008, at 5:02 PM, Yarek Kowalik wrote:
>
> >>> Every time I create a new instance of a new proxy object for a
> >>> persistent class, it redefines the base-class in the previously
> >>> created instances, even when these instances are not of the same
> >>> class.  For example:
>
> >>> PROJECT_FOO> (progn
> >>>                   (defpclass foo () ())
> >>>                   (defpclass bar () ())
> >>>                   (let (f b list)
> >>>                     (setf f (make-instance (weblocks-
> >>> elephant::return-
> >>> proxy-classname 'foo)))
> >>>                     (weblocks::push-end (weblocks-elephant::base-
> >>> class f) list)
> >>>                     (setf b (make-instance (weblocks-
> >>> elephant::return-
> >>> proxy-classname 'bar)))
> >>>                     (weblocks::push-end (weblocks-elephant::base-
> >>> class b) list)
> >>>                     (weblocks::push-end (weblocks-elephant::base-
> >>> class f) list)
> >>>                     list))
> >>> (FOO BAR BAR)
>
> >>> This is unexpected: the output should be (FOO BAR FOO), and it  
> >>> causes
> >>> serious problems.   Is there something amiss in the way proxy  
> >>> classes
> >>> are defined?
>
> >>> Note: This is on SBCL 1.0.20.
>
> >>> Yarek
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups 
"weblocks" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to 
[email protected]
For more options, visit this group at 
http://groups.google.com/group/weblocks?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to