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

Reply via email to