summaryrefslogtreecommitdiff
path: root/doc/context/presentations/context/2021/context-2021-luametafun.tex
diff options
context:
space:
mode:
Diffstat (limited to 'doc/context/presentations/context/2021/context-2021-luametafun.tex')
-rw-r--r--doc/context/presentations/context/2021/context-2021-luametafun.tex362
1 files changed, 362 insertions, 0 deletions
diff --git a/doc/context/presentations/context/2021/context-2021-luametafun.tex b/doc/context/presentations/context/2021/context-2021-luametafun.tex
new file mode 100644
index 000000000..333c68682
--- /dev/null
+++ b/doc/context/presentations/context/2021/context-2021-luametafun.tex
@@ -0,0 +1,362 @@
+% language=us
+
+\usemodule[present-boring,abbreviations-logos]
+
+\setuptolerance[verytolerant,stretch]
+
+\startdocument
+ [title={LUAMETAFUN},
+ banner={the new interfaces},
+ location={context\enspace {\bf 2021}\enspace meeting}]
+
+\starttitle[title=Three subsystems]
+
+\startitemize
+
+\startitem
+ The core of the engine in still \TEX. It all starts there.
+\stopitem
+
+\startitem
+ The \TEX\ internals are opened up via \LUA. We can call out to \LUA\ from
+ \TEX\ and to some extend from \LUA\ to \TEX. Quite often we push back
+ something via the input channels.
+\stopitem
+
+\startitem
+ The \METAPOST\ library is accessed from \LUA. So from within \TEX\ there is
+ always \LUA\ in between. Results go back via \LUA. The library can also call
+ out to \LUA\ and from there to \TEX.
+\stopitem
+
+\startitem
+ This means that all three major components of \LUAMETATEX\ can talk to each
+ other and use each others capabilities.
+\stopitem
+
+\startitem
+ With \LUA\ in the center, we also have access to other mechanism, for instance
+ fonts, graphics and libraries.
+\stopitem
+
+\startitem
+ In \CONTEXT\ the \LUA\ language also permits using \XML, \JSON, \CSV, \SQL\
+ databases and other input that can be dealt with programmatically.
+\stopitem
+
+\startitem
+ All has been reasonably optimized for efficiency and performance.
+\stopitem
+
+\stopitemize
+
+\stoptitle
+
+\starttitle[title=The (\LUATEX) library]
+
+\startitemize
+
+\startitem
+ Turning \METAPOST\ into a library has been a subproject of the \LUATEX\ project. The
+ semi|-|official team (Taco, Jacko, Hans, Luigi) got John Hobbies blessing.
+\stopitem
+
+\startitem
+ This was a rather massive (and impressive) operation by Taco because multiple
+ number models were to be supported and the internals had to be made such that
+ different backends were possible. All with remaining perfect (DEK) compatibility.
+\stopitem
+
+\startitem
+ The \METAPOST\ library serves both the stand alone program and \LUATEX.
+\stopitem
+
+\startitem
+ That means the \POSTSCRIPT\ backend is built in plus some basic (\TYPEONE)
+ font handling. We support \PDF\ output via the \METAPOST\ \LUA\ backend (in
+ \MKII\ that is done by parsing the \POSTSCRIPT\ and specials).
+\stopitem
+
+\startitem
+ In addition there is \PNG\ and \SVG\ output. It helps that \METAPOST\ output is
+ rather simple.
+\stopitem
+
+\startitem
+ The \LUATEX\ engine uses the \LUA\ backend which represents the result in \LUA\ tables
+ resembling the \METAPOST\ internal representation.
+\stopitem
+
+\startitem
+ The library supports scaled and double (internal) but also binary and decimal
+ number models that use (linked in) libraries.
+\stopitem
+
+% this would force a page
+%
+% \startitem
+% The library is quite stable and Taco transferred maintenance to Luigi.
+% \stopitem
+
+\stopitemize
+
+\stoptitle
+
+\starttitle[title=The (\LUAMETATEX) library]
+
+\startitemize
+
+\startitem
+ We don't need the \POSTSCRIPT\ backend (which only does \TYPEONE\ anyway).
+\stopitem
+
+\startitem
+ We also have no use for \SVG\ and \PNG\ output.
+\stopitem
+
+\startitem
+ The binary number model has no advantages over the decimal one but brings
+ quite some dependency with it (library code).
+\stopitem
+
+\startitem
+ The \TYPEONE\ font support is not used in \CONTEXT\ because we handle text
+ differently.
+\stopitem
+
+\startitem
+ All this means that we can do with a smaller (simplified) \METAPOST\ library.
+\stopitem
+
+\startitem
+ The codebase has been overhauled. We still have \type {.w} files (\CWEB) but
+ use a \LUA\ script to convert that to \CCODE\ which means that we have better
+ control over how it comes out.
+\stopitem
+
+\startitem
+ As with \LUATEX\ the file \IO, message handling etc.\ now largely goes via \LUA;
+ it is more integrated.
+\stopitem
+
+\startitem
+ The same is true for scanning interfaces and return values (injectors). That also
+ made for more symbolic coding.
+\stopitem
+
+\startitem
+ Memory management (allocation) is under engine control (as with \TEX\ and \LUA);
+ we use a common high performance allocator library.
+\stopitem
+
+\stopitemize
+
+\stoptitle
+
+\starttitle[title=The (\LUAMETATEX) library]
+
+\startitemize
+
+\startitem
+ Some already present mechanism have been extended, for instance clips have
+ pre- and postscripts.
+\stopitem
+
+\startitem
+ A grouping wrapper has been added (handy for some graphic trickery supported in the
+ backend.)
+\stopitem
+
+\startitem
+ The \type {runscript} primitive supports symbolic references to functions (of course to
+ be provided at the \LUA\ end).
+\stopitem
+
+\startitem
+ The \type {runscript} return values can be more native, in addition to the already
+ present (default) \type {scantokens} support.
+\stopitem
+
+\startitem
+ Internals are extended with booleans and strings.
+\stopitem
+
+\startitem
+ Output (paths, clips etc) can be stacked in a different order.
+\stopitem
+
+\startitem
+ There are additional statistics available.
+\stopitem
+
+\startitem
+ In some places performance could be improved.
+\stopitem
+
+\startitem
+ In the meantime it can be considered a major upgrade and (for various
+ reasons) backporting to \LUATEX\ makes no sense. And yes, all errors are
+ mine.
+\stopitem
+
+\stopitemize
+
+\starttitle[title=The \LUA fication]
+
+ {\em See Taco's presentation where he gives some examples.}
+
+\stoptitle
+
+\starttitle[title=Callbacks]
+
+We need to hook in some functions: \blank[2*big]
+
+\starttabulate[|T|T|T|p|]
+ \HL
+ \NC \NC find_file \NC (name,mode,kind) \NC locate a file (usually within the \TDS\ setup) \NC \NR
+ \NC f \NC open_file \NC (name,mode,kind) \NC open given file \NC \NR
+ \NC \NC close_file \NC (handle) \NC close opened file \NC \NR
+ \NC s \NC read_file \NC (handle,size) \NC read from file \NC \NR
+ \NC \NC write_file \NC (handle,str) \NC write to file \NC \NR
+ \HL
+ \NC s \NC run_script \NC (code,size,index) \NC run the given string as \LUA\ script \NC \NR
+ \NC s \NC make_text \NC (str,size,mode) \NC process btex/etex \NC \NR
+ \HL
+ \NC \NC run_internal \NC (action,index,kind,name) \NC act on internal definition \NC \NR
+ \HL
+ \NC n \NC run_overload \NC (property,name,mode) \NC process overload check \NC \NR
+ \HL
+ \NC \NC run_logger \NC (target,str,size) \NC process log message \NC \NR
+ \NC \NC run_error \NC (message,help,interaction) \NC handle error (message) \NC \NR
+ \NC \NC run_warning \NC (message) \NC handle warning \NC \NR
+ \HL
+\stoptabulate
+
+% check_overload shipout_backend
+
+\stoptitle
+
+\starttitle[title=Two calling methods]
+
+The runner can be called as:
+
+\starttyping
+runscript("mp.MyFunction()")
+\stoptyping
+
+which implies at the \LUA\ end:
+
+\starttyping
+function mp.MyFunction()
+ ...
+end
+\stoptyping
+
+Here the callback function is responsible for loading the string and executing it.
+
+Alternatively one can say:
+
+\starttyping
+runscript <number>
+\stoptyping
+
+The number can be intercepted at the \LUA\ end to do some associated action.
+
+\stoptitle
+
+\starttitle[title=Variables]
+
+We can do:
+
+\starttyping
+lua.mp.MyFunction("foo",123,true)
+\stoptyping
+
+which in the end is equivalent to:
+
+\starttyping
+runscript("mp.MyFunction('foo',123,true)")
+\stoptyping
+
+Alternatively one can pick up values by scanning: like \type {scannext}, \type
+{scanexpression}, \type {scantoken}, \type {scansymbol}, \type {scannumeric},
+\type {scaninteger}, \type {scanboolean}, \type {scanstring}, \type {scanpair},
+\type {scancolor}, \type {scancmykcolor}, \type {scantransform}, \type
+{scanpath}, \type {scanpen}, etc.
+
+\stoptitle
+
+\starttitle[title=Return values]
+
+The runner can return:
+
+\startitemize
+
+\startitem
+ a string that gets fed into the \type {scantokens} primitive
+\stopitem
+
+\startitem
+ a numeric or boolean that gets injected as native \METAPOST\ object
+\stopitem
+
+\startitem
+ a table that gets concatenated and fed into the \type {scantokens} primitive
+\stopitem
+
+\startitem
+ \type {true} and a second argument that gets converted into a native \METAPOST\ object
+\stopitem
+
+\startitem
+ in the last case the number of table elements determines the object
+\stopitem
+
+\stopitemize
+
+Instead of returning a value one can inject: \type {injectnumeric}, \type
+{injectinteger}, \type {injectboolean}, \type {injectstring}, \type {injectpair},
+\type {injectcolor}, \type {injectcmykcolor}, \type {injecttransform}, \type
+{injectpath}, \type {injectwhatever}, etc.\ and these accept one or more values
+and|/|or tables.
+
+These mechanisms might evolve a bit over time. Lots of examples can be found in
+the \type {mlib-*.lmt} files.
+
+\stoptitle
+
+\starttitle[title=Parameters]
+
+\startitemize
+ \startitem
+ The new interfaces permit us to program quite robust parameter driven
+ interfaces that (sort of) match the way we do things at the \TEX\ end.
+ \stopitem
+ \startitem
+ The distribution has several examples of usage and more will be added.
+ \stopitem
+ \startitem
+ Macros that use the new mechanisms can be recognized by the \type {lmt_}
+ prefix.
+ \stopitem
+\stopitemize
+
+\starttyping
+lmt_mytrick [
+ somestring = "test",
+ somenumeric = 123,
+ someboolean = true,
+ somecolor = (1, 0, 1),
+ somepath = fullsquare scaled 10cm,
+ somelist = { (0, 0), (1, 3), (8, 9) },
+ sometable = [
+ somenumeric = 321,
+ ],
+] ;
+\stoptyping
+
+{\em Show the pattern of defining these at the \LUA\ end and in \METAPOST\ files.}
+
+\stoptitle
+
+\stopdocument