The point was you aren't using lazy-seq as intended here since you are
always creating a singleton sequence. What's going on behind the scenes
here is in effect just trampolining thunks.
(defn thunked-sum [sum coll]
(if-let [[x & more] (seq coll)]
(fn [] (thunked-sum (+ sum x) more))
sum))
(trampoline (thunked-sum 0 (range 100000))) ;=> 4999950000
The "trampoline" portion of your lazy seq is the while loop in this part of
the Java implementation of LazySeq
final synchronized public ISeq seq(){
sval();
if(sv != null)
{
Object ls = sv;
sv = null;
while(ls instanceof LazySeq)
{
ls = ((LazySeq)ls).sval();
}
s = RT.seq(ls);
}
return s;
}
If you do (test-fc (range 210432423543654675765876879)) at your REPL,
evaluation is forced for the print, but because your input is so large, the
calculation time is prohibitively long. If you placed this in a def
instead, evaluation would be delayed until requested at which point it
would then take prohibitively long to complete.
On Monday, April 7, 2014 3:01:54 PM UTC-5, sorin cristea wrote:
>
>
> Hi Gianluca,
>
> I have a question ; why when a run/execute command/code line (test-fc
> (range 210432423543654675765876879)) it's not executed the function
> test-fc and return the sum for all 210432423543654675765876879 elements?
> why should I put the test-fc reference to a variable, x, like you present
> below. ( this is related to your phrase - "your function computes a
> sequence of just one element (the sum of the collection members" - why ?)
>
> In this case (def x (test-fc (range 210432423543654675765876879)) I see
> here a problem, I keep a reference to the head of sequence and this will
> imply that the GC will can't garbage the unused items, if is wrong what I'm
> say please correct me.
>
> thanks a lot
> Sorin.
>
--
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.