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.