Thanks for your replies Marshal & Jim.
I had not understood the 'laziness' concept correctly and was expecting it 
to behave differently.
I thought that this post had somehow disappeared and I started another one 
on the same topic. Sorry about that.

--Vinay




On Tuesday, 31 July 2012 18:17:00 UTC+5:30, Marshall Vandegrift wrote:
>
> "Vinay D.E" writes: 
>
> > I am a newbie and was doing some exercises when I ran across something 
> that 
> > I don't understand. 
> > I am trying to count the number of elements in an array less than 100. 
> > 
> > My first attempt didn't work. The counter returns 0 
> > 
> > (let [a (atom 0) 
> >       i (take-while (fn[x] (swap! a inc) (< x 100))  [1 2 3 4 5])] 
> >   [@a i])  => [0 (1 2 3 4 5)] 
>
> The primary concrete problem is laziness, but fundamentally this sort of 
> mutable-imperative algorithm doesn't play nice with Clojure's core 
> features. 
>
> The sequence returned by `take-while` is lazy, and none of the function 
> applications required to generate that sequence actually happen until 
> something forces evaluation of the sequence elements.  So when you get 
> the result of `[@a i]` what happens is: 
>
>   (1) `@a` is evaluated; nothing else has actually happened yet, so the 
>       result is still the initial value of `0`. 
>
>   (2) `i` is evaluated; now the sequence is forced and generated, and as 
>       a side-effect the atom is updated. 
>
> Instead of depending on mutating side-effects to do these sorts of 
> calculations, most of the Clojure standard library assumes that you'll 
> be working with (largely) pure functions which operate primarily in 
> terms of their parameters and return values.  As an aside, you probably 
> wanted `filter` instead of `take-while` even for what you were trying to 
> do in the first place -- you should be able to figure out the difference 
> from the docs.  So, using pure functions, we can something as simple as: 
>
>   (count (filter #(< x 100) input-sequence)) 
>
> HTH, 
>
> -Marshall 
>
>

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