also see this for a discussion about why the need for design patterns
almost disappears in Clojure:
http://stackoverflow.com/questions/8902113/clojure-model-view-controller-mvc-design
Jim
On 09/03/13 14:24, Jim - FooBar(); 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 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 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.
--
--
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.