You mean (supers (type %)) ?





Sean Corfield -- (904) 302-SEAN
An Architect's View -- http://corfield.org






From: larry google groups
Sent: Monday, December 23, 2013 7:28 PM
To: clojure@googlegroups.com





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.

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

Reply via email to