On Dec 27, 10:59 pm, Alex Osborne <a...@meshy.org> wrote:
> justinhj <justi...@gmail.com> writes:
> > On Dec 26, 11:42 pm, Alex Osborne <a...@meshy.org> wrote:
> > (defn test-threads [n out]
> >   (dotimes [x n]
> >     (.start (Thread. (#(sleeper-thread %1 %2 %3) out x (+ 2000 (rand-
> > int 5000)))))))
>
> Ah.  The problem is here.  You're calling that lambda in the main thread
> and then passing the return value of sleeper-thread to (Thread.) (which
> doesn't make much sense).
>
> Try this:
>
> (defn test-threads [n out]
>   (dotimes [x n]
>     (.start (Thread. #(sleeper-thread out x (+ 2000 (rand-int 5000)))))))
>
> Or even:
>
> (defn test-threads [n out]
>   (dotimes [x n]
>     (future (sleeper-thread out x (+ 2000 (rand-int 5000))))))
>
> Or forgetting about passing the out argument around:
>
> (defn test-threads [n]
>   (dotimes [x n]
>     (let [out *out*]
>       (future
>         (binding [*out* out]
>           (sleeper-thread x (+ 2000 (rand-int 5000))))))
>
> You could turn that into a macro:
>
> (defmacro future-with-out [& body]
>   `(let [out# *out*]
>      (future (binding [*out* out#] ~...@body)))
>
> And then use it like:
>
> (defn test-threads [n]
>   (dotimes [x n]
>     (future-with-out (sleeper-thread x (+ 2000 (rand-int 5000))))))

Thanks Alex, I'm still struggling a bit with the different syntax
between Clojure and Common Lisp, but I made your first change and it
works now.

Justin

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

Reply via email to