Thank you Mr. Alex Miller!

Fancy printing of exceptions is working :)

Geraldo

On Friday, April 10, 2015 at 4:26:30 PM UTC-3, Alex Miller wrote:
>
> Clojure 1.7.0-beta1 is now available.
>
> Try it via
> - Download: 
> https://repo1.maven.org/maven2/org/clojure/clojure/1.7.0-beta1/
> - Leiningen: [org.clojure/clojure "1.7.0-beta1"]
>
> Regression fixes since 1.7.0-alpha6:
>
> 1) CLJ-1692 - make iterate match prior laziness
> 2) CLJ-1694 - make cycle match prior laziness
> 3) CLJ-1685 - correctly handle :eof option in read and read-string
>
> One faster sequence and reduce path that didn't quite make it into alpha6 
> is now available - range is now faster for both the traditional sequence 
> use case (both chunked and unchunked traversal) and the fast reduce path.
>
> Also, since alpha6 was released, reader conditionals were ported to 
> tools.reader and the latest ClojureScript release now supports them, so now 
> is a great time to try them out!
>   
> For all changes new in beta1, see the issues marked "(beta1)" in the
> full changes below.
>
> ------------------------------------------------------------
> Clojure 1.7.0-beta1 has the following updates since 1.6.0:
>
> # Changes to Clojure in Version 1.7
>
> ## 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://clojure.org/transducers
>
> 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
> * take-nth
> * replace
> * partition-by
> * partition-all
> * keep
> * keep-indexed
> * map-indexed
> * distinct
> * interpose
>
> 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)
> * eduction - returns a reducible/iterable of applications of the 
> transducer to items in coll. Applications are re-performed with every 
> reduce/iterator.
> * 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 related issues addressed during development:
> * [CLJ-1511](http://dev.clojure.org/jira/browse/CLJ-1511)
> * [CLJ-1497](http://dev.clojure.org/jira/browse/CLJ-1497)
> * [CLJ-1549](http://dev.clojure.org/jira/browse/CLJ-1549)
> * [CLJ-1537](http://dev.clojure.org/jira/browse/CLJ-1537)
> * [CLJ-1554](http://dev.clojure.org/jira/browse/CLJ-1554)
> * [CLJ-1601](http://dev.clojure.org/jira/browse/CLJ-1601)
> * [CLJ-1606](http://dev.clojure.org/jira/browse/CLJ-1606)
> * [CLJ-1621](http://dev.clojure.org/jira/browse/CLJ-1621)
> * [CLJ-1600](http://dev.clojure.org/jira/browse/CLJ-1600)
> * [CLJ-1635](http://dev.clojure.org/jira/browse/CLJ-1635)
> * [CLJ-1683](http://dev.clojure.org/jira/browse/CLJ-1683)
> * [CLJ-1669](http://dev.clojure.org/jira/browse/CLJ-1669)
>
> ### 1.2 Reader Conditionals
>
> Reader Conditionals are a new capability to support portable code that
> can run on multiple Clojure platforms with only small changes. In
> particular, this feature aims to support the increasingly common case
> of libraries targeting both Clojure and ClojureScript.
>
> Code intended to be common across multiple platforms should use a new
> supported file extension: ".cljc". When requested to load a namespace,
> the platform-specific file extension (.clj, .cljs) will be checked
> prior to .cljc.
>
> A new reader form can be used to specify "reader conditional" code in
> cljc files (and *only* cljc files). Each platform defines a feature
> identifying the platform (:clj, :cljs, :cljr). The reader conditional
> specifies code that is read conditionally based on the feature/
>
> Form #? takes a list of alternating feature and expression. These are
> checked like cond and the selected expression is read and returned. Other
> branches are unread. If no branch is selected, the reader reads nothing
> (not nil, but literally as if reading ""). An optional ":default" branch
> can be used as a fallthrough.
>
> Reader conditional with 2 features and a default:
>
> #?(:clj     Double/NaN
>    :cljs    js/NaN
>    :default nil)
>
> There is also a reader conditional splicing form. The evaluated expression
> should be sequential and will be spliced into the surrounded code, similar
> to unqoute-splicing.
>
> For example:
>
>    [1 2 #?@(:clj [3 4] :cljs [5 6])]
>
> This form would read as [1 2 3 4] on Clojure, [1 2 5 6] on ClojureScript,
> and [1 2] on any other platform.
>
> Additionally, the reader can now be invoked with options for the features
> to use and how to interpret reader conditionals. By default, reader 
> conditionals
> are not allowed, but that can be turned on, or a "preserve" mode can be 
> used to
> preserve all branches (most likely useful for tooling or source 
> transforms).
>
> In the preserve mode, the reader conditional itself and any tagged literals
> within the unselected branches are returned as tagged literal data.
>
> For more information, see:
> http://dev.clojure.org/display/design/Reader+Conditionals
>
> * [CLJ-1424](http://dev.clojure.org/jira/browse/CLJ-1424)
> * [CLJ-1685](http://dev.clojure.org/jira/browse/CLJ-1685) (beta1)
>
> ### 1.3 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.4 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 set to :warn-on-boxed 
> (any truthy
> value will enable unchecked-math, only this specific value enables the 
> warning).
>
> Example use:
>
>     user> (defn plus-2 [x] (+ x 2))  ;; no warning, but boxed
> #'user/plus-2
>     user> (set! *unchecked-math* :warn-on-boxed)
> 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)
> * [CLJ-1535](http://dev.clojure.org/jira/browse/CLJ-1535)
> * [CLJ-1642](http://dev.clojure.org/jira/browse/CLJ-1642)
>
> ### 1.5 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)
>
> ### 1.6 Faster reduce and iterator paths
>
> Several important Clojure functions now return sequences that also
> contain fast reduce() (or in some cases iterator()) paths. In many
> cases, the new implementations are also faster for lazy sequences
>
> * repeat - now implements IReduce
> * cycle - implements IReduceInit
> * iterate - implements IReduceInit
> * range - implements IReduce, specialized case handles common case of all 
> longs
> * keys - iterates directly over the keys of a map, without seq or MapEntry 
> allocation
> * vals - iterates directly over the vals of a map, without seq or MapEntry 
> allocation
> * iterator-seq - creates a chunked sequence when previously it was 
> unchunked
>
> Additionally, hash-maps and hash-sets now provide iterators that walk
> the data structure directly rather than via a sequence.
>
> A new interface (IMapIterable) for direct key and val iterators on maps
> was added. External data structures can use this interface to provide
> direct key and val iterators via keys and vals.
>
> These enhancements are particularly effective when used
> in tandem with transducers via transduce, sequence, into, and
> eduction.
>
> * [CLJ-1603](http://dev.clojure.org/jira/browse/CLJ-1603)
> * [CLJ-1515](http://dev.clojure.org/jira/browse/CLJ-1515) (beta1)
> * [CLJ-1602](http://dev.clojure.org/jira/browse/CLJ-1602)
> * [CLJ-1669](http://dev.clojure.org/jira/browse/CLJ-1669)
> * [CLJ-1692](http://dev.clojure.org/jira/browse/CLJ-1692) (beta1)
> * [CLJ-1694](http://dev.clojure.org/jira/browse/CLJ-1694) (beta1)
>
> ### 1.7 Printing as data
>
> There have been enhancements in how the REPL prints values without a
> print-method, specifically Throwable and the fallthrough Object case.
> Both cases now print in a tagged literal data form that can be read
> by the reader.
>
> Unhandled objects print with the class, hash code, and toString:
>
> user=> *ns*
> #object[clojure.lang.Namespace 0x55aa628 "user"]
>
> Thrown exceptions will still be printed in the normal way by the default
> REPL but printing them to a stream will show a different form:
>
> user=> (/ 1 0)
> ArithmeticException Divide by zero  clojure.lang.Numbers.divide 
> (Numbers.java:158)
> user=> (println *e)
> #error{:cause Divide by zero,
>    :via [{:type java.lang.ArithmeticException,
>       :message Divide by zero,
>   :at [clojure.lang.Numbers divide Numbers.java 158]}],
>    :trace
>      [[clojure.lang.Numbers divide Numbers.java 158]
>   [clojure.lang.Numbers divide Numbers.java 3808]
>   [user$eval5 invoke NO_SOURCE_FILE 3]
>   ;; elided ...
>   ]]}
>
> ## 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
> * [CLJ-1297](http://dev.clojure.org/jira/browse/CLJ-1297)
>   Give more specific hint if namespace with "-" not found to check file 
> uses "_"
>
> ### 2.2 Documentation strings
>
> * [CLJ-1417](http://dev.clojure.org/jira/browse/CLJ-1417)
>   clojure.java.io/input-stream has incorrect docstring
> * [CLJ-1357](http://dev.clojure.org/jira/browse/CLJ-1357)
>   Fix typo in gen-class doc-string
> * [CLJ-1479](http://dev.clojure.org/jira/browse/CLJ-1479)
>   Fix typo in filterv example
> * [CLJ-1480](http://dev.clojure.org/jira/browse/CLJ-1480)
>   Fix typo in defmulti docstring
> * [CLJ-1477](http://dev.clojure.org/jira/browse/CLJ-1477)
>   Fix typo in deftype docstring
> * [CLJ-1478](http://dev.clojure.org/jira/browse/CLJ-1378)
>   Fix typo in clojure.main usage
>
> ### 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
> * [CLJ-1529](http://dev.clojure.org/jira/browse/CLJ-1529)
>   Reduce compile times by avoiding unnecessary calls to Class.forName()
> * [CLJ-1546](http://dev.clojure.org/jira/browse/CLJ-1546)
>   vec is now faster on almost all inputs
> * [CLJ-1618](http://dev.clojure.org/jira/browse/CLJ-1618)
>   set is now faster on almost all inputs
> * [CLJ-1695](http://dev.clojure.org/jira/browse/CLJ-1695) (beta1)
>   Fixed reflection call in variadic vector-of constructor
>
> ### 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).
> * [CLJ-803](http://dev.clojure.org/jira/browse/CLJ-803)
>   Extracted IAtom interface implemented by Atom.
> * [CLJ-1315](http://dev.clojure.org/jira/browse/CLJ-1315)
>   Don't initialize classes when importing them
> * [CLJ-1330](http://dev.clojure.org/jira/browse/CLJ-1330)
>   Class name clash between top-level functions and defn'ed ones
> * [CLJ-1349](http://dev.clojure.org/jira/browse/CLJ-1349)
>   Update to latest test.generative and add dependency on test.check
> * [CLJ-1546](http://dev.clojure.org/jira/browse/CLJ-1546)
>   vec now works with things that only implement Iterable or IReduceInit
> * [CLJ-1618](http://dev.clojure.org/jira/browse/CLJ-1618)
>   set now works with things that only implement Iterable or IReduceInit
> * [CLJ-1633](http://dev.clojure.org/jira/browse/CLJ-1633)
>   PersistentList/creator doesn't handle ArraySeqs correctly
> * [CLJ-1589](http://dev.clojure.org/jira/browse/CLJ-1589)
>   Clean up unused paths in InternalReduce
> * [CLJ-1677](http://dev.clojure.org/jira/browse/CLJ-1677)
>   Add setLineNumber() to LineNumberingPushbackReader
> * [CLJ-1667](http://dev.clojure.org/jira/browse/CLJ-1667)
>   Change test to avoid using hard-coded socket port
> * [CLJ-1683](http://dev.clojure.org/jira/browse/CLJ-1683)
>   Change reduce tests to better catch reduce without init bugs
>
> ## 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
> * [CLJ-1408](http://dev.clojure.org/jira/browse/CLJ-1408)
>   Make cached string value of Keyword and Symbol transient
> * [CLJ-1466](http://dev.clojure.org/jira/browse/CLJ-1466)
>   clojure.core/bean should implement Iterable
> * [CLJ-1578](http://dev.clojure.org/jira/browse/CLJ-1578)
>   Make refer of Clojure core function not throw exception on reload
> * [CLJ-1501](http://dev.clojure.org/jira/browse/CLJ-1501)
>   LazySeq equals() should not use equiv() logic
> * [CLJ-1572](http://dev.clojure.org/jira/browse/CLJ-1572)
>   into (and other fns that rely on reduce) require only IReduceInit
> * [CLJ-1619](http://dev.clojure.org/jira/browse/CLJ-1619)
>   PersistentVector now directly implements reduce without init
> * [CLJ-1580](http://dev.clojure.org/jira/browse/CLJ-1580)
>   Transient collections should guarantee thread visibility
> * [CLJ-1590](http://dev.clojure.org/jira/browse/CLJ-1590)
>   Some IReduce/IReduceInit implementors don't respect reduced
> * [CLJ-979](http://dev.clojure.org/jira/browse/CLJ-979)
>   Clojure resolves to wrong deftype classes when AOT compiling or reloading
> * [CLJ-1636](http://dev.clojure.org/jira/browse/CLJ-1636)
>   Fix intermittent SeqIterator problem by removing use of this as a 
> sentinel
> * [CLJ-1637](http://dev.clojure.org/jira/browse/CLJ-1636)
>   Fix regression from CLJ-1546 that broke vec on MapEntry
> * [CLJ-1663](http://dev.clojure.org/jira/browse/CLJ-1663)
>   Fix regression from CLJ-979 for DynamicClassLoader classloader delegation
> * [CLJ-1604](http://dev.clojure.org/jira/browse/CLJ-1604)
>   Fix error from AOT'ed code defining a var with a clojure.core symbol name
> * [CLJ-1561](http://dev.clojure.org/jira/browse/CLJ-1561)
>   Fix incorrect line number reporting for error locations
> * [CLJ-1568](http://dev.clojure.org/jira/browse/CLJ-1568)
>   Fix incorrect line number reporting for error locations
> * [CLJ-1638](http://dev.clojure.org/jira/browse/CLJ-1638)
>   Fix regression from CLJ-1546 removed PersistentVector.create(List) method
> * [CLJ-1681](http://dev.clojure.org/jira/browse/CLJ-1681)
>   Fix regression from CLJ-1248 (1.6) in reflection warning with literal 
> nil argument
>

-- 
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