Picking up the variadic arguments discussion, it seems that in a simple definition like
(fn [& args] (apply f arg1 args)) One could conceivably put some sort of preprocessing smarts into the fn macro that notices that a) this is a variadic arglist b) the variadic arg (args) is a symbol, not some complicated destructuring expression c) args is only ever used as the last argument to apply (maybe check this after thoroughly macroexpanding the function body) and then autogenerates the various unrolled cases. Even if we did only the simplest version of this, the new definition of partial would be (defn partial "Takes a function f and fewer than the normal arguments to f, and returns a fn that takes a variable number of additional args. When called, the returned function calls f with args + additional args." {:added "1.0" :static true} ([f] f) ([f arg1] (fn [& args] (apply f arg1 args))) ([f arg1 arg2] (fn [& args] (apply f arg1 arg2 args))) ([f arg1 arg2 arg3] (fn [& args] (apply f arg1 arg2 arg3 args))) ([f arg1 arg2 arg3 & more] (fn [& args] (apply f arg1 arg2 arg3 (concat more args))))) which is shorter (and would be unrolled in more cases than it currently is) The thing that concerns me is that such a preprocessing step would be treating 'clojure.core/apply as a magic token, when apply is supposed to be a function like any other. And sufficient smarts to make 'partial single-clause would probably require treating 'clojure.core/concat as a magic token as well. On Sunday, October 26, 2014 8:43:23 PM UTC-7, Alex Miller wrote: > > 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 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 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.