I asked Rich and he said "making a volatile is as dangerous as any ! op".
Some people have also asked about vswap! being a macro instead of a method on Volatile. The issue there is that vswap! takes a variadic number of update function args. If implemented as a method, you'd need to provide multiple arities or eventually use apply (like in Atom's swap! https://github.com/clojure/clojure/blob/master/src/jvm/clojure/lang/Atom.java#L79) - doing it in a macro lets that expansion take place at compile time to provide better performance without the apply. On Mon, Sep 8, 2014 at 1:36 PM, Jozef Wagner <jozef.wag...@gmail.com> wrote: > FYI the ticket about volatile is at > http://dev.clojure.org/jira/browse/CLJ-1512 and the same question was > raised there. > > On Mon, Sep 8, 2014 at 4:25 PM, Frantisek Sodomka <fsodo...@gmail.com> > wrote: > > Hello, > > I posted a question about volatiles on the github commit: > > > https://github.com/clojure/clojure/commit/60440977823752f13a3fec3637538e9a1d68c5d4 > > > > I don't know if anybody noticed, so... why is volatile created with > function > > "volatile!" and not "volatile" ? Atoms, refs and agents don't have > > exclamation mark in their constructor functions. > > > > Should I think about volatiles as mutable locals? :-) > > > > FrantiĊĦek > > > > > > On Friday, September 5, 2014 4:26:53 PM UTC+2, Alex Miller wrote: > >> > >> Clojure 1.7.0-alpha1 is now available. > >> > >> Try it via > >> - Download: > >> http://central.maven.org/maven2/org/clojure/clojure/1.7.0-alpha2/ > >> - Download securely: > >> https://repo1.maven.org/maven2/org/clojure/clojure/1.7.0-alpha2/ > >> - Leiningen: [org.clojure/clojure "1.7.0-alpha2"] > >> > >> Highlights below, full change log here: > >> https://github.com/clojure/clojure/blob/master/changes.md > >> > >> For users of Clojure 1.7.0-alpha1, there have been a few important > changes > >> in transducers since alpha1: > >> - Removed flatmap transducer > >> - Added cat transducer > >> - mapcat 1-arity is now a transducer, specifically: (comp (map f) cat) > >> - The completing function has been lifted to be public > >> > >> Clojure 1.7.0-alpha2 has the changes below from 1.6.0: > >> > >> ## 1 New and Improved Features > >> > >> ### 1.1 Transducers > >> > >> Transducers is a new way to decouple algorithmic transformations from > >> their > >> application in different contexts. Transducers are functions that > >> transform > >> reducing functions to build up a "recipe" for transformation. > >> > >> Also see: > http://blog.cognitect.com/blog/2014/8/6/transducers-are-coming > >> > >> Many existing sequence functions now have a new arity (one fewer > argument > >> than before). This arity will return a transducer that represents the > same > >> logic but is independent of lazy sequence processing. Functions included > >> are: > >> > >> * conj (conjs to []) > >> * map > >> * mapcat > >> * filter > >> * remove > >> * take > >> * take-while > >> * drop > >> * drop-while > >> * cycle > >> * take-nth > >> * replace > >> * partition-by > >> * partition-all > >> * keep > >> * keep-indexed > >> > >> Additionally some new transducer functions have been added: > >> > >> * cat - concatenates the contents of each input > >> * de-dupe - removes consecutive duplicated values > >> * random-sample - returns items from coll with random probability > >> > >> And this function can be used to make completing transforms: > >> > >> * completing > >> > >> There are also several new or modified functions that can be used to > apply > >> transducers in different ways: > >> > >> * sequence - takes a transformation and a coll and produces a lazy seq > >> * transduce - reduce with a transformation (eager) > >> * iteration - returns an iterable/seqable/reducible seq of applications > of > >> the transducer to items in coll. Applications are re-performed with > every > >> iterator/seq/reduce. > >> * run! - run the transformation for side effects on the collection > >> > >> There have been a number of internal changes to support transducers: > >> > >> * volatiles - there are a new set of functions (volatile!, vswap!, > >> vreset!, volatile?) to create and use volatile "boxes" to hold state in > >> stateful transducers. Volatiles are faster than atoms but give up > atomicity > >> guarantees so should only be used with thread isolation. > >> * array iterators - added support for iterators over arrays > >> > >> Some issues created and addressed during development: > >> * [CLJ-1511](http://dev.clojure.org/jira/browse/CLJ-1511) > >> * [CLJ-1497](http://dev.clojure.org/jira/browse/CLJ-1497) > >> > >> ### 1.2 Keyword and Symbol Construction > >> > >> In response to issues raised in > >> [CLJ-1439](http://dev.clojure.org/jira/browse/CLJ-1439), > >> several changes have been made in symbol and keyword construction: > >> > >> 1) The main bottleneck in construction of symbols (which also occurs > >> inside keywords) was > >> interning of the name and namespace strings. This interning has been > >> removed, resulting > >> in a performance increase. > >> > >> 2) Keywords are cached and keyword construction includes a cache check. > A > >> change was made > >> to only clear the cache reference queue when there is a cache miss. > >> > >> ### 1.3 Warn on Boxed Math > >> > >> One source of performance issues is the (unintended) use of arithmetic > >> operations on > >> boxed numbers. To make detecting the presence of boxed math easier, a > >> warning will now > >> be emitted about boxed math if \*unchecked-math* is enabled. > >> > >> Example use: > >> > >> user> (defn plus-2 [x] (+ x 2)) ;; no warning, but boxed > >> #'user/plus-2 > >> user> (set! *unchecked-math* true) > >> true > >> user> (defn plus-2 [x] (+ x 2)) ;; now we see a warning > >> Boxed math warning, NO_SOURCE_PATH:10:18 - call: public static > >> java.lang.Number > >> clojure.lang.Numbers.unchecked_add(java.lang.Object,long). > >> #'user/plus-2 > >> user> (defn plus-2 [^long x] (+ x 2)) ;; use a hint to avoid boxing > >> #'user/plus-2 > >> > >> * [CLJ-1325](http://dev.clojure.org/jira/browse/CLJ-1325) > >> > >> ### 1.4 update - like update-in for first level > >> > >> `update` is a new function that is like update-in specifically for > >> first-level keys: > >> > >> (update m k f args...) > >> > >> Example use: > >> > >> user> (update {:a 1} :a inc) > >> {:a 2} > >> user> (update {:a 1} :a + 2) > >> {:a 3} > >> user> (update {} :a identity) ;; missing returns nil > >> {:a nil} > >> > >> * [CLJ-1251](http://dev.clojure.org/jira/browse/CLJ-1251) > >> > >> ## 2 Enhancements > >> > >> ### 2.1 Error messages > >> > >> * [CLJ-1261](http://dev.clojure.org/jira/browse/CLJ-1261) > >> Invalid defrecord results in exception attributed to consuming ns > >> instead of defrecord ns > >> * [CLJ-1169](http://dev.clojure.org/jira/browse/CLJ-1169) > >> Report line,column, and source in defmacro errors > >> > >> ### 2.2 Documentation strings > >> > >> No changes. > >> > >> ### 2.3 Performance > >> > >> * [CLJ-1430](http://dev.clojure.org/jira/browse/CLJ-1430) > >> Improve performance of partial with more unrolling > >> * [CLJ-1384](http://dev.clojure.org/jira/browse/CLJ-1384) > >> clojure.core/set should use transients for better performance > >> * [CLJ-1429](http://dev.clojure.org/jira/browse/CLJ-1429) > >> Cache unknown multimethod value default dispatch > >> > >> ### 2.4 Other enhancements > >> > >> * [CLJ-1191](http://dev.clojure.org/jira/browse/CLJ-1191) > >> Improve apropos to show some indication of namespace of symbols found > >> * [CLJ-1378](http://dev.clojure.org/jira/browse/CLJ-1378) > >> Hints don't work with #() form of function > >> * [CLJ-1498](http://dev.clojure.org/jira/browse/CLJ-1498) > >> Removes owner-thread check from transients - this check was preventing > >> some valid usage of transients in core.async where a transient is > created on > >> one thread and then used again in another pooled thread (while still > >> maintaining thread isolation). > >> > >> ## 3 Bug Fixes > >> > >> * [CLJ-1362](http://dev.clojure.org/jira/browse/CLJ-1362) > >> Reduce broken on some primitive vectors > >> * [CLJ-1388](http://dev.clojure.org/jira/browse/CLJ-1388) > >> Equality bug on records created with nested calls to map->record > >> * [CLJ-1274](http://dev.clojure.org/jira/browse/CLJ-1274) > >> Unable to set compiler options via system properties except for AOT > >> compilation > >> * [CLJ-1241](http://dev.clojure.org/jira/browse/CLJ-1241) > >> NPE when AOTing overrided clojure.core functions > >> * [CLJ-1185](http://dev.clojure.org/jira/browse/CLJ-1185) > >> reductions does not check for reduced value > >> * [CLJ-1039](http://dev.clojure.org/jira/browse/CLJ-1039) > >> Using def with metadata {:type :anything} throws ClassCastException > >> during printing > >> * [CLJ-887](http://dev.clojure.org/jira/browse/CLJ-887) > >> Error when calling primitive functions with destructuring in the arg > >> vector > >> * [CLJ-823](http://dev.clojure.org/jira/browse/CLJ-823) > >> Piping seque into seque can deadlock > >> * [CLJ-738](http://dev.clojure.org/jira/browse/CLJ-738) > >> <= is incorrect when args include Double/NaN > > > > -- > > 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/d/optout. > > -- > You received this message because you are subscribed to the Google Groups > "Clojure Dev" group. > To unsubscribe from this group and stop receiving emails from it, send an > email to clojure-dev+unsubscr...@googlegroups.com. > To post to this group, send email to clojure-...@googlegroups.com. > Visit this group at http://groups.google.com/group/clojure-dev. > For more options, visit https://groups.google.com/d/optout. > -- 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/d/optout.