bed_gdg@SHSU.BITNET (George D. Greenwade) (02/13/91)
This is another message I found in the genral delivery mailbox as I was
checking out what happened yesterday. It was originally received on Mon, 11
Feb 1991 14:08:26 CST from William R(ay) Brohinsky
<RAYBRO%HOLON@utrcgw.utc.com>.
Also, if you requested a file from FILESERV yesterday and have not received it
by tomorrow, it probably got caught in this queue. Sorry. Please re-submit
your request and all should get there.
-----------------------------------------------
From Karl Berry, some thoughts on loops and conditionals in TeX,
prompted my me in personal correspondance. I found Karl to be
very helpful, prompt, and approachable. His address in in
`TeX for the Impatient'.
-------------------8<-----cut here----------------------------------------
[H]ere are some random facts about conditionals and
loops that I've learned. Feel free to pass it on anywhere you like.
When you make a new conditional in TeX, as in \newif\foo, it's not
particularly like defining a boolean variable `foo' in a programming
language. There is no ``place'' where the result of the test is stored.
All that happens is a new control sequence \iffoo is defined, and
initially \let = to \iffalse. When you say \footrue or \foofalse, no
new cs's are defined -- \iffoo is just \let to \iftrue or \iffalse,
respectively. So, the code
\newif\iffoo
\iffoo a\else b\fi
is exactly equivalent to
\iffalse a\else b\fi
that is,
b
You can't invert conditions directly. The only thing to do is leave out
the <true part>, as in
\iffoo\else a\fi
Unfortunately, this doesn't work in loops. TeX has no primitives
concerning loops; the only thing it knows how to do is expand
tail-recursive macros. The \loop macro in plain TeX exploits this, of
course. It may be possible to define a different and better \loop that
allows inverted conditions and the like, but I haven't thought about it.
One painful truth about conditionals is that they don't expand the way
one would (usually) wish. Suppose I have
\def\mac{...\futurelet\next\finishmac}
\iftrue \mac\else a\fi
\futurelet is going to set \next to the token `\else', a pretty much
useless thing to do. Usually, one
wants to be the thing after the \fi. The solution is to use
\aftergroup:
\begingroup \iftrue\aftergroup\mac\else a\fi \endgroup
In general, TeX as a programming language leaves something to be
desired. But one usually can get the job done...
---------------------8<----Cut Here-------------------------------
I can't say I'm too happy about that last statement, moreso for it being
true...
raybro