Hi Tomas,

> > While this would surely work, I answered that it is a big overhead to
> > generate the whole page as strings just to print them.
> 
> Packing strings is not a good idea.

Right.


> It would be much better to create a cons tree instead, something like:
> 
>     (de <p> (Str) `(p ,Str))
> 
> and have a separate function to print the cons tree into a stream
> formatted as html.  Notice how little memory such <p> function allocates
> -- 2 cons cells -- compared to the version with pack.
> 
> Unfortunatelly, picolisp does not have a convenient way of creating cons
> tree templates with backquote.

It does. Just the syntax is different:

   (de <p> (@Str) (fill '(p @Str)))

This also creates just 2 cells.


But the FEXPR solution explained at PilCon allocates no new cells at all. It
prints directly.

Also, needing two separate functions for every HTML function is ugly, tedious
and error-prone.



> > But I forgot to explain: The real reason for FEXPRs goes beyond that. They 
> > have
> > the power of passing executable code bodies, with arbitrary flow control, 
> > to the
> > function.
> 
> This also nicely shows how the power of FEXPRs can easily lead one
> astray.

Right. FEXPRs are dangerous when used the wrong way.

This was what the last PilCon was all about ("hazards"). But I explained also
how these hazards disappear when you follow 2 or 3 simple rules in writing
libraries.


> Another drawback is that side-effects break tracing and make debugging
> much harder.

Side-effects like printing? No problem! In PicoLisp, you can trace, break and
single-step FEXPRs (with or without side-effects) like any other function
(unlike macros in e.g. Common Lisp).


> Using FEXPRs for html output is misoptimisation.

Wrong.

☺/ A!ex

-- 
UNSUBSCRIBE: mailto:picolisp@software-lab.de?subject=Unsubscribe

Reply via email to