That looks like it should work.  This may be one of the cases where using a
mutable structure behind the scenes is the right thing to do.

On Thu, Feb 12, 2009 at 10:45 PM, Jason Wolfe <jawo...@berkeley.edu> wrote:

> I'm not sure if I fully understand what you want, but I find this sort of
> thing is often cleanest using mutable data structures, i.e., (off the top of
> my head, possibly buggy),
>
> (defn visit
> ([node] (visit node (HashSet.)))
> ([node s]
>    (when-not (.contains s node)
>      (.add s node)
>      (lazy-cat (map #(visit % s) (get-children node)) [node]))))
>
> Because this doesn't use reduce, it should still be lazy.
>
> -Jason
>
>
> (defn visit [node]
>   (lazy-cat (map visit (get-children node)) [node]))
>
>
>
> On Feb 12, 2009, at 7:37 PM, Jeffrey Straszheim wrote:
>
> Sounds good.  The one hitch is that I'm passing around a "visited" hash
> (I'm actually traversing a graph looking for spanning trees), so I end up
> calling (reduce XX [visited acc] (get-children node)) on the children, which
> (I think) kills the laziness.
>
> On Thu, Feb 12, 2009 at 10:18 PM, Jason Wolfe <jawo...@berkeley.edu>wrote:
>
>>
>>
>>
>> On Feb 12, 4:01 pm, Jeffrey Straszheim <straszheimjeff...@gmail.com>
>> wrote:
>> > It is easy to do a lazy preorder walk of a tree (in psuedo-clojure):
>> >
>> > (fn visit [node]
>> >   (lazy-cons node (map visit (get-children node))))
>> >
>> > So, that much is obvious.  However, I cannot think of an obvious way to
>> do a
>> > post-order traversal lazily.  I sort of assume it cannot be done, as the
>> > whole point -- more or less -- of a post ordered walk is you've visited
>> the
>> > children already.
>>
>> I think
>>
>> (defn visit [node]
>>   (lazy-cat (map visit (get-children node)) [node]))
>>
>> should do more or less what you want.  It won't be quite as lazy as
>> the preorder, since it has to walk all the way to a leaf before it can
>> start producing values, but I think it will evaluate just what's
>> needed to produce each value (perhaps plus a little bit).
>>
>> -Jason
>>
>>
>
>
>
>
>
> >
>

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