[PyCells] [cells-devel] Call for comment on Prospect of Lazy Cells Not Propagating Either
Michael Naunton
michael at naunton.us
Wed Sep 13 00:20:48 UTC 2006
On Mon, 2006-09-11 at 15:33 -0400, Ken Tilton wrote:
> kt wrote:
>
> If A is eager and depends on B and A has an observer that
> really really wants to stay on top of reality....
>
> I just had Cells4 kinda thought: what if all Cells are (in some new
> respect) lazy unless observed (directly or indirectly thru someone
> that is observed)?
I was using Cells4 today :)
So, all cells are lazy. Check.
Unless observed. Check.
Observed = I ask for a cells value explicitly (in which case it is
transiently observed,) or a GUI, etc, subscribes to it.
This makes the implementation really easy:
class Cell:
def invalidate( self ):
if self.state != INVALID:
if self.subscibed():
invalidationSet.add( self )
self.state = INVALID
for x in self.dependents:
x.invalidate()
def set( self, v ):
self.invalidate()
self.val = v
# dispatch invalidateSet stuff at some transactional boundary
>
> btw, as radical as that change sounds, I am not sure it really rises
> to the level of "Cells4" -- I am suggesting this only because I think
> it is equivalent to Cells3 (assuming one is sane enough not to have
> side-effects inside rules) and merely automates the identification of
> which cells can be lazy (or looked at another way, automates the
> detection of the need for eagerness.
Yep. No side-effects, and life is simple. Eagerness is just:
class Cell:
def value( self ):
inputs = [ x.value() for x in self.inputs ]
self.val = self.calc( *inputs )
self.state = VALID
return self.val
> Then the explicit thing becomes supporting a new class of much rarer
> (methinks) "lazy" observer whose existence would not trigger
> eagerness.
Ah, but once you've eliminated side-effects, lazy observers become easy
to write and really useful. Consider a tabbed panel GUI on an object
with same panel 1 = basic info, and panel 2 = expensive to compute
stuff. The panels subscribe to the cells they care about, but when the
observer callbacks are called, they do something like:
class GuiElem:
def myVal( self ):
return self.myCell.value()
def draw( self ):
self.widget.draw( self.myVal() )
def callback( self, aCell ):
if self.isVisible():
self.draw()
def onActivate( self ):
self.draw()
Lovely, no? Maximal laziness - the only cost is establishing the cell
dependencies.
> It would be interesting to see how much laziness ends up being deduced
> by this approach. The indirect eagerness (I am not observed, but I am
> called/used by someone who is) could get interesting.
>
> Jes thinkin out loud.
You just keep thinking, Butch. That's what you're good at.
-- mmn
More information about the cells-devel
mailing list