On 24 December 2013 07:35, Michał Marczyk <michal.marc...@gmail.com> wrote:
> ;; persistent maps only
> (instance? clojure.lang.IPersistentMap %)

Additionally, this one's better written

(map? %)

(map? is in fact defined as instance? IPM.)

Cheers,
M.

>
> ;; all Java maps
> (instance? java.util.Map %)
>
> On 24 December 2013 04:28, larry google groups
> <lawrencecloj...@gmail.com> wrote:
>> 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