We're updating the issue view to help you get more done. 

(into {}) fails for pairs represented as anything other than vectors

Description

This works:

1 2 (into {} [[:a 1]]) ;=> {:a 1}

This also works:

1 2 (into {} (list (vector :a 1))) ;=> {:a 1}

Bizarrely enough, even this works:

1 2 (into {} [{:a 1}]) ;=> {:a 1}

This produces a ClassCastException:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 (into {} [(list :a 1)]) ;=> java.lang.ClassCastException: clojure.lang.Keyword cannot be cast to java.util.Map$Entry at clojure.lang.ATransientMap.conj(ATransientMap.java:44) at clojure.lang.ATransientMap.conj(ATransientMap.java:17) at clojure.core$conj_BANG_.invokeStatic(core.clj:3257) at clojure.core$conj_BANG_.invoke(core.clj:3249) at clojure.lang.PersistentList.reduce(PersistentList.java:141) at clojure.core$reduce.invokeStatic(core.clj:6544) at clojure.core$into.invokeStatic(core.clj:6610) at clojure.core$into.invoke(core.clj:6604) at user$eval4419.invokeStatic(form-init625532025826918014.clj:1) at user$eval4419.invoke(form-init625532025826918014.clj:1) at clojure.lang.Compiler.eval(Compiler.java:6927) at clojure.lang.Compiler.eval(Compiler.java:6890) at clojure.core$eval.invokeStatic(core.clj:3105) at clojure.core$eval.invoke(core.clj:3101) at clojure.main$repl$read_eval_print__7408$fn__7411.invoke(main.clj:240) at clojure.main$repl$read_eval_print__7408.invoke(main.clj:240) at clojure.main$repl$fn__7417.invoke(main.clj:258) at clojure.main$repl.invokeStatic(main.clj:258) at clojure.main$repl.doInvoke(main.clj:174) at clojure.lang.RestFn.invoke(RestFn.java:1523) at clojure.tools.nrepl.middleware.interruptible_eval$evaluate$fn__663.invoke(interruptible_eval.clj:87) at clojure.lang.AFn.applyToHelper(AFn.java:152) at clojure.lang.AFn.applyTo(AFn.java:144) at clojure.core$apply.invokeStatic(core.clj:646) at clojure.core$with_bindings_STAR_.invokeStatic(core.clj:1881) at clojure.core$with_bindings_STAR_.doInvoke(core.clj:1881) at clojure.lang.RestFn.invoke(RestFn.java:425) at clojure.tools.nrepl.middleware.interruptible_eval$evaluate.invokeStatic(interruptible_eval.clj:85) at clojure.tools.nrepl.middleware.interruptible_eval$evaluate.invoke(interruptible_eval.clj:55) at clojure.tools.nrepl.middleware.interruptible_eval$interruptible_eval$fn__708$fn__711.invoke(interruptible_eval.clj:222) at clojure.tools.nrepl.middleware.interruptible_eval$run_next$fn__703.invoke(interruptible_eval.clj:190) at clojure.lang.AFn.run(AFn.java:22) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) at java.lang.Thread.run(Thread.java:745)

Likewise, this produces a similar ClassCastException:

1 2 (into {} [#{:a 1}]) ;=> ClassCastException ....

There doesn't seem to be any documentation on into that implies it only works when kv pairs are represented as vectors (or somehow, maps), so this seems to be a bug. It's extremely surprising that it doesn't work for pairs represented as lists.

For the interested, I found this by writing a function to invert a map in the most natural way I could think of:

1 2 3 4 5 6 7 8 9 10 11 12 13 (defn invert-map [m] (into {} (map (fn [[k v]] [v k]) m))) (invert-map {:a 1 :b 2}) ;=> {1 :a 2 :b}, no alarms and no surprises ; wait, this is pretty stupid, why don't I just use reverse... (defn invert-map [m] (into {} (map reverse m))) (invert-map {:a 1 :b 2}) ;=> :(

Confirmed with Clojure 1.7 on Ubuntu 3.13.0-63-generic 64bit.

Environment

Linux 3.13.0-63-generic #103-Ubuntu SMP x86_64 GNU/Linux

Status

Assignee

Unassigned

Reporter

import

Labels

Approval

None

Patch

None

Affects versions

Release 1.7

Priority

Major