Only the writers were missing. Here is a patch:
diff -r 36e39413a7ba src/store/elephant/proxy.lisp
--- a/src/store/elephant/proxy.lisp Sat Dec 27 23:39:10 2008 -0800
+++ b/src/store/elephant/proxy.lisp Sat Dec 27 23:39:19 2008 -0800
@@ -28,6 +28,9 @@
,@(mapcan #'(lambda (arg)
`(:reader ,arg))
(weblocks::slot-definition-readers def))
+ ,@(mapcan #'(lambda (arg)
+ `(:writer ,arg))
+ (weblocks::slot-definition-writers def))
,@(mapcan #'(lambda (arg)
`(:initarg ,arg))
(weblocks::slot-definition-initargs def))
Yarek
On Dec 27, 11:42 pm, Yarek Kowalik <[email protected]> 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
-~----------~----~----~----~------~----~------~--~---