Obviously, LinkedHashMap is not a Clojure persistent data structure.
map? and alikes tests interfaces specific to Clojure, not Java ones.

Clojure data structures implement java.util.Map and cie to ease interop 
with Java but they are not the same as the persistent interfaces and do not
allow mutations contrary to Java data structures.

There is enough behavior differences (not withstanding the different hosts
running Clojure) to mandate a clean separation between both worlds.

Have a look at this:

http://grokbase.com/t/gg/clojure/11afb4wmb3/recursively-convert-java-map-to-clojure-map

It should get you started :)

Luc


> I am using a groovy library that returns a LinkedHashMap containing 
> ArrayLists and nested LinkedHashMaps.  I did not expect any issues working 
> with this in clojure since this type implements java.util.Map I figured 
> everything would just work. However the first thing I tried to do was apply 
> clojure.set/keywordize-keys which didn't keywordize the keys as expected.  I 
> then tried map? which returned false, I figured I would then try to convert 
> to clojure map using apply hash-map which threw an illegalargumentexception. 
> into {} however did work. I then attempted to use clojure.walk/postwalk to 
> convert LinkedHashMaps to clojure maps which only visited the top node.  
> However using prewalk did work, so I ended up with the following helper 
> function.  
> 
> (defn- convert-types
>   [groovy-result]
>   (walk/prewalk
>    (fn [x]
>      (cond (instance? java.util.LinkedHashMap x) (into {} x)
>            (instance? java.util.ArrayList x)  (vec x)  ;; probably not 
> required but I wanted to pr-str to print as vectors rather than #ArrayList ...
>            :else x)) groovy-result))
> 
> 
> clojure map? is defined as:
>  (fn ^:static map? [x] (instance? clojure.lang.IPersistentMap x)))
> 
> Is there any reason map? checks explicitly for clojure.lang.IPersistentMap 
> rather than java.util.Map? 
> 
> also clojure.walk/walk contains: 
> ..
>   (instance? clojure.lang.IMapEntry form)
> ..
> 
> but (first m) returns java.util.LinkedHashMap$Entry which extends 
> java.util.Map$Entry and java.util.HashMap$Entry.
> 
> I'm not sure why into {} works but apply hash-map doesn't, seems to have to 
> do with first and next don't work on java.util.LinkedHashMap$Entry either.
> 
> Seems like many of these functions could be improved to work with 
> java.util.Map and  java.util.Map$Entry?  
> Should a JIRA be created for these?
> 
> -- 
> 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
--
Softaddicts<lprefonta...@softaddicts.ca> sent by ibisMail!

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

Reply via email to