Most Clojure core functions unroll to 3 or 4, really just depends how much 
of the tail you think is worth picking up. I don't think we have any hard 
and fast rule on it. 

On Monday, October 27, 2014 2:23:15 AM UTC-5, Phillip Lord wrote:
>
>
> I am curious, with path CLJ-1430 why stop at 3 arguments? Why not unroll 
> to 20? 
>
> I ask for a practical reason. In my own library, I have unrolled several 
> functions which get called 
> a lot. Moving from all variadic to non-variadic up to 5 args has produced 
> a given a 2x increase in 
> my code under extreme circumstances. I was thinking of macro'ing it out to 
> an arity of 20, but 
> haven't yet, just because it seems a step too far. 
>
> Phil 
>
>
> ________________________________________ 
> From: clo...@googlegroups.com <javascript:> [clo...@googlegroups.com 
> <javascript:>] on behalf of Alex Miller [al...@puredanger.com 
> <javascript:>] 
> Sent: 27 October 2014 03:42 
> To: clo...@googlegroups.com <javascript:>; cloju...@googlegroups.com 
> <javascript:> 
> Subject: [ANN] Clojure 1.7.0-alpha3 now available 
>
> Clojure 1.7.0-alpha3 is now available. 
>
> Try it via 
> - Download: 
> http://central.maven.org/maven2/org/clojure/clojure/1.7.0-alpha3/ 
> - Download securely: 
> https://repo1.maven.org/maven2/org/clojure/clojure/1.7.0-alpha3/ 
> - Leiningen: [org.clojure/clojure "1.7.0-alpha3"] 
>
> For users of Clojure 1.7.0-alpha2, there have been a few important changes 
> in features under development: 
>
> Transducers: 
> - "iteration" function renamed to "eduction" 
> - Fixed several issues related to reduced values 
>
> *unchecked-math* boxed math warnings: 
> - warnings are now only emitted when (set! *unchecked-math* 
> :warn-on-boxed). for old behavior (no warnings), use (set! *unchecked-math* 
> true). 
>
> For other changes new in alpha3, see the issues marked "(alpha3)" in the 
> changes below. 
>
> ------------------------------------------------------------ 
> Clojure 1.7.0-alpha3 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://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 
> * 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) 
> * eduction - returns a reducible/seqable/iterable seq of applications of 
> the transducer to items in coll. Applications are re-performed with every 
> reduce/seq/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) (alpha3) 
> * [CLJ-1537](http://dev.clojure.org/jira/browse/CLJ-1537) (alpha3) 
>
> ### 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 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) (alpha3) 
>
> ### 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 
> * [CLJ-1297](http://dev.clojure.org/jira/browse/CLJ-1297) (alpha3) 
>   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) (alpha3) 
>   clojure.java.io/input-stream<http://clojure.java.io/input-stream> has 
> incorrect docstring 
> * [CLJ-1357](http://dev.clojure.org/jira/browse/CLJ-1357) (alpha3) 
>   Fix typo in gen-class doc-string 
> * [CLJ-1479](http://dev.clojure.org/jira/browse/CLJ-1479) (alpha3) 
>   Fix typo in filterv example 
> * [CLJ-1480](http://dev.clojure.org/jira/browse/CLJ-1480) (alpha3) 
>   Fix typo in defmulti docstring 
> * [CLJ-1477](http://dev.clojure.org/jira/browse/CLJ-1477) (alpha3) 
>   Fix typo in deftype docstring 
> * [CLJ-1478](http://dev.clojure.org/jira/browse/CLJ-1378) (alpha3) 
>   Fix typo in clojure.main usage 
>
> ### 2.3 Performance 
>
> * [CLJ-1430](http://dev.clojure.org/jira/browse/CLJ-1430 
> <http://www.google.com/url?q=http%3A%2F%2Fdev.clojure.org%2Fjira%2Fbrowse%2FCLJ-1430&sa=D&sntz=1&usg=AFQjCNHchsdAYlVCq1vKTSyZYoGRbdBn6g>)
>  
>
>   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). 
> * [CLJ-803](http://dev.clojure.org/jira/browse/CLJ-803) (alpha3) 
>   Extracted IAtom interface implemented by Atom. 
> * [CLJ-1315](http://dev.clojure.org/jira/browse/CLJ-1315) (alpha3) 
>   Don't initialize classes when importing them 
> * [CLJ-1330](http://dev.clojure.org/jira/browse/CLJ-1330) (alpha3) 
>   Class name clash between top-level functions and defn'ed ones 
>
> ## 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) (alpha3) 
>   Make cached string value of Keyword and Symbol transient 
> * [CLJ-1466](http://dev.clojure.org/jira/browse/CLJ-1466) (alpha3) 
>   clojure.core/bean should implement Iterable 
>
>
>
>
> -- 
> 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 <javascript:> 
> 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 <javascript:> 
> 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 <javascript:><mailto:
> clojure+unsubscr...@googlegroups.com <javascript:>>. 
> 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