Hi,

On Jul 21, 4:00 pm, ka <sancha...@gmail.com> wrote:

> 1:13 user=> (def k (for [a (r 2 true)] a) )
> Called (r 2)
> #'user/k
>
> Why do you think for doesn't have 'lazy-for' semantics already?

Because then the above would look like:

user=> (def l (hypothetical-lazy-for [a (r 2 true)] a))
#'user/l
user=>

Compare:

user=> (def k (concat (r 2 true) (r 3 true)))
Called (r 2)
Called (r 3)
#'user/k

vs.

user=> (def k (lazy-cat (r 2 true) (r 3 true)))
#'user/k

> Also this thread has given me the insight that 'for' is not meant for
> Cartesian products of two seqs (contrary to what I thought) -

You are right in so far as for is not meant for cartesian products
exclusively. But a cartesian product is one case, which can be covered
by for. But for is much more general than that.

Try this:

user=> (let [rs2 (r 2 true)
             rs3 (r 3 true)]
         (for [r2 rs2
               r3 rs3]
           [r2 r3]))
Called (r 2)
Called (r 3)
Realizing elem 0
Realizing elem 0
Realizing elem 1
Realizing elem 2
Realizing elem 1
([:a :a] [:a :a] [:a :a] [:a :a] [:a :a] [:a :a])

If your input sequences are independent of each other, and they come
from a (possibly expensive) function call, use let in the above
fashion.

Sincerely
Meikel

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