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.

Reply via email to