Alex Rivera | Logout

How to convert lazy sequence to non-lazy in Clojure

Asked 2009-10-29T04:33:42.050
104

I tried the following in Clojure, expecting to have the class of a non-lazy sequence returned:

(.getClass (doall (take 3 (repeatedly rand))))

However, this still returns clojure.lang.LazySeq. My guess is that doall does evaluate the entire sequence, but returns the original sequence as it's still useful for memoization.

So what is the idiomatic means of creating a non-lazy sequence from a lazy one?

Edit
Report

1 Answer

87

This is to some degree a question of taxonomy. a lazy sequence is just one type of sequence as is a list, vector or map. So the answer is of course "it depends on what type of non lazy sequence you want to get:
Take your pick from:

  • an ex-lazy (fully evaluated) lazy sequence (doall ... )
  • a list for sequential access (apply list (my-lazy-seq)) OR (into () ...)
  • a vector for later random access (vec (my-lazy-seq))
  • a map or a set if you have some special purpose.

You can have whatever type of sequence most suites your needs.

answered 2009-10-29T17:10:29.467

Your Answer