David Powell <djpow...@djpowell.net> writes:

>> No, it's perfectly possible to have a comprehension with a :while that
>> generates more elements after :while evaluated to false.  :while skips
>> some bindings, but it doesn't need to skip all of them.  See my original
>> reply to Nicolas.
>
> Wow - I never knew that.  That isn't at all obvious from the sparse
> doc string.

Yes, that's really not really easy to get right.

> (Is that actually a bug, I wonder? - it seems like a pretty useless
> behaviour?)

I think it's useful.  Check my second example with the :while as last
form.  Although these two result in the same value

  (for [x [1 2 3] y [1 2 3] z [1 2 3] :while (<= x y)] [x y z])
  (for [x [1 2 3] y [1 2 3] z [1 2 3] :when (<= x y)] [x y z])

the former performs a bit better because the version with :when needs to
test the :when form for any binding while the :while version doesn't
evaluates the test less frequently.

Another example counting the number of test evaluations:

--8<---------------cut here---------------start------------->8---
user> (def a (atom 0))
#'user/a
user> (time (dorun (for [x (range 1000)
                         y (range 100)
                         z [1 2 3]
                         :when (do (swap! a inc) (<= x y))]
                      [x y z])))
"Elapsed time: 205.593919 msecs"
nil
user> @a
300000
user> (def a (atom 0))
#'user/a
user> (time (dorun (for [x (range 1000)
                         y (range 100)
                         z [1 2 3]
                         :while (do (swap! a inc) (<= x y))]
                      [x y z])))
"Elapsed time: 146.163655 msecs"
nil
user> @a
110100
--8<---------------cut here---------------end--------------->8---

So if your :while/:when test is expensive, that might make a difference
performance-wise.

Bye,
Tassilo

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