[cells-devel] Handling not-to-be'd kids and how to do an input slot for kids

Peter Hildebrandt peter.hildebrandt at gmail.com
Sun Apr 13 10:40:30 UTC 2008


Ken,

First of all, thanks for the quick fix.  However, it does not behave
quite as it should:  cell slots now return t during not-to-be.  I
think the reason is in md-slot-value.lisp:ensure-value-is-current,
more exactly:

 (when *not-to-be*
    (return-from ensure-value-is-current t))

While the function returns otherwise:

(bwhen (v (c-value c))
    (if (mdead v)
        (progn
          #+shhh (format t "~&on pulse ~a ensure-value still got and
still not returning ~a dead value ~a" *data-pulse-id* c v)
          nil)
      v)))

That is, (c-value c).

I changed it accordingly:

(when *not-to-be*
    (return-from ensure-value-is-current  (c-value c)))

Which works fine with my example code (that is, the cells-tree-view).
I checked it into cvs.

I am not quite sure about the implications, though.  I think what I am
doing here is return the value of a cell without recalculating it --
That is, I get the value calculated the last time the cell was
accessed alive.  That means -- if I am right -- the value I work on
might be quite old, and a more granular check of the *not-to-be*
special might be appropriate.

However, I did a quick test:

;; make two nodes to create a cell dependency
CTEST> (defparameter *val* (make-instance 'node :value (c-in 1)))
*VAL*
CTEST> (defparameter *root* (make-instance 'node :kids (c?n (list
(make-kid 'node :value (c? (value *val*)))))))
*ROOT*

;; check whether it works
CTEST> (value (first (kids *root*)))
1
CTEST> (setf (value *val*) 2)
2
CTEST> (value (first (kids *root*)))
2
;; yep

;; look at not-to-be,
CTEST> (defmethod not-to-be :before ((self node))
	  (trc "not-to-be :before" (value self)))
#<STANDARD-METHOD NOT-TO-BE :BEFORE (NODE) {CEFE609}>

;; make a change
CTEST> (setf (value *val*) 3)
3

;; and see ...
CTEST> (setf (kids *root*) nil)
0> not-to-be :before 3
0> not-to-be :before 3
NIL
;; wonderful!

So maybe that's it :-)

Cheers,
Peter




On Sun, Apr 13, 2008 at 12:57 AM, Ken Tilton <kennytilton at optonline.net> wrote:
> fixes...
>
>
>
> >
> > > To sum up, I believe the problem is that at a change of the kids list
> > > - First the kids are declared dead
> > > - Then not-to-be is called recursively
> > > and thus not-to-be is passed a dead self.
> > >
> >
> >
> > Yeah, I ran into this once in an observer.
> >
>
>  Sorry, meant to say "in a not-to-be".
>
>
>
> > Anyway, let me implement *dead-is-cool* and have that bound to t before
> calling not-to-be so there is no need to wrap not-to-be code at all and see
> what happens. I'll commit something soon, lemme know if it works. :)
> >
>
>  Done. The special is *not-to-be*.
>
>  Cells regression test passes but did not exercise any tests of mortality.
>
>  kt
>



More information about the cells-devel mailing list