# [NTG-context] \ctxlua and \startluacode ... \stopluacode

Rudolf Bahr quasi at quasi.de
Wed Oct 16 09:03:13 CEST 2019

```On Tue, Oct 15, 2019 at 10:15:34AM +0200, Hans Hagen wrote:
> On 10/15/2019 10:04 AM, Taco Hoekwater wrote:
> > Hi Rudolf,
> >
> > > 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
> > chunk:
> >
> >    “... 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).
> as you say, it's all normal lua behaviour:
>
> if you do:
>
>   print(io.open("crap.crap"))
>
> one gets
>
>   nil	crap.crap: No such file or directory	2
>
> and i think that assert then returns the second returned argument
>
> but if one does
>
>   context(io.open("crap.crap") and "yes" or "no")
>
> then the first argument is checked against
>
> Hans

Hi Hans, hi Taco!

For your answers and patient explanations I want to thank you, not to forget
[1], [2], [3] for instance! Now it gets clearer to me what the distinctive
features could be which one can encounter when using a combination of even so
wunderful programming languages as ConTeXt and Lua are!

Best wishes,

Rudolf

[1] https://wiki.contextgarden.net/Programming_in_LuaTeX
[2] http://www.luatex.org/svn/trunk/manual/luatex.pdf