[cells-devel] Connecting two models

Ken Tilton kentilton at gmail.com
Wed Oct 10 13:30:15 UTC 2012


Sorry, gents. I should have scrolled down! More below:

On Wed, Oct 3, 2012 at 6:06 PM, Mark Cox <markcox80 at gmail.com> wrote:
> Hi Frank,
>
> Thanks for your example. My apologies for requiring you to repeat your answer from last month. I found your post not long after I posted.
>
> From your example, and other examples that use the FAMILY class, the KIDS are instantiated at the same time as the FAMILY instance. In my case, the KIDS are instantiated at different times and then "connected" in the future. I have an attempt at the end of the email which is based off your example. It does not work, and I am not sure why.
>
> I noticed in your examples that you use macros. Is there something significant about that?
>
> Thanks
> Mark
>
> (defpackage "MODEL"
>   (:use "COMMON-LISP"
>         "CELLS"))
> (in-package "MODEL")
>
> ;; model
>
> (defmodel my-model (model)
>   ((item-index
>     :initarg :item-index
>     :accessor item-index))
>   (:default-initargs
>    :item-index (c-in 0)))
>
> (defun make-model (id)
>   (make-instance 'my-model :md-name id))
>
> ;; view
>
> (defmodel my-view (model)
>   ((item-index
>     :initarg :item-index
>     :accessor item-index))
>   (:default-initargs
>    :item-index (c-in 0)))
>
> (defun make-view (id)
>   (make-instance 'my-view :md-name id))
>
> (defobserver item-index ((object my-view) new-value)
>   (format t "~&VIEW item-index ~A~%" new-value))
>
> ;; controller
>
> (defmodel my-controller (family)
>   ((model
>     :initarg :model
>     :accessor model)
>    (view
>     :initarg :view
>     :accessor view)))
>
> (defun make-controller (model view)
>   (setf (fm-parent model) :root
>         (fm-parent view) :root)
>   (let ((rv (make-instance 'my-controller
>                            :model (c-in model)
>                            :view (c-in view)
>                            :kids (c? (the-kids model view))
>                            :md-name :root)))
>
>     (setf (item-index view) (c? (let ((m (model (fm^ :root))))
>                                   (item-index m))))
>     rv))


>
> ;; test
>
> (defun test ()
>   (let* ((model (make-model :model))
>          (view  (make-view :view))
>          (controller (make-controller model view)))
>     (setf (item-index model) 2)
>     (item-index view)))

If the above is really what you want to do you can just:

 (defun test ()
>   (let* ((model (make-model :model))
>            (view  (make-instance 'view
))
>          (controller (make-controller model view)))
>     (setf (item-index model) 2)
>     (item-index view)))




More information about the cells-devel mailing list