Taco Hoekwater wrote:
As promised, some proposals for the symbol table. No code yet, because careful thinking is needed first, to avoid unexplainable side-effects.
interesting -)
Let me propose two rather straightforward new primitives first (please imagine the \ptex prefix yourself):
\ifprimitive <csname>
True if the <csname> has the same meaning as it would in initex, (but gives an error if <csname> is currently undefined).
why not false instead of an error?
\executeprimitive <csname>
Executes the primitive that would be known as <csname> in initex, even if the <csname> is currently undefined or defined to mean something else. Raises an error if there is no matching internal command (of course).
These are quite straightforward, and I do not assume this needs much discussion. But the next ones are related to "if feature ...", and those are bit harder to define.
I propose to make it possible to 'predefine' primitives in the executable. All program code is completely ready, except that the hash table entry is never created, making it impossible to use that primitive in initex without extra work.
\ifinternal <csname>
True if there is code in the pdtex executable to implement the internal command <csname>, regardless of whether or not it is currently reachable from macros.
\executeinternal <csname>
Executes the internal that is registered as <csname>, even if that internal is currently obscured (disable) or the <csname> is defined to mean something else. Raises an error if there is no matching internal command.
\exposeinternal <csname>
This does the final step of the primitive() function: it creates a hash entry for <csname> that maps it to its primitive meaning. An error is raised if the <csname> is currently defined. (perhaps this primitive should accept the \global prefix?)
\obscureinternal <csname>
The inverse of \exposeinternal, this 'undefines' the primitive related to <csname>. If <csname> is currently a macro, nothing needs to be done. Control sequences that are \let to the meaning of this csname are left as is. (perhaps this primitive should accept the \global prefix?)
I chose \expose... and \obscure... instead of \disable... \enable because this is closer to the truth: in this proposal it is not possible to unconditionally disable a primitive (because that would require much more work than this).
sounds ok to me; concerning the global, i think this is indeed a needed feature (unless it messes up the code too much)
Side note: The pascal implementation can be rather straightforward: a pair of shadow_hash and shadow_eqtb has to be created that contains only the equivalents of the internal control sequences, nothing else.
in the same area, how about a primitive that marks such a primitive (or maybe any macro but that may be harder to do) as being an 'if' \def\ifMyTest#1#2% {..... \iftrue} \exposeif\ifMyTest \ifnum\a>\b \ifMyTest\c\d ... \fi \fi (no missing fi messages and such) Hans ----------------------------------------------------------------- Hans Hagen | PRAGMA ADE Ridderstraat 27 | 8061 GH Hasselt | The Netherlands tel: 038 477 53 69 | fax: 038 477 53 74 | www.pragma-ade.com | www.pragma-pod.nl -----------------------------------------------------------------