[NTG-context] \ctxlua and \startluacode ... \stopluacode
taco at elvenkind.com
Tue Oct 15 10:04:43 CEST 2019
> On 15 Oct 2019, at 00:50, Rudolf Bahr <quasi at quasi.de> wrote:
> Now to your suggestion not to use "assert ()". Indeed it's a solution! My program
> works! I append again its output (again just for fun!). Did you really try it or
> has it been just an idea?
First, let me say that embedded lua versions are typically a little bit different
from standalone. Just how much different depends on the embedding program. Luatex
is actually pretty close to standalone lua. Luatex adds a bunch of extension libraries,
but it changes very little of the core language. And all those changes are documented
in the luatex manual. None of those changes affect your minimal example, except
that lua errors are handled a little differently.
Note that standalone lua *also* produces an error, as that is what assert() is
supposed to do. And when lua runs into an error, it ignores the rest of the current
“... whenever an error occurs, Lua ends the current chunk and returns
to the application.” (from lua.org)
Standalone lua typically sees only one chunk (the file you pass on the command
line) but embedded lua implementation often see (sometimes many) more chunks.
In luatex’s case, each \directlua is a separate chunk (in ConTeXt, that means every
\startluacode block and every \ctxlua call is a separate chunk).
The only unusual thing here is that standalone lua silently quits and returns a
non-zero exit code to the shell, whereas luatex gives you the typical TeX-style
error prompt. The rationale for that is: lua errors can happen in many places in
your input file, and if they were silently ignored, your typeset pages could be
wrong without you realising it.
And to answer your question above: I did not have to try or guess. I know about
how assert() works because it is documented in the lua manual (and as it closely
mimics the assert() C function, that is easy for me to remember).
More information about the ntg-context