The two classes have essentially the same semantics, but performance differences, which is why Clojure sometimes uses one and sometimes the other. If you want to enforce that a map is returned, enforce that the return is a subtype of java.util.Map rather than checking for a specific concrete class of map.
On Sun, Dec 22, 2013 at 3:07 PM, larry google groups < lawrencecloj...@gmail.com> wrote: > Hmm, I see. get-distinct was returning an empty lazyseq, which apparently > made the difference. > > > On Sunday, December 22, 2013 2:56:01 PM UTC-5, larry google groups wrote: >> >> Hmm, the different return types seem tied to the 2 different functions >> being called, but both functions have the same return type, which is a >> lazyseq. I am using Monger to get data from MongoDb. These functions are >> private: >> >> (defn- get-distinct [request] >> {:pre [(= (type request) clojure.lang.PersistentHashMap)] >> :post [(= (type %) clojure.lang.LazySeq)]} >> (monger/get-distinct (:item-type request))) >> >> (defn- paginate-results [request] >> {:pre [ (= (type request) clojure.lang.PersistentHashMap)] >> :post [(= (type %) clojure.lang.LazySeq)]} >> (monger/paginate-results (:item-type request) (if (:which-page request) >> (:which-page request) >> 0))) >> >> Both of these functions return lazyseqs, as expected. The results from >> both get run through a (reduce) function that does some minor filtering. >> Yet in one case the return type (from the reduce function) is >> clojure.lang.PersistentArrayMap >> and in the other it is clojure.lang.PersistentHashMap. I'd like to be >> able to write a :post condition that enforces strictness, but that seems >> impossible because I can not figure out what the rule is that handles the >> conversion. I don't care if the return type is >> clojure.lang.PersistentArrayMap >> or clojure.lang.PersistentHashMap, all I want is it for it be >> consistently one or the other. >> >> >> >> >> >> On Sunday, December 22, 2013 2:31:45 PM UTC-5, larry google groups wrote: >>> >>> >>> I am surprised that a map literal is clojure.lang.PersistentArrayMap >>> but as soon as I assign it to a var, it becomes >>> clojure.lang.PersistentHashMap. >>> Are there any rules for being able to predict when these conversions occur? >>> >>> user> (type {}) >>> clojure.lang.PersistentArrayMap >>> >>> user> (type {:what "why?"}) >>> clojure.lang.PersistentArrayMap >>> >>> user> (def curious {:what "why?"}) >>> #'user/curious >>> >>> user> (type curious) >>> clojure.lang.PersistentHashMap >>> >>> user> (def sug (assoc curious :whodoneit "mikey")) >>> #'user/sug >>> >>> user> (type sug) >>> clojure.lang.PersistentHashMap >>> >>> I am curious because I wrote a (reduce) function which mostly just >>> builds a map: >>> >>> (assoc map-of-data (:item-name next-item) next-item)) >>> >>> Since I was using assoc I was certain I would get >>> clojure.lang.PersistentHashMap >>> back, but instead I got clojure.lang.PersistentArrayMap. >>> >>> >>> >>> >>> >>> >>> -- > -- > 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. > For more options, visit https://groups.google.com/groups/opt_out. > -- -- 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. For more options, visit https://groups.google.com/groups/opt_out.