... oops, of course the count realizes the seq, what a silly mistake

thank you for your help


On 2 juil, 06:45, Alan Malloy <a...@malloys.org> wrote:
> (count coll) needs to realize the whole sequence all at once in order
> to see how big it is. Depending on how much of this you want to do "by
> hand", something like the following is how I would write it:
>
> (defn slice [low high coll]
>   (lazy-seq
>    (cond (pos? low)
>          (slice (dec low) (dec high) (rest coll))
>
>          (zero? high)
>          nil
>
>          :else (cons (first coll)
>                      (slice 0 (dec high) (rest coll))))))
>
> On Jul 1, 4:29 pm, kawas <laurent.joi...@gmail.com> wrote:
>
>
>
>
>
>
>
> > Hi,
>
> > As a clojure beginner I'm practicing my understanding of the language
> > but at some point the use of lazy-seq get blurry.
>
> > Imagine that I want to write a lazy function to extract a slice of a
> > collection something like this :
> >   (defn slice [coll low high]
> >     (drop (dec low) (take high coll)))
>
> > ... but "hand-made" using lazy-seq and with the constraint to check
> > the boundaries (<= 1 low high (count coll))
>
> > Of course I could write the check "in lazy-seq" but each call counts
> > the collection.
> > I could try to use arity to keep collection length, but I don't want
> > to expose this to the user.
> > I could use and outer helper function, but what if I want it all in
> > one function ?
>
> > (defn slice [coll low high]
> >   (when (<= 1 low high (count coll))
> >     (let [step (fn step [coll low high]
> >                  (lazy-seq
> >                    (cond
> >                      (> low 1)
> >                        (step (rest coll) (dec low) (dec high))
> >                      (and (= low 1) (>= high 1))
> >                        (cons (first coll) (step (rest coll) low (dec
> > high)))
> >                      :else nil)))]
> >       (step coll low high))))
>
> > Unexpectedly, this is not lazy, it seems like I'm hanging onto my
> > head.
> > Is lazy-seq creating some kind of closure with my collection in it ?
> > How about lazy-seq, tail call and closure clearing ?
>
> > regards,
> > --
> > kawas

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