> Sorry, I forgot to ask: how rapid is "rapidly"?
Oh, I'd say I misused that word, at least it's way more than I need
for what I use this for. I created this post only to see if someone
would have an idea for a fully lazy version out of curiosity. From my
experiments, the non-recursive version blow the stack around 486
recursions on my computer.
> Can you provide a simple example that rapidly blows the stack
> so we can experiment with lazy solutions?
Here's what I used to test the depth of recursion:
(def pit (iterate list "bottom!"))
(defn test-walk [walker shallowest deepest]
(doseq [depth (range shallowest deepest)]
(pprint (walker #(str depth " reached " %)
(last (take depth pit))))))
Here's the recursive walks functions and a new one using your first
attempt at lazy-walk:
(defn recursive-string-walk [f form]
(walk #(if (string? %) (f %) (recursive-string-walk f %))
identity form))
(defn lazy-recursive-string-walk [f form]
(walk #(cond
(string? %) (f %)
(seq? %) (lazy-seq (lazy-recursive-string-walk f %))
:default (lazy-recursive-string-walk f %))
identity form))
(defn really-lazy-recursive-string-walk [f form]
(lazy-walk #(if (string? %) (f %) (really-lazy-recursive-string-walk
f %))
identity form))
And here's the results:
* (test-walk recursive-string-walk 450 500) -> ...(...("487 reached
bottom!")...); Evaluation aborted.
* (test-walk lazy-recursive-string-walk 800 900) -> ...(...("828
reached bottom!")...); Evaluation aborted.
* (test-walk really-lazy-recursive-string-walk 800 900) -> ...(...
("829 reached bottom!")...); Evaluation aborted.
So just one more, there's still lots of room for improvement ;-). For
whatever reason the lazy version isn't able to reach 1000 while
yesterday it was able to go slightly above that and the non-lazy
version didn't changed. The more I look at the code the more I don't
get why it's not fully lazy. I'll try with zippers as Laurent
suggested.
Thanks a lot!
- budu
--
You received this message because you are subscribed to the Google
Groups "Clojure" group.
To post to this group, send email to [email protected]
Note that posts from new members are moderated - please be patient with your
first post.
To unsubscribe from this group, send email to
[email protected]
For more options, visit this group at
http://groups.google.com/group/clojure?hl=en