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, edw...@kenworthy.info <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 clo...@googlegroups.com<javascript:> 
> > Note that posts from new members are moderated - please be patient 
> > with your first post. 
> > To unsubscribe from this group, send email to 
> > clojure+u...@googlegroups.com <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 clojure+u...@googlegroups.com <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 clojure@googlegroups.com
Note that posts from new members are moderated - please be patient with your 
first post.
To unsubscribe from this group, send email to
clojure+unsubscr...@googlegroups.com
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 clojure+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/groups/opt_out.


Reply via email to