Uploaded image for project: 'Clojure'
  1. CLJ-1944

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

    Details

    • Type: Bug
    • Status: Closed
    • Priority: Major
    • Resolution: Declined
    • Affects versions: Release 1.7
    • Fix versions: None
    • Environment:

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

      Description

      This works:

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

      This also works:

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

      Bizarrely enough, even this works:

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

      This produces a ClassCastException:

      (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:

      (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:

      (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.

        Attachments

          Activity

            People

            • Assignee:
              Unassigned
              Reporter:
              alex+import import
            • Votes:
              0 Vote for this issue
              Watchers:
              0 Start watching this issue

              Dates

              • Created:
                Updated:
                Resolved: