Stefan Kamphausen <mailto:ska2...@gmail.com>
October 28, 2014 at 8:34 AM
Hi,
have there been any changes how fns with a name and recursion are
compiled? One of my projects has a function which does not compile
with 1.7.0-alpha3 anymore, but did fine with 1.6.0.
I tried to create a minimal example at
https://github.com/ska2342/nested-fn-breaks-clojure-17
(I know the function itself is probably stupid, I just wanted to
demonstrate the case. I don't know if it even runs.)
Compilation breaks with a java.io.IOException: File name too long
The problem seems to be the combination of
* using a long function name (not a bad thing per se),
* using a rather long name for a local binding (not common in
Clojure-land, used in my case for documentation of the intent of the
anon fn),
* and using a name for the anonymous function (needed for recursion
and usually a good idea because it improves stacktraces, but maybe you
added the local binding to the name for exactly that reason).
Regarding the second (long var binding name), my original function
uses shorter names, but has some nested constructs (for, cond, ...)
which seem to make the name larger, too. There is really nothing
unusually long there.
Of course, I can work around this by using different names, factoring
an inner anon function out to a defn and probably in other ways. I
just wanted to make sure, that you are aware that problems like this
may show up and made the change on purpose.
Thanks,
stefan
--
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
<mailto:clojure+unsubscr...@googlegroups.com>.
For more options, visit https://groups.google.com/d/optout.
Alex Miller <mailto:a...@puredanger.com>
October 26, 2014 at 9:42 PM
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)
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
<mailto:clojure+unsubscr...@googlegroups.com>.
For more options, visit https://groups.google.com/d/optout.