I find this surprising. I do this: (supers %)
inside of my :post condition, and I get: java.lang.ClassCastException: clojure.lang.PersistentHashMap cannot be cast to java.lang.Class at clojure.core$bases.invoke(core.clj:4985) at clojure.core$supers.invoke(core.clj:4994) at admin.secretary$fetch.invoke(secretary.clj:327) How else do I find what interfaces the return value might be implementing? On Monday, December 23, 2013 10:04:54 PM UTC-5, larry google groups wrote: > > > enforce that the return is a subtype of java.util.Map rather than > checking for a specific concrete class of map. > > > Thank you. I'll do that. All the same, can anyone tell me why this > function changes the type of the value? All it does is call "fetch". The > fetch function has this post condition: > > :post [(= (type %) clojure.lang.PersistentHashMap)]} > > And "get-distinct" has the same restriction, but in get-distinct I get > this error: > > java.lang.AssertionError: Assert failed: (= (type %) > clojure.lang.PersistentHashMap) > at admin.controller$get_distinct.invoke(controller.clj:40) > > The :post condition of "fetch" does not throw an error, so I know that > "fetch" is returning clojure.lang.PersistentHashMap. However, when I print > the return type of get-distinct, I am amazed to see that it is > now clojure.lang.PersistentArrayMap. This function does almost nothing, so > I am surprised it changes the concrete implementation type of the return > value. > > > > > > > On Monday, December 23, 2013 3:43:09 AM UTC-5, Cedric Greevey wrote: >> >> 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 < >> lawrenc...@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 clo...@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+u...@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+u...@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.