Hello Clojurians, I'm starting to play with Processing and I want to use my favorite programming language for it, so I started using Quil<https://github.com/quil/quil>. The problem is that Processing has a imperative architecture and makes my Clojure code look bad. For those that don't know Processing/Quil, here's a little overview that's relevant to this email.
Processing is a language and a library that makes it easy to draw on the screen to do generative art, simulations, etc. Processing programs have two methods, a setup method that is run once, at the beginning, and then a draw method that is run over and over. Literally something like: Walker w; void setup() { w = new Walker(); } void draw() { w.render(); w.walk(); } I'm using a hypothetical walker, an entity that walks around the screen. More or less taken from here: http://natureofcode.com/book/introduction/ My understanding is that the equivalent Clojure code using Quil would look like this: (defn setup [] (set-state! :walker (atom (create-walker)))) (defn draw [] (render-walker @(state :walker)) (swap! (state :walker) walk)) Quil stores a map in the meta-data of the Processing applet and let's you access it. Since I need the state to change, I'm storing the walker in an atom. I found examples out there following more or less this structure. I'm not happy with this structure, it doesn't feel functional enough. When thinking about this, I got reminded of Erlang processes, specially with OTP, where you have a function that's called over and over to which the state is passed and which returns the next state. Following that structure I would like to implement it like this: (defn setup [] [(create-walker)]) (defn draw [walker] (render-walker walker) [(walk walker)]) The result of calling setup is a vector containing the attributes to draw, and the result of draw is a vector containing the attributes that will be used in the next call to draw. Does this make sense? Does it look cleaner to you guys? I achieved that by writing this wrappers for setup and draw: (defn setup-wrapper [] (set-state! :state (atom (setup)))) (defn draw-wrapper [] (swap! (state :state) (fn [s] (apply draw s)))) My concern with this is that now the whole state is in one single atom that I'm replacing on each frame and that might not be good. Is it copying the whole state or can Clojure use its copy-on-demand feature even for atoms? Is there a better way of doing this? Thanks. -- 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/d/optout.