|
Here is an example of making Lisp-like macros with PostScript, using a technique like "backquote", to compile PostScript code templates into more efficient drawing functions, and promote customized dynamically generated code into the instances (NeWS had a prototype based object system that made that possible). This is a design document I wrote for Open Look Sliders for The NeWS Toolkit 2.0. https://www.donhopkins.com/home/archive/NeWS/tnt-sliders-des... * THE PROBLEM: The tNt 1.0 slider implementation was a subclass of ClassDialControl,
which was a subclass of ClassControl. It needed to be reimplemented,
directly as a subclass of ClassCanvas (with ClassTarget mixed in), and
had to be taught to play games with the services architecture, and
brought in line with the controls architecture. All that hot air from
the collapse of the ParentDictArray had to go somewhere, so the slider
was graphically "puffed up" with a fake 3-D look. It is hoped that the
result of this transfer of energy will result in a net decrease in
size and increase in speed. To cope with the increase in complexity of
drawing special effects, a form of inlining or macro expansion similar
to "backquote" in lisp was used, to promote fast drawing procedures
into slider instances. * DESIGN CHOICES: space/time tradeoffs
The backquote technique speeds up drawing but takes up space. But
the macro templates (defined as methods that are inlined and
promoted) can still be executed even if they haven't been promoted.
There is a small hit for executing "," which is defined as "/,
{exec} def" (since it can't be defined as "/, /exec load def"
because of autobind). And of course the templates are slower than
the their inlined promoted expansions, because they're calculating
the values each time instead of just pushing constants. Right now,
the promotion happens upon /reshape, when the size is known and the
layout can be calculated. Another space saving trade-off might be to
only expand and promote the macros at the start of tracking, during
which parts of the control must be frequently repainted, and
unpromote it upon completion of tracking. |