[cells-cvs] CVS cells/tutorial
ktilton
ktilton at common-lisp.net
Mon Jun 5 00:01:22 UTC 2006
Update of /project/cells/cvsroot/cells/tutorial
In directory clnet:/tmp/cvs-serv2216/tutorial
Modified Files:
01c-cascade.lisp
Log Message:
evolving geometry; refinement of test case 01c-cascade
--- /project/cells/cvsroot/cells/tutorial/01c-cascade.lisp 2006/05/30 02:47:45 1.1
+++ /project/cells/cvsroot/cells/tutorial/01c-cascade.lisp 2006/06/05 00:01:22 1.2
@@ -1,31 +1,94 @@
-#| Now we have automatic state management (including change propagation)
+#|
+
+Now we have automatic state management (including change propagation)
outside the Cells model as well as in. Now lets look at cascading change
by adding another level of computation, so A->B->C.
-[Actually, I see I need to make this a little deeper, since area has
-a direct dependency on width. Not tonight. :)]
+In this case: len->area->brightness
+Also: len->width->area->brightness
+
+That leads to some complications I will discuss, but no assertions here
+enforce correct behavior in re those complications. Soon. :)
|#
(defpackage #:tu-depth (:use :cl :cells))
(in-package #:tu-depth)
+(defmacro start-finish (key rule)
+ `(progn
+ (print (list :start ,key))
+ (prog1
+ (progn ,rule)
+ (print (list :finish ,key)))))
(defmodel rectangle ()
- ((area :initarg :area :accessor area
- :initform (c? (print :compue-area)
- (* (len self)(width self))))
+ ((lumens :initform 1000000 :reader lumens)
(len :initarg :len :accessor len
- :initform (c? (print :compute-len)
- (* 2 (width self))))
+ :initform (c? (start-finish :len
+ (* 2 (width self)))))
+ (area :initarg :area :accessor area
+ :initform (c? (start-finish :area
+ (* (len self)(width self)))))
(width :initarg :width :accessor width
- :initform (c? (print :compute-width)
- (floor (len self) 2)))))
+ :initform (c? (start-finish :width
+ (floor (len self) 2))))
+ (brightness :reader brightness
+ :initform (c? (start-finish :brightness
+ (/ (^lumens) (^area)))))
+ ))
#+test
-(let ((r (make-instance 'rectangle :len (c-in 42))))
- (cells::ct-assert (eql 21 (width r)))
- (cells::ct-assert (eql (* 21 42) (area r)))
+(let ((r (make-instance 'rectangle :len (c-in 100))))
+ (cells::ct-assert (eql 50 (width r)))
+ (cells::ct-assert (eql 5000 (area r)))
+ (cells::ct-assert (eql 200 (brightness r)))
(cells::ct-assert (= 1000 (setf (len r) 1000)))
- (cells::ct-assert (eql 500000 (area r))))
+ (cells::ct-assert (eql 500000 (area r)))
+ (cells::ct-assert (eql 2 (brightness r))))
+
+#| --- discussion ----------------------------
+
+The output in Cells is:
+
+(:START :AREA)
+(:START :WIDTH)
+(:finish :WIDTH)
+(:finish :AREA)
+(:START :BRIGHTNESS)
+(:finish :BRIGHTNESS)
+(CELTK::ATTEMPTING (EQL 50 (WIDTH R)))
+(CELTK::ATTEMPTING (EQL 5000 (AREA R)))
+(CELTK::ATTEMPTING (EQL 200 (BRIGHTNESS R)))
+(CELTK::ATTEMPTING (= 1000 (SETF (LEN R) 1000)))
+0> c-propagate-to-users > notifying users of | [i :=[24]LEN/#<RECTANGLE>] | (AREA WIDTH)
+
+Notice here that the LEN cell is about to tell both the width and area to recalculate,
+since area depends (of course) on len and (rather artificially) width also derives
+from LEN.
+
+ie, This example has accidentally deviated into more complexity than intended. But we are
+approaching these issues anyay, so I will leave it for now. We can always break it up
+later.
+
+Let's continue:
+
+(:START :WIDTH)
+(:finish :WIDTH)
+(:START :AREA)
+(:finish :AREA)
+
+Fine, now here comes the challenge. Width is also going to tell area to recalculate:
+
+0> c-propagate-to-users > notifying users of | [? :<vld>=[24]WIDTH/#<RECTANGLE>] | (AREA)
+0> c-propagate-to-users > notifying users of | [? :<vld>=[24]AREA/#<RECTANGLE>] | (BRIGHTNESS)
+
+Correct: Area does not actually run its rule since it already did so when notified by LEN,
+ but it does propagate to brightness.
+
+(:START :BRIGHTNESS)
+(:finish :BRIGHTNESS)
+(CELTK::ATTEMPTING (EQL 500000 (AREA R)))
+(CELTK::ATTEMPTING (EQL 2 (BRIGHTNESS R)))
+|#
\ No newline at end of file
More information about the Cells-cvs
mailing list