Hi all,
When creating a sorted set, the function sorted-set-by
cannot be called without at least one element, despite
the elements being optional.
Chouser on
irc.freenode.net #clojure suggested this is a bug, because:
20:26 < chouser> leafw: sorted-set-by allows for an empty list of initial
values, but passes that on to PersistentTreeSet/create as
null, but create doesn't check for null it just blindly calls
.length on it.
An example:
; This works:
(reduce
(fn [s b]
(conj s b))
(sorted-set-by
#(int (- (%1 :med) (%2 :med)))
{:med Double/MAX_VALUE})
[{:med 4} {:med 1} {:med 10}])
; Output:
#{{:med 1} {:med 4} {:med 10} {:med 1.7976931348623157E308}}
; But this doesn't work:
(reduce
(fn [s b]
(conj s b))
(sorted-set-by
#(int (- (%1 :med) (%2 :med))))
[{:med 4} {:med 1} {:med 10}])
; Output:
Caused by: java.lang.NullPointerException
at clojure.lang.PersistentTreeSet.create(PersistentTreeSet.java:32)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at clojure.lang.Reflector.invokeMatchingMethod(Reflector.java:90)
at clojure.lang.Reflector.invokeStaticMethod(Reflector.java:202)
at clojure.core$sorted_set_by__4242.doInvoke(core.clj:291)
at clojure.lang.RestFn.invoke(RestFn.java:415)
at user$eval__1103.invoke(NO_SOURCE_FILE:5)
at clojure.lang.Compiler.eval(Compiler.java:4623)