OK took me a while to work my way through your code. I think a simpler
version to illustrate the point would be:
(def current-live-cells (atom starting-live-cells))
(defn cells-changed
; called when current-live-cells changes
[k r o n]
(print "cells-changed called.")
(repaint! (select fr [:#canvas])))
(add-watch current-live-cells :log cells-changed)
On Saturday, March 9, 2013 2:24:31 PM UTC, Jim foo.bar wrote:
>
> You need to store your model in a ref-type (atom,agent,or ref), and
> attach a watcher on it (a fn which is responsible for updating the
> view). Now, 'mutating' your model will trigger a View update...piece of
> cake :)
>
> example:
>
> (def board-history
> "Log of the state of a game."
> (atom []))
>
> (defn log-board
> "The logging function for the board ref. Will conj every new board-state
> into a vector."
> [dest k r old n]
> (when-not (= n old)
> (swap! dest conj n)))
>
> (def current-chessItems
> "This is list that keeps track of moving chess pieces. Is governed by an
> atom and it changes after every move.
> All changes are being logged to 'board-history'. Starts off as nil but
> we can always get the initial board arrangement from core."
> (-> (atom nil)
> (add-watch :log (partial core/log-board core/board-history)))))
>
> HTH,
>
> Jim
>
> ps: my example does not involve GUI, but you get the idea...it it
> trivial to change the code so that it 'repaints' the canvas with the new
> board instead of conjing it....
>
>
> On 09/03/13 14:11, [email protected] <javascript:> wrote:
> > So I understand that Clojure's data structures are immutable but I am
> > not clear how that works with MVC.
> >
> > So I have a view that displays a model. Other processes change that
> > model and the View presents those changes.
> >
> > However it's not clear to me how that would work with an immutable
> model.
> >
> > Obviously I can't pass the model into the View, have the view store a
> > reference to it and each time it's called on to render the model, do
> > so. The model is immutable.
> >
> > So I could have a global variable which points to the model, and
> > whenever I 'change' the model I re-point it to the updated version.
> > Obviously the view would have to reference that global. This just
> > smells bad. And would get worse for each model and view you needed in
> > your application.
> >
> > I suppose you could maintain some global map of models, but that
> > doesn't look nice either, it's not that much different from having a
> > pile of global models.
> >
> > This must be a solved problem surely? Could someone point me to the
> > solution please? Swing or Quil based would be fine but I assume it
> > must be generally applicable.
> > --
> > --
> > You received this message because you are subscribed to the Google
> > Groups "Clojure" group.
> > To post to this group, send email to [email protected]<javascript:>
> > Note that posts from new members are moderated - please be patient
> > with your first post.
> > To unsubscribe from this group, send email to
> > [email protected] <javascript:>
> > For more options, visit this group at
> > http://groups.google.com/group/clojure?hl=en
> > ---
> > You received this message because you are subscribed to the Google
> > Groups "Clojure" group.
> > To unsubscribe from this group and stop receiving emails from it, send
> > an email to [email protected] <javascript:>.
> > For more options, visit https://groups.google.com/groups/opt_out.
> >
> >
>
>
--
--
You received this message because you are subscribed to the Google
Groups "Clojure" group.
To post to this group, send email to [email protected]
Note that posts from new members are moderated - please be patient with your
first post.
To unsubscribe from this group, send email to
[email protected]
For more options, visit this group at
http://groups.google.com/group/clojure?hl=en
---
You received this message because you are subscribed to the Google Groups
"Clojure" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
For more options, visit https://groups.google.com/groups/opt_out.