[cl-who-devel] Generating html tree with dynamic structure

Ken Harris kengruven at gmail.com
Mon Nov 23 18:49:01 UTC 2009


Hi Dmitry,

I had the same problem about a year ago.  After looking at cl-who, my
conclusion was that it's really designed for efficiently writing fixed
structure with variable content, not variable structure.

My first attempt was simply string concatenation on the result of
multiple with-html-output-to-string calls.  It worked fine, but with
bigger inputs it became unusably slow due to all the consing.

A second option I considered was to slap a big ol' EVAL (or
MACROEXPAND? I can't remember, offhand) in there.  This is a little
weird, since cl-who transforms the input sexp into code to efficiently
write it, but then I'm only using it once.  Also, due to the weird
call structure (to-macro-and-back), I recall it being somewhat hard to
debug.

The thing I finally settled on was writing my own function that took
as input something that looked like cl-who's input, and wrote it out
to a stream.  It was surprisingly simple to write (I think it was
10-15 lines, but I don't have it in front of me right now), though it
obviously doesn't handle every case cl-who does.  It wouldn't handle
htm/str/txt or prologues or inline code or whatever -- I just pass in
a complete sexp, and it walks the tree and writes to a stream.

In your case, you'd just need to generate a value like (:strong
(:italic "text")) to pass in -- and Lisp tends to be pretty good at
letting you build lists.  :-)

(I hooked it up to write to my web server's response stream directly,
and it screamed.  Well, at least compared to the old "cons a few
gigabytes every request" method.)

I can dig up that function tonight if it sounds useful to you.


- Ken




More information about the Cl-who-devel mailing list