% language=us runpath=texruns:manuals/followingup

\startcomponent followingup-whatsits

\environment followingup-style

\startchapter[title={Whatsits}]

% \startsection[title={...}]

Whatsits provide the natural extension mechanism for \TEX. In \PDFTEX\ there are
plenty such whatsits, for instance for \PDF\ annotations. In \LUATEX\ this
mechanism was reorganized so that the code was better isolated. In the first
versions of \LUAMETATEX\ only a handful was left. Stepwise some were removed and
in the end we could stick to only one general whatsit because one can implement
the few needed to be compatible with \TEX.

We started out with this set of whatsits:

\starttabulate[|B|p|]
\NC open    \NC open a file for writing (delayed) \NC \NR
\NC write   \NC write to an open file (or terminal otherwise) \NC \NR
\NC close   \NC close an opened file \NC \NR
\NC special \NC write some literal \PDF\ code to the output file \NC \NR
\NC user    \NC store and retrieve data in a node \NC \NR
\NC latelua \NC execute code delayed (in the backend) \NC \NR
\NC literal \NC write some literal \PDF\ code to the output file, controlled by a mode \NC \NR
\NC save    \NC push the transformation state \NC \NR
\NC restore \NC pop the transformation state \NC \NR
\NC matrix  \NC apply a transformation (\type {rx sx sy ry}) \NC \NR
\NC savepos \NC register a position to be queried afterwards (\type {x y}) \NC \NR
\stoptabulate

The \type {\openout}, \type {\write} and \type {\closeout} primitives relate to
the first three but they can be prefixed with \type {\immediate} in which case
they don't end up as whatsits but are applied directly. The \type {special} is
actually meant for \DVI\ while the \type {\(pdf)literal} is for \PDF\ output. The
first four are available in regular \TEX.

The last four are dealt with exclusively in the backend and by removing the
backend they basically became no|-|ops. I kept them for a while but in the end
decided to kick them out. Instead a generic whatsit was introduced that could be
used as signal with the same function. That simple whatsit only has a subtype
(and of course optionally attributes). And, as \CONTEXT\ has its own backend, we
can intercept them as we like. The saving in code is not spectacular but keeping
it around (basically doing nothing) neither. The impact on \CONTEXT\ was not that
large because for instance saving positions is done differently and
transformations are encapsulated in a few helpers that could easily be adapted.

From there it was a small step to also remove the literal whatsit, so then we had
five whatsits left, plus the generic one. I then entered sentimental mode: should
we keep the first four or not. Of course we want to be \TEX\ compatible but we
can remove the code and provide a compatible replacement using macros and our own
simple whatsit nodes. That keeps all the housekeeping at the \LUA\ end,
simplifies the \CCODE, and we're still \TEX.

Of course, once we remove these and only have the delayed \LUA\ whatsit and user
whatsits left, we can as well replace these too. In \LUATEX\ user nodes are
actually not dealt with in the backend. One can create them at the \LUA\ end and
query them in callbacks. The \TEX\ machinery just ignores them, like any whatsit.
In retrospect they could have been first class nodes, but making them whatsits
was wise because that way they can be ignored consistently when needed.

So, in the end all we need is a simple whatsit. As I removed the subtypes
stepwise there was an intermediate mix of code to recognize simple whatsits from
core whatsits but that distinction went away. Doing this kind of refactoring is
best done stepwise because that way I can compile some large documents and see if
things break. As a consequence again some code could be simplified as we
basically no longer have extensions. Of course at the \CONTEXT\ end the removed
primitives had to be added but that didn't take much effort. The binary shrunk
some 30K but (a small amount of) \LUA\ code was added to provide a compatible
functionality (not that we use it).

% \stopsection

\stopchapter

\stopcomponent

