(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