Since we're on the subject, what exactly does ensure *do* that simply reading the ref does not? And then, how does it differ from writing.
On Tue, Feb 10, 2009 at 10:24 PM, Jeffrey Straszheim < straszheimjeff...@gmail.com> wrote: > Say hello to laziness. > > Your code is returning a lazy seq (from the map), which is evaluated by the > reader outside of the dosync. > > > Now what I don't understand is why, when I run: > > (dosync (dorun (map ensure [account1]))) > > I get: > > java.lang.RuntimeException: java.lang.IllegalArgumentException: No > matching method found: get for class clojure.lang.Ref (NO_SOURCE_FILE:0) > > *sigh* > > > > On Tue, Feb 10, 2009 at 10:01 PM, Eric Lavigne <lavigne.e...@gmail.com>wrote: > >> The way I understand it, "transaction running" means that the code is >> executing inside a dosync block. So this should work: >> >> >> (def account1 (ref 1000)) >> (def account2 (ref 2000)) >> >> (dosync (map ensure [account1 account2])) >> >> >> However, I get the following error: >> >> java.lang.IllegalStateException: No transaction running >> >> >> I use ensure rather than deref because I want to know that the result is >> representative of all accounts at the same point in time. I intended to use >> this as a trivial example of STM for a Clojure presentation, and was >> surprised when it didn't work. >> >> Why can't I use ensure inside of a dosync block? Is there another way to >> perform a transaction? >> >> >> >> > --~--~---------~--~----~------------~-------~--~----~ 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 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 -~----------~----~----~----~------~----~------~--~---