I believe that's the STM approach, which has the advanrtage of:

  * can synchronize across multiple pieces of data

but has the disadvantage of:

  * work must be "pure" since it can be retried

  * possibly less efficient due to possibility of retrying


In the example I posted above, I only need to:

  * modify a single atom

and the approach I presented above:

  * can be impure, since it is guaranteed to only run once

  * is guaranteed to succeed (without retrys)

On Sun, Feb 16, 2014 at 2:25 PM, Ramesh <ramesh10dul...@gmail.com> wrote:
> You can use a ref instead of an atom. And use dosync with multiple alter, so
> everything is safely inside a transaction.
>
> On Feb 16, 2014 2:04 PM, "t x" <txrev...@gmail.com> wrote:
>>
>> Hi John,
>>
>>   Your solution is perfectly valid and optimal for the problem I
>> described above.
>>
>>
>>   Unfortunately, I forgot to mention an additional constraint: sometimes I
>> do:
>>
>> (let [ foo (:some-selector @data-atom) ]
>>   (swap! data-atom update-in [:other-selector] ... ))
>>
>> which the -> doesn't quite work on, but my ugly hack above does resolve.
>>
>>
>>   The problem being -- I want to update one part of the atom, but it
>> depends on another part of the atom.
>>
>>   I ended up with the following hack:
>>
>> (defn tswap! [atm func]
>>   (swap! atm
>>          (fn [old]
>>            (let [natm (atom old)]
>>              (func natm)
>>              @natm))))
>>
>>
>> On Sat, Feb 15, 2014 at 4:09 PM, John D. Hume <duelin.mark...@gmail.com>
>> wrote:
>> > On Sat, Feb 15, 2014 at 6:04 PM, t x <txrev...@gmail.com> wrote:
>> >>
>> >>
>> >> (defn what-I-want []
>> >>   (with-atom some-atom
>> >>     assoc-in ...
>> >>     assoc-in ...
>> >>     update-in ...))
>> >
>> >
>> > I often do something like this and don't find it too ugly:
>> > (swap! my-atom #(-> %
>> >                   (assoc-in [:k] v)
>> >                   (update-in [:k2] inc)
>> >                   ,,,))
>> >
>> > --
>> > 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.
>
> --
> 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.

Reply via email to