Hi Jan, Thanks for your explanations.
I have no idea how I managed to completely misunderstand clojure/atom for the past few years -- I suspect it's because I never use clojure/STM, and as a result, I've never had an atom roll back on me. I've decided to switch to agents. Thanks again for catching this fundamental error. On Sun, Feb 16, 2014 at 11:00 PM, Jan Herich <jan.her...@gmail.com> wrote: > Hi t x, > > I think, that lock-free approach an it's semantics is more in line with > other Clojure reference types such as refs. > It also encourages you to only use pure functions for state transitions, > among other things, such as significant > performance benefits in comparison with lock based approaches, see for > example this article. > If you really want to update some reference with function which will also > perform "impure" actions such as file I/O, > consider using agents and send or send-off (the latter in case of I/O > blocking actions), functions given to send > and send-off are guaranteed to run only once. > > Dňa pondelok, 17. februára 2014 2:36:59 UTC+1 t x napísal(-a): >> >> Hi Jan, >> >> You're right. I'm wrong. >> >> I'm grateful you pointed this out -- this would have otherwise been >> impossible to debug. >> >> =========================== >> >> To everyone: >> >> Why can swap! be retried? This confuses me -- to implement swap!, why >> can't we >> >> * have a lock >> >> * ensure that only one swap! is in session at any given time >> >> * have the given swap! complete before running the next swap! >> >> >> Thanks! >> >> >> On Sun, Feb 16, 2014 at 3:51 PM, Jan Herich <jan.h...@gmail.com> wrote: >> > I'm afraid your understanding of atom swap! operations is not quite >> > correct >> > -> update function must (or should) be pure as well. >> > See the documentation for swap!, update function could be potentially >> > called >> > multiple times if there are more threads of execution >> > updating one atomic reference -> there is simple compare and set >> > mechanism >> > involved, which compares the old value of the atom >> > (input for the update function) and sets the atom to new value (return >> > value >> > from the update function) only value of the atom reference >> > was not changed in between, if yes the compare and set is retried until >> > ti >> > succeeds. >> > >> > Dňa nedeľa, 16. februára 2014 23:35:24 UTC+1 t x napísal(-a): >> >> >> >> 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 <ramesh1...@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" <txre...@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....@gmail.com> >> >> >> wrote: >> >> >> > On Sat, Feb 15, 2014 at 6:04 PM, t x <txre...@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 clo...@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+u...@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+u...@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 clo...@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+u...@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+u...@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 clo...@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+u...@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+u...@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 clo...@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+u...@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+u...@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.