diff options
Diffstat (limited to 'doc/context/presentations/context/2021/context-2021-overloadprotection.tex')
-rw-r--r-- | doc/context/presentations/context/2021/context-2021-overloadprotection.tex | 298 |
1 files changed, 298 insertions, 0 deletions
diff --git a/doc/context/presentations/context/2021/context-2021-overloadprotection.tex b/doc/context/presentations/context/2021/context-2021-overloadprotection.tex new file mode 100644 index 000000000..5143e855a --- /dev/null +++ b/doc/context/presentations/context/2021/context-2021-overloadprotection.tex @@ -0,0 +1,298 @@ +% language=us + +\usemodule[present-boring,abbreviations-logos] + + +\definehighlight[nb][style=bold,color=middlegray,define=no] + +\setuptolerance[verytolerant,stretch] + +\definecolor[maincolor][r=.3,b=.3] + +\startdocument + [title={OVERLOAD PROTECTION}, + banner={the downside of macros}, + location={context\enspace {\bf 2021}\enspace meeting}] + +% TEX MP + +\starttitle[title=Primitives] + +A \TEX\ engine comes with a whole set of primitive operations for: + +\startitemize[packed] + \startitem + accessing internal variables + \stopitem + \startitem + defining macros + \stopitem + \startitem + controlling expansion + \stopitem + \startitem + constructing boxes + \stopitem + \startitem + finalizing pages + \stopitem + \startitem + defining characters (text and math) + \stopitem + \startitem + inserting kerns, glue and penalties + \stopitem + \startitem + defining fonts + \stopitem + \startitem + dealing with languages (hyphenation) + \stopitem + \startitem + testing properties + \stopitem + \startitem + manipulating tokens + \stopitem + \startitem + managing inserts + \stopitem + \startitem + handling marks + \stopitem + \startitem + grouping + \stopitem + \startitem + mathematics + \stopitem + \startitem + tracing + \stopitem +\stopitemize + +\stoptitle + +\starttitle[title=Macros] + +\startitemize + \startitem + Macros are commands defined by the user and/or a macro package. + \stopitem + \startitem + They can overload a primitive which then can confuse the whole machinery. + \stopitem + \startitem + A macro package can alias primitives for instance \type {\relax} can be + replaced by \type {\foo_relax} after \typ {\let \foo_relax \relax}. + \stopitem + \startitem + That only when (at definition time) the \type {_} is a letter. By using such + a character some protection against overload is provided. + \stopitem + \startitem + In \CONTEXT\ we often use(d) aliases like \type {\normalrelax} but of course + these can also be overloaded. + \stopitem + \startitem + We only overload a very few primitives, for instance \type {\language}. + \stopitem + \startitem + Users who overload primitives are \quote {on their own} and \quote {without + support}. + \stopitem + \startitem + An easy way to protect yourself is using \type {\CamelCase} names. + \stopitem +\stopitemize + +\stoptitle + +\starttitle[title=Overload protection] + +\startitemize + \startitem + The \LUAMETATEX\ engine has overload protection built in for the \TEX\ engine + as well as provides means to do that for \METAPOST. + \stopitem + \startitem + In \LMTX\ all commands have been tagged accordingly (which was quite some work). + \stopitem + \startitem + Processing \type {s-system-macros.mkxl} gives an overview. + \stopitem + \startitem + Overload protection is off by default but can be turned on: + +\starttyping +\enabledirectives[overloadmode=warning] +\enabledirectives[overloadmode=error] +\stoptyping + + \stopitem + \startitem + I myself always run with the error variant and make sure that the manuals obey + the rules. + \stopitem + \startitem + Modules and/or styles (and in a few cases the core code) can cheat and use: + +\starttyping +\pushoverloadmode + ........................ + ........................ +\popoverloadmode +\stoptyping + + \stopitem +\stopitemize + +\stoptitle + +\starttitle[title=Details] + +\startitemize + \startitem + Traditional \TEX\ has a few so called prefixes: \type {\global}, \type {\outer}, + \type {\long}, and type \type {\immediate}. + \stopitem + \startitem + The \ETEX\ engine adds \type {\protected} (because we already had that in + \CONTEXT\ we use what we (also already) had: \type {\unexpanded}). + \stopitem + \startitem + In \LUATEX\ we can force macros to be always long, something that we do + in \MKIV\ (as in \MKII). + \stopitem + \startitem + In \LUAMETATEX\ the \type {\outer} and \type {\long} prefixes have been + dropped (they are ignored). + \stopitem + \startitem + In \LUAMETATEX\ the \type {\protected} prefix acts like in other engines + but protection is implemented more naturally. + \stopitem + \startitem + In addition \LUAMETATEX\ has new prefixes: \type {\frozen}, \type + {\permanent}, \type {\immutable}, \type {\mutable}, \type {\noaligned}, + \type {\instance}, \type {\untraced}, \type {\tolerant}, \type + {\overloaded}, \type {\aliased}, \type {\immediate} and an experimental + \type {\semiprotected}, + \stopitem + \startitem + Some prefixes end up as properties of macros, some influence scanning (for instance + in alignments and when calling \LUA\ functions). There is no noticeable runtime + overhead. + \stopitem + \startitem + The \type {\meaningfull} primitive is like \type {\meaning} but also reports + properties set by prefixes; there is also \type {\meaningless}. + \stopitem +\stopitemize + +\stoptitle + +\starttitle[title=Prefixes] + +Regular definitions: + +\startitemize + \startitem + \type {\global}: defines a macro or sets a register value out of scope. + \stopitem + \startitem + \type {\outer}: is used to issue a warning when a macro defined as such was + used nested (just ignored in \LUAMETATEX). + \stopitem + \startitem + \type {\long}: triggers a warning when an argument of a macro contains a + \type {\par} equivalent (just ignored in \LUAMETATEX). + \stopitem + \startitem + \type {\protected}: makes a macro unexpandable (being itself) in an \type + {\edef} equivalent situation (where it can get out of hands). + \stopitem + \startitem + \type {\semiprotected}: is like \type {\protected} but the property is + ignored when \type {\semiexpanded} is applied. + \stopitem +\stopitemize + +Special case: + +\startitemize + \startitem + \type {\immediate}: tells a backend primitive to come into action + immediately instead of creating a delayed action (via a whatsit node). In + \LUAMETATEX\ we have no built|-|in backend so there is signals a \LUA\ + interface function this property. + \stopitem +\stopitemize + +\page + +Scanning related: + +\startitemize + \startitem + \type {\noaligned}: tags a macro as valid peek ahead macro when scanning + alignments; normally that only makes sense for \type {\protected} macros. + This permits cleaner macros in for instance table mechanisms (no + unexpected expansion side effects). + \stopitem + \startitem + \type {\untraced}: this flag makes a macro report itself as primitive in + traces which is sometimes nicer that presenting a user with some + confusing meaning. + \stopitem + \startitem + \type {\tolerant}: a prefix that makes the macro argument parser accept + all kind of new argument parsing options and continue when delimited + arguments fail. This makes macros with optional arguments produce less + noise when they are traced but more important, it makes for cleaner low + level interfaces. + \stopitem +\stopitemize + + +\page + +Overload protection (primitives are protected against overloads by default): + +\startitemize + \startitem + \type {\aliased}: create a reference (using \type {\let}) that also inherits the + properties. + \stopitem + \startitem + \type {\permanent}: sets a flag that makes a macro (or definition) immune for + redefinition. + \stopitem + \startitem + \type {\frozen}: prevents overloading but one can bypass that with some + more effort. + \stopitem + \startitem + \type {\immutable}: makes a (normally variable definition) fixed, for instance + constants. + \stopitem + \startitem + \type {\mutable}: a flag showing that this macro or definition can be used for + anything (so the macro package also has to assume that). + \stopitem + \startitem + \type {\instance}: just a flag that can be used to signal that a macro (or definition) + is an instance of a more general concept. + \stopitem + \startitem + \type {\overloaded}: bypass a frozen flag (property). + \stopitem +\stopitemize + +\blank[2*big] + +{\em Show some examples in the source code and editor.} + +\stoptitle + +\stopdocument |