[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