Hi sorin,

your function computes a sequence of just one element (the sum of the 
collection members), so I would say it is not a typical use of (lazy) seqs

to see that the code is indeed lazy, you can try:
  (def x (test-fc (range 210432423543654675765876879)))
and see that it returns immediately; however, as soon as you evaluate x:
  x
the whole computation of the only element of x starts and continues all the 
way to process the 210432423543654675765876879 elements of the range

As for your question on recursion: this is an example of tail recursion, 
that is automatically converted into plain iteration.
When there is only a recursive call, and such a call is the last thing in 
the body of the function, it can be easily (and automatically) converted to 
iteration, with no stack overflow problems.

hope this helps
Gianluca



On Sunday, April 6, 2014 6:56:00 PM UTC+2, sorin cristea wrote:
>
>
>  Hi,
>
>  maybe this question was already put it here, but can someone explain how 
> exactly work internal a function wrapped with lazy-seq keyword. For example 
> in the below code sample:
>
> (
>   defn test-fc
>   "sum of all collection elements using recursion and laziness"
>   [coll]
>   (letfn [(sum-fc [sum coll]
>             (if (empty? coll)
>               (cons sum nil)
>               (lazy-seq(sum-fc (+ sum (first coll)) (rest coll))))
>
>           )
>          ]
>     (sum-fc 0 coll)
>   )
> )
>
> if I test the function: (test-fc (range 5)) I got the right result, if I 
> continue to test with bigger number I don't got StackoverflowException, but 
> if run  (test-fc (range 210432423543654675765876879)) I didn't get 
> StackoverflowEx but the application didn't return any result, because take 
> to much time to compute this ?
>
> How exactly work this internally and how is removed recursion( inside call 
> sum-fc with new parameters) from the flow in this case ? From what I saw in 
> java code of LazySeq class and clojure source code, it's made a list with 
> LazySeq object and in my opinion in that list the LazySeq object contain 
> enough information to compute the requested item and in this way is removed 
> recursion and implicit StackoverflowException issue, if I understand 
> something wrong please explain to me. 
> I test this function from IntellijIDEA + LaClojure plugin.
>
> Thanks
> Sorin.
>

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