[cells-devel] Re: Imperative vs. declarative
Kenny Tilton
ktilton at nyc.rr.com
Tue Mar 8 21:25:39 UTC 2005
Mike J. Bell wrote:
>Hey Kenny, I did a lot of thinking about what you said about
>declarative vs. imperative. I'm not sure what's the right
>terminology, but I did finally see the light.
>
>We've had problems in applications written in our framework when there
>are multiple producers of one datum. In a lot of cases (benign and
>simple), it's been OK. However, as soon as things get bigger, we put
>a repeating pattern into our designs where a single controller
>function will act as a gatekeeper,...
>
Yep. I even cite such things as "prior art" of Cells, or at least other
ways to address the issue (and serve as an existence proof that this is
a real problem for complex applications).
> reading from multiple channels of
>data, and forming the single producer for the difficult datum in the
>previously intractable design.
>
>I've thought about it quite a bit, and I've proved to myself that this
>is equivalent to your declarative model, even if there are some slight
>structural differences*. So, in order for me to get from where I am
>to where Cells is, all I need to do is instead of waiting for the
>multiple producers issue to get out of hand and uncontrollable...just
>nip it in the bud and don't allow it to begin with. Then every piece
>of data has only one producer.
>
>Thanks again for talking with me about it!
>
>Mike
>
>* Speaking of structure, question for you. Let's say you're declaring
>a slot to be a function of a couple other slots in Cells. How do you
>know they exist? I.e., where do you find your objects? Do you have
>like a database somewhere (hash of name->object or the like) that you
>lookup to find things? Are they all passed in at construction time?
>(I would imagine this wouldn't scale well at all). Is there some
>other scoping mechanism?
>
The Family class is an integral part of all my applications. i even have
special handling for the kids slot (the other slot forming the DAG is
fm-parent), though I wonder if the fixes in Cells II obviate the need
for that. Anyway....
A suite of routines will search the Family tree of objects in various
ways. One is by name (the md-name of a model object) and lately I have
found myself searching more often by type "gimme the nearest Selector
above me so I can find out if I am part of the current selection".
And I /have/ been tempted to do something with a hash table of md-names,
but one can get a lot of duplicates on that and one is usually searching
relative to oneself.
The nice thing about this is that it turns out that a given sought
object need not exist when a rule requiring one of its cells fires.
Cells would be Hell to program is that were the case. Instead, what
happens is that the traversing finder function keeps sampling the kids
slots of this Family instance and that. If the kids are a rule and we
are dealing with a brand new tree of widgets, a lot of these rules will
not yet have fired (to produce the actual kid instances). No problemo.
Rules fire on demand, so the instances pop into existence JIT. If your
declarative code specifies the kid being sought, it will get created JIT
before the original rule seeking it completes execution.
I was amazed when I saw that work, btw, many moons ago.
>
>I'm not sure if Cells has any builtin support for finding the other
>objects/slots that participate in Cells, or if you roll your own per
>application...but I'd love to hear about how you solve it when *you*
>write code.
>
Check out the def-c-output KIDS method. (It might be .KIDS.) and the
TO-BE function.
You are right: nothing says some other way of managing an object
namespace could not be used. (Well, I /do/ have to make sure that Cells
internals do not really need to be giving KIDS special handling... that
may even have been an optimization or something to make debugging
simpler "get the model population into existence first rather than have
JIT model creation kicked off during rule fires."
kt
More information about the cells-devel
mailing list