On Aug 1, 9:37 am, Garth Sheldon-Coulson <g...@mit.edu> wrote:
> Hi there,
>
> I have a program that produces multidimensional LazySeqs, i.e. seqs of seqs
> of seqs of...
>
> I would like to write a function to convert these multidimensional LazySeqs
> to vectors. This is in case a user needs constant lookup time.
>
> The following function will do it:
>
> (defn vectorize [obj]
>   (if-not (seq? obj)
>     obj
>     (vec (map vectorize obj))))
>
> (def foo (list 1 2 3 (list 1 2 4 (list 1 4)) 2))
>
> (vectorize foo)
>
> >> [1 2 3 [1 2 4 [1 4]] 2]
>
> However, since there is no recur there, the function is liable to blow the
> stack on a very deep data structure (or so I gather from reading about
> Clojure's lack of TCO).
>
> I cannot figure out how to write the function using recur. Any ideas?
>
> More broadly, this would not be necessary if I could tell my LazySeqs to
> cache accesses and they cached them using a constant-lookup-time data
> structure. I've seen mention that LazySeqs cache access, but they don't seem
> to for me:
>
> user=> (def foo (lazy-seq (range 10000000)))
> user=> (time (nth foo 9999999))
> "Elapsed time: 655.924286 msecs"
> 9999999
> user=> (time (nth foo 9999999))
> "Elapsed time: 675.42013 msecs"
> 9999999
>
> Maybe I'm misunderstanding what is meant by caching.

The results of realizing the seq are cached, but its still a list, so
the lookup is done in linear time.  I would guess that the times are
similar because the dominant factor is nth's traversal of the seq, not
range's generation of incremental ints; that or the hotspot hasn't
kicked in.

>
> Any thoughts on the vectorize function or caching?
> Thanks.
>
> Garth
--~--~---------~--~----~------------~-------~--~----~
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