Peter Hildebrandt wrote:
As promised yesterday I added a cells-store facility to cells. The code can be found at the bottom of md-utilities in CVS.
Cool. I am curious what application requirement led to this. Not that it is not a good idea. Being able to reach inside other structures for dependency is a natural fleshing-out of Cells -- why stop at the slot, or force everything to /be/ a slot to depend on it? Meta-cool is that you are the first Cells user to do something like this, IIRC, altho there are several who took the more typical Lisper approach of dashing off to do their own versions of the entire package. :)
Basically, this is a cells-aware hash table with some syntactic sugar.
Here's part of the test function included in md-utilities:
(defun test-cells-store () (trc "testing cells-store -- making objects") (let* ((store (make-instance 'cells-store)) (foo (make-instance 'test-store-item :value (c?-with-stored (v :foo store 'nothing) (bwhen (val (value v)) val)))) (foo+1 (make-instance 'test-store-item :value (c?-with-stored (v :foo store 'nothing) (bwhen (val (value v)) (1+ val)))))) (store-add :foo store (make-instance 'family :value (c-in nil)))
(setf (value (store-lookup :foo store)) 1)
(store-remove :foo store))
So you create a ruled cell with c?-with-stored. This can happen before or after key is added to the cells-store. When the rule is the executed, when an object is added or removed from key in the hash table *or* when any of the cells on the object change. The rule is not executed, if other stuff in the hash table changes.
The (c?-with-stored (var key store &optional default) &body body)
I have not looked at the code so maybe what I am about to suggest is already possible, but would this also be useful (just to confuse things I changed with-stored to bwhen-c-gethash: (c? (if (^whatever) 42 (bwhen-c-gethash (user login-id *user-logins*) .....))) The above might be easily done (just a tweak or two) by looking at how synapses work. They are like local and/or anonymous Cells. "Anonymous" because they do not mediate a slot, they mediate an arbitrary sub-form of a rule. "Local" because only the Cell envalued by the containing form depends on the synaptic Cell. Historical note: synapses used to be a completely different data structure with distinct code supporting them, now we just have a "synaptic" attribute to guide the general Cells logic in a few places. Anyway, then c?-with-stored is just the special case where this appears as the entire form: (c? (bwhen-c-gethash (...) ...)) Hmmm, you know, I almost never use synapses and yet I have always suspected that a lot of fun would be had with them in re expanding the semantics one could express with Cells. But this exchange has me wondering if I missed something: will new kinds of Cells tend to be synapses because the semantics will be useful within rules? Or maybe I am just confused: should all cells be synapses now? I might be in the land of distinctions without differences now. :) Well, I am off to Amsterdam shortly and will play with this when I get back. Not sure how much time I will be on-line, btw, until Monday. Thanks for a cool contrib. kt
macro works like bwhen -- that is, if key is present, body is executed with var bound to the object identified by key -- and if not, default is returned. That means, body can assume that var is bound to a valid object (like in the example, it is safe to call value on it, if you know that you only store family instances in the store)
Calling store-remove will reset all dependent cells to their default.
The change is propagated as soon as store-add, setf, or store-remove are called -- meaning that observers will do the expected thing.
Maybe someone will find it useful.
Peter _______________________________________________ cells-devel site list cells-devel@common-lisp.net http://common-lisp.net/mailman/listinfo/cells-devel