Sorry for the deep storage reply - this was just referenced from a ticket
and I didn't realize it was super old. :)
On Tuesday, March 11, 2014 3:44:36 PM UTC-5, Alex Miller wrote:
>
> In the let case, the *pool* will be tagged with the proper type so the
> ambiguity is detected.
>
> In the def case, the *pool* will be seen as an object and the compiler is
> just deferring to reflection at runtime to figure it out. If you turn on
> *warn-on-reflection*, you'll see a reflection warning in this case.
> Reflection is just picking the first one that matches in that case. If you
> type hinted the def case, you'd see the same error.
>
> On Saturday, July 16, 2011 6:13:11 AM UTC-5, Alf wrote:
>>
>> Hi guys. Experimenting a bit with code from "The joy of Clojure", and
>> I ran into a little problem. Trying to run this in the REPL gives the
>> following error:
>>
>> user=> (import [java.util.concurrent Executors])
>> java.util.concurrent.Executors
>>
>> user=> (let [*pool* (Executors/newFixedThreadPool (+ 2
>> (.availableProcessors (Runtime/getRuntime))))]
>> (defn dothreads! [f & {thread-count :threads
>> exec-count :times
>> :or {thread-count 1 exec-count 1}}]
>> (dotimes [t thread-count]
>> (.submit *pool* #(dotimes [_ exec-count] (f))))))
>> java.lang.IllegalArgumentException: More than one matching method
>> found: submit (NO_SOURCE_FILE:7)
>>
>>
>> However if I define pool as a Var it seems to work fine:
>>
>> user=> (import '(java.util.concurrent Executors))
>> java.util.concurrent.Executors
>>
>> user=> (def *pool* (Executors/newFixedThreadPool
>> (+ 2 (.availableProcessors (Runtime/getRuntime)))))
>> #'user/*pool*
>>
>> user=> (defn dothreads! [f & {thread-count :threads
>> exec-count :times
>> :or {thread-count 1 exec-count 1}}]
>> (dotimes [t thread-count]
>> (.submit *pool* #(dotimes [_ exec-count] (f)))))
>> #'user/dothreads!
>>
>> (from
>> https://github.com/joyofclojure/book-source/blob/master/src/joy/mutation.clj
>> )
>>
>> ExecutorService has three submit methods, and two with one parameter,
>> a Runnable and a Callable. Since Clojure functions are both, I
>> understand the compiler error, but why does it work when *pool* is a
>> Var?
>>
>> The "let" version works when I cast the function to Runnable or
>> Callable, just wondering why there is a difference.
>>
>> Cheers,
>> Alf
>>
>>
--
You received this message because you are subscribed to the Google
Groups "Clojure" group.
To post to this group, send email to [email protected]
Note that posts from new members are moderated - please be patient with your
first post.
To unsubscribe from this group, send email to
[email protected]
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 [email protected].
For more options, visit https://groups.google.com/d/optout.