The recent changes to iterate come with an interesting consequence:
reducing an iterate multiple times will cause the entire chain of x, (f
x), (f (f x)) .. to be recalculated every time.

I'd argue that this is not desiderable and a regression (even though
probably one considered by design), and that this change in behaviour is
going to produce a degradation in performance when the function to
iterate actually does some computation rather than being a trivial
function like the one used in the benchmarks in the CLJ-1603 ticket
(inc) since its result won't be cached.

If changing the new behaviour is out of the question I'd suggest to at
least document this new behaviour. The docstring of iterate talks about
returning a lazy-seq while when used with reduce it is actually a
generator.

To show what I mean here's a silly example using Threa/sleep to simulate
computation:

Clojure 1.7.0-alpha5
user=> (def a (iterate #(do (Thread/sleep 2) (inc %)) 0))
#'user/a
user=> (time (reduce (fn [_ x] (if (= 50 x) (reduced nil))) nil a))
"Elapsed time: 106.385891 msecs"
nil
user=> (time (reduce (fn [_ x] (if (= 50 x) (reduced nil))) nil a))
"Elapsed time: 0.560275 msecs"
nil

Clojure 1.7.0-master-SNAPSHOT
user=> (def a (iterate #(do (Thread/sleep 2) (inc %)) 0))
#'user/a
user=> (time (reduce (fn [_ x] (if (= 50 x) (reduced nil))) nil a))
"Elapsed time: 109.088477 msecs"
nil
user=> (time (reduce (fn [_ x] (if (= 50 x) (reduced nil))) nil a))
"Elapsed time: 109.51494 msecs"
nil

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