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.her...@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 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.