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

Ken Tilton kennytilton at optonline.net
Sun Apr 13 15:21:10 UTC 2008


Peter Hildebrandt wrote:
> 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)))

Right, thanks, sorry for the head fake. Eventually something should be 
added to the regression test.

> 
> 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.  

Yeah, it is not clear what to do. The instance is no longer part of the 
model, so some rules will outright fail and those that do not would 
possibly be circular or at least form crazy dependencies of things no 
longer extant on those that are.

> 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!

Hmmm. I see 'not-to-be gets called pretty early, pretty much as soon as 
a slot value has changed and owned things are seen to be no longer in 
that slot, right during propagation. So where a dying instance reads 
slot X and slot X is still alive and would normally update when read 
(and still will later during this same propagation (I think <g>)) then 
the dying instance will see either an obsolete value or (I just 
realized) a new value if propagation got to X first by another path.

Nothing like a little non-determinism to start the day. :)

Well, The Lisp Way is to let people shoot themselves in the foot, we can 
probably just leave it as it is and see what happens.

If there was any documentation we could document not-to-be and point all 
this out and remind them that code in not-to-be should not be doing 
things in or with the model, it should be, eg, notifying C libraries 
that blocks they allocated can be scavenged.

Hmmm, those /could/ be the result of Cell rules, I guess it is good to 
return the old value.

kt



More information about the cells-devel mailing list