<br><br><div><span class="gmail_quote">On 6/13/06, <b class="gmail_sendername">Phillip J. Eby</b> <<a href="mailto:pje@telecommunity.com">pje@telecommunity.com</a>> wrote:</span><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">
At 12:22 PM 6/13/2006 -0400, Ken Tilton wrote:<br>>In the chat-log rule, look for anything: someone saying something, someone<br>>leaving, someone arriving, and check them all each time. Before I finsihed<br>>came the Shocker: omigod. What if two new participants get added at once?
<br>>Or what if some state change propagates and causes two chat participants<br>>to exclaim "Omigod!"? Omigod. I cannot code (some 'speech (participants<br>>chat)). Omigod. Just as I have to check population changes /as well as/
<br>>speech acts, i have to check all speech acts!!!! You have no idea what I<br>>am yelling about, do you?<br><br>I think I do.  The problem is that you don't have "foreach" rules or<br>second-order events. 
</blockquote><div><br>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.
<br><br>Make sense? Or did I misunderstand you?<br><br>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. :)
<br><br>kenny<br><br><br></div><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;"> In traditional rule-driven systems, you can<br>effectively say "for each X and Y that meet criterion Z, do A(X,Y)".  If I
<br>understand correctly, the only way to do this in Cells would be to put a<br>collection in a cell and then have a rule that created a collection of<br>corresponding objects from it, or at least transformed any changes in the
<br>collection into ephemeral add/remove events.<br><br>In other words, Cells itself only deals with first-order (zeroth order?)<br>changes to values and objects.  It does not deal with *sets* of values or<br>objects.  It seems to me that this is the underlying nature of the problem
<br>you encountered.<br><br>Probably the simplest way to solve it in the general case is with a stock<br>object that transforms a collection into plural add/remove events.  Even<br>better, two of them: one that monitors a cell with a collection, and the
<br>other an object that looks like a collection but exposes event<br>cells.  These would be roughly equivalent to rule cells and input cells,<br>respectively, but for collections of values instead of individual ones.<br>
<br></blockquote></div><br>