Ah, okay. I thought it might be this.

Not that I don't trust you, though, but how do you know this? Is there a
good way of finding out what clojure has infered or not? tools.analyzer?
I'm thinking from a point of view of the developer trying to get his
type hints sorted.

Phil

Nicola Mometto <brobro...@gmail.com> writes:

> The reason why that call doesn't require reflection is that
> Collection.unmodifiableSet has no overloaded methods, it only takes a
> Set so the compiler doesn't have to disambiguate between different
> signatures.
>
> Phillip Lord writes:
>
>> Yes, I checked the code.
>>
>> (defn set
>>   "Returns a set of the distinct elements of coll."
>>   {:added "1.0"
>>    :static true}
>>   [coll] (clojure.lang.PersistentHashSet/create (seq coll)))
>>
>> And that was my first assumption. But if clojure doesn't know the return
>> type, then why does this:
>>
>> (defn two []
>>   (java.util.Collections/unmodifiableSet
>>    (set [])))
>>
>> Not require reflection? Clojure should not know which method to call.
>> Unless it is just because unmodifiableSet has an arity of one and it's
>> the only arity of one, so it doesn't try to disambiguate.
>>
>> I guess even if set was type hinted (to IPersistentSet) it would still
>> not work since, IPersistentSet is not assignable from java.util.Set.
>>
>> Phil
>>
>>
>>
>> Nicola Mometto <brobro...@gmail.com> writes:
>>
>>> Actually `set` and a lot of other clojure.core functions are neither
>>> inlineable nor have type hints.
>>>
>>> Phillip Lord writes:
>>>
>>>> I have a piece of code that looks like this
>>>>
>>>> (.getOWLEquivalentClassesAxiom
>>>>       (owl-data-factory)
>>>>       (set classlist)
>>>>       (union-annotations classlist))
>>>>
>>>> The method signature is
>>>>
>>>> getOWLEquivalentClassesAxiom(Set,Set)
>>>>
>>>> On runing lein check I get
>>>>
>>>>
>>>> Reflection warning, tawny/owl.clj:2219:6 - call to method
>>>> getOWLEquivalentClassesAxiom on
>>>> org.semanticweb.owlapi.model.OWLDataFactory can't be resolved (argument
>>>> types: unknown, java.util.Set).
>>>>
>>>> which makes no sense. Surely, the return type of clojure.core/set is
>>>> known to be java.util.Set? I have quite a few calls like this in my
>>>> code, which is why I don't want to type hint the return of set
>>>> individually.
>>>>
>>>> If I add a function like so:
>>>>
>>>> (defn ^java.util.Set hset [coll]
>>>>   (set coll))
>>>>
>>>> and call like this:
>>>>
>>>> (.getOWLEquivalentClassesAxiom
>>>>       (owl-data-factory)
>>>>       (hset classlist)
>>>>       (union-annotations classlist))
>>>>
>>>> The reflection warning goes away.
>>>>
>>>>
>>>> I've tried to reproduce this with simpler cases, like so:
>>>>
>>>>
>>>> (defn one []
>>>>   (java.util.Collections/unmodifiableSet
>>>>    (java.util.HashSet.)))
>>>>
>>>>
>>>> (defn two []
>>>>   (java.util.Collections/unmodifiableSet
>>>>    (set [])))
>>>>
>>>> But both of these pass lein check just fine. Which suggests that clojure
>>>> knows set returns a java.util.Set object.
>>>>
>>>> Now, given that I can't give a simple test case, I realise that it's
>>>> hard for anyone to work out what is happening. But, worse, I don't know
>>>> how to debug this at all. So, how I find out what clojure things the
>>>> return type of a function is? Or probe any further why this is failing?
>>>>
>>>> Phil
>>>
>>> --
>>
>> --
>> Phillip Lord,                           Phone: +44 (0) 191 222 7827
>> Lecturer in Bioinformatics,             Email: phillip.l...@newcastle.ac.uk
>> School of Computing Science, http://homepages.cs.ncl.ac.uk/phillip.lord
>> Room 914 Claremont Tower,               skype: russet_apples
>> Newcastle University,                   twitter: phillord
>> NE1 7RU
>
> --

-- 
Phillip Lord,                           Phone: +44 (0) 191 222 7827
Lecturer in Bioinformatics,             Email: phillip.l...@newcastle.ac.uk
School of Computing Science,            
http://homepages.cs.ncl.ac.uk/phillip.lord
Room 914 Claremont Tower,               skype: russet_apples
Newcastle University,                   twitter: phillord
NE1 7RU                                 

-- 
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/d/optout.

Reply via email to