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