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