On 6/13/06, Phillip J. Eby <pje@telecommunity.com> wrote:
At 12:22 PM 6/13/2006 -0400, Ken Tilton wrote:
>In the chat-log rule, look for anything: someone saying something, someone
>leaving, someone arriving, and check them all each time. Before I finsihed
>came the Shocker: omigod. What if two new participants get added at once?
>Or what if some state change propagates and causes two chat participants
>to exclaim "Omigod!"? Omigod. I cannot code (some 'speech (participants
>chat)). Omigod. Just as I have to check population changes /as well as/
>speech acts, i have to check all speech acts!!!! You have no idea what I
>am yelling about, do you?
I think I do. The problem is that you don't have "foreach" rules or
second-order events.
Actually, I don't have /any/ Cells rules or syntax other than to create the Cells, classes, and observers. Inside a rule, one Just Writes Lisp. Someone once asked whether I had any such things as a special construct for iterating over a list, and I offered "some", which is a standard Lisp keyword. I pointed out that one of the big wins of Cells is precisely that one does not have to use special constructs to make the paradigm work -- that would weaken the system because then calling some 3rd-party library function that happens to visit other Cells would not establish dependencies. Never mind the hassle of forcing all /my/ library code to use Cells-ese to iterate over lists or just access variables.
Make sense? Or did I misunderstand you?
My mistake was simply trying to be too clever. I thought I knew how Cells worked. :) So I thought I could use SOME, which stops at the first non-nil value. That was dumb. yes, ephemerals get reset right away so only one can be /set/ at a time (since each set becomes a new moment in data-time), but Cells has evolved lately and ephemerals can start as non-nil or be ruled (hmm, I might have to test that last one <g>), so it is now possible for more than one ephemeral to hold a value during one "moment" as you say. Bots in a game might have a rule determining their speeches, and all decide to yell "Run away!" at the moment a rabbit appears. :)
kenny
In traditional rule-driven systems, you can
effectively say "for each X and Y that meet criterion Z, do A(X,Y)". If I
understand correctly, the only way to do this in Cells would be to put a
collection in a cell and then have a rule that created a collection of
corresponding objects from it, or at least transformed any changes in the
collection into ephemeral add/remove events.
In other words, Cells itself only deals with first-order (zeroth order?)
changes to values and objects. It does not deal with *sets* of values or
objects. It seems to me that this is the underlying nature of the problem
you encountered.
Probably the simplest way to solve it in the general case is with a stock
object that transforms a collection into plural add/remove events. Even
better, two of them: one that monitors a cell with a collection, and the
other an object that looks like a collection but exposes event
cells. These would be roughly equivalent to rule cells and input cells,
respectively, but for collections of values instead of individual ones.