It occurred to me that ultimately what I want is just a pretty-printed
output that I can put on a webpage and apply syntaxhighlighter to.

I should be able to use a custom pprint dispatch to take this
[[(+ 5 (- 4 2 (* 9 3)) (* 5 (+ 6 3))) nil]
 [(- 4 2 (* 9 3)) nil]
 [(* 9 3) nil]
 [27 true]
 [-25 true]
 [(* 5 (+ 6 3)) nil]
 [(+ 6 3) nil]
 [9 true]
 [45 true]
 [25 true]]

and print something like this:

(+ 5 (- 4 2 (* 9 3)) (* 5 (+ 6 3)))
  (- 4 2 (* 9 3))
    (* 9 3)
    27
  -25
  (* 5 (+ 6 3))
    (+ 6 3)
    9
  45
25

Without even converting it into a tree.  But I am having a hard time
finding an example of custom dispatch, or docs on how to write one.  I
really just want things printed the same as pprint currently does, but
being able to specify extra indent for the whole block.  I had
originally planned to output html where each item was properly nested
as html divs, but I think that is getting overly complex.

-jeff

On Feb 14, 10:14 am, jweiss <[email protected]> wrote:
> Thanks, Alan,
>
> The solution I used looks exactly like yours:
>
> (defn mktree [vz [i out?]]
>   (if out?
>     (-> vz (zip/append-child i) zip/up )
>     (-> vz (zip/append-child [i]) zip/down zip/rightmost)))
>
> (defn as-tree [tracelist]
>   (zip/root (reduce mktree (zip/vector-zip []) tracelist)))
>
> Thinking about it some more, I don't think I'm going to come up with a
> solution that's any more efficient or easy to code as this one.  The
> real "work" is figuring out where the next element needs to be
> inserted.  Zipper keeps that information as part of the data structure
> so it doesn't have to be re-calculated every iteration.  My previous
> solution using loop had kept an accumulator (a list of indices to pass
> to assoc-in).
>
> -jeff
>
> On Feb 12, 3:42 am, Alan Malloy <[email protected]> wrote:
>
>
>
>
>
>
>
> > I toyed with some simple ways of doing this, but I don't think any of
> > them will actually work out. I think the advice you got in #clojure to
> > use zippers is probably correct. Here's a sketch I bashed out that
> > seems to do roughly what you want:https://gist.github.com/1807340(I
> > took the liberty of wrapping the whole thing in another [] under the
> > assumption you'd want to record multiple top-level calls; if not you
> > can just call first on the result).
>
> > On Feb 11, 8:39 pm, jweiss <[email protected]> wrote:
>
> > > I've been working on a tracing library, that works much like
> > > clojure.contrib.trace (based on it, actually).   One sticky problem
> > > I've found is, hierarchical logs are really crappy to try to stream to
> > > a file.  You can't just keep writing to the end of the file - new data
> > > needs to be inserted before existing end-tags.  So what I'm doing is
> > > storing the data as a list, until I know the data is complete, and
> > > then i turn it back into a tree to write the file.
>
> > > However I can't think of a simple way to do it, even though it seems
> > > like a simple operation.
>
> > > I want to turn this list of pairs (first item is the fn call or return
> > > value, the second is a truthy value marking whether it's a call or
> > > return)
>
> > > '[[(+ 1 (- 5 2) nil]
> > >  [(- 5 2) nil]
> > >  [3 true]
> > >  [4 true]]
>
> > > I want to turn that into
> > > [(+ 1 (- 5 2))
> > >     [(- 5 2)
> > >      3]
> > >  4]
>
> > > Is there a simple way to do this?

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

Reply via email to