If you are not concerned about coordination, then why not just grab the value beforehand and use compare-and-set:
(let [old @my-atom new (my-fn arg)] (compare-and-set! my-atom old new) (do-stuff old new)) On the other hand, if you are concerned about coordination between multiple threads changing the state, then don't use atoms; use refs. On May 17, 8:49 am, Jules <jules.gosn...@gmail.com> wrote: > Guys, > > I have a hybrid Java/Clojure project. > > I'm finding myself moving more and more of the concurrent code from > Java to Clojure - because it is so much simpler to code in Clojure > :-)... > > ... but I am also finding that I have a recurring problem for which > Clojure only seems to have a partial solution. > > The problem occurs in stateful objects when you receive an input and > need to both modify your state and generate and deliver some output. > > I store my internal state in an atom and use swap! to update it, > passing in the input and a pure function which accepts the object's > current state and input and returns the object's new state. > > The problem is that there is no clear mechanism for returning the > object's output from the same pure function. > > At the moment, I am going with a solution whereby my object's state is > a variable length tuple e.g. [current-state & latest-output]. This > allows me to return both new state and output from the same swap! I > just have to agree with all other functions reading the state that > only e.g. current-state is relevant and latest-output can be ignored > by all except the caller of swap!, which actually processes/delivers > it, but this feels clumsy. > > Am I missing something here or is there room for another member of the > swap! family which returns a tuple with a similar structure to mine, > but only uses the head of this tuple to reset the state of the > enclosing atom ? > > Thanks for your time, > > Jules > > -- > 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 > athttp://groups.google.com/group/clojure?hl=en -- 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