% $Id: manual.tex,v 1.43 2000/09/18 19:41:16 roberto Exp roberto $

\documentclass[11pt]{article}
\usepackage{fullpage,bnf}
\usepackage{graphicx}
%\usepackage{times}

\catcode`\_=12

\newcommand{\See}[1]{Section~\ref{#1}}
\newcommand{\see}[1]{(see \See{#1})}
\newcommand{\M}[1]{\rm\emph{#1}}
\newcommand{\T}[1]{{\tt #1}}
\newcommand{\Math}[1]{$#1$}
\newcommand{\nil}{{\bf nil}}
\def\tecgraf{{\sf TeC\kern-.21em\lower.7ex\hbox{Graf}}}

\newcommand{\Index}[1]{#1\index{#1}}
\newcommand{\IndexVerb}[1]{\T{#1}\index{#1}}
\newcommand{\IndexEmph}[1]{\emph{#1}\index{#1}}
\newcommand{\Def}[1]{\emph{#1}\index{#1}}
\newcommand{\Deffunc}[1]{\index{#1}}

\newcommand{\Tochange}[1]{(#1 may change in the final 4.0 version.)}

\newcommand{\ff}{$\bullet$\ }

\newcommand{\Version}{4.0}

% LHF
\renewcommand{\ter}[1]{{\rm`{\tt#1}'}}
\newcommand{\Nter}[1]{{\rm{\tt#1}}}
\newcommand{\NOTE}{\par\medskip\noindent\emph{NOTE}: }

\makeindex

\begin{document}

%{===============================================================
\thispagestyle{empty}
\pagestyle{empty}

{
\parindent=0pt
\vglue1.5in
{\LARGE\bf
The Programming Language Lua}
\hfill
\vskip4pt \hrule height 4pt width \hsize \vskip4pt
\hfill
Reference Manual for Lua version \Version
\\
\null
\hfill
Last revised on \today
\\
\vfill
\centering
\includegraphics[width=0.7\textwidth]{nolabel.ps}
\vfill
\vskip4pt \hrule height 2pt width \hsize
}

\newpage
\begin{quotation}
\parskip=10pt
\footnotesize
\null\vfill

\noindent
Copyright \copyright\ 1994--2000 TeCGraf, PUC-Rio.  All rights reserved.

\noindent
Permission is hereby granted, without written agreement and without license
or royalty fees, to use, copy, modify, translate, and distribute
this software and its documentation (hereby called the "package")
for any purpose, including commercial applications, subject to
the following conditions:
\begin{itemize}
\item The above copyright notice and this permission notice shall appear in all
   copies or substantial portions of this package.

\item The origin of this package must not be misrepresented; you must not
   claim that you wrote the original package. If you use this package in a
   product, an acknowledgment in the product documentation would be greatly
   appreciated (but it is not required).

\item Altered source versions must be plainly marked as such, and must not be
   misrepresented as being the original package.
\end{itemize}
The authors specifically disclaim any warranties, including, but not limited
to, the implied warranties of merchantability and fitness for a particular
purpose.  The package provided hereunder is on an ``as is'' basis, and the
authors have no obligation to provide maintenance, support, updates,
enhancements, or modifications.  In no event shall TeCGraf, PUC-Rio, or the
authors be held liable to any party for direct, indirect, special,
incidental, or consequential damages arising out of the use of this package
and its documentation.

\noindent
The Lua language and this implementation have been entirely designed and
written by Waldemar Celes, Roberto Ierusalimschy and Luiz Henrique de
Figueiredo at TeCGraf, PUC-Rio.

\noindent
This implementation contains no third-party code.

\noindent
Copies of this manual can be obtained at
\verb|http://www.tecgraf.puc-rio.br/lua/|.

\bigskip
\noindent
The Lua logo was designed by A. Nakonechny.
Copyright \copyright\ 1998.  All rights reserved.
\end{quotation}
%}===============================================================
\newpage

\title{\Large\bf Reference Manual of the Programming Language Lua \Version}

\author{%
Roberto Ierusalimschy\quad
Luiz Henrique de Figueiredo\quad
Waldemar Celes
\vspace{1.0ex}\\
\smallskip
\small\tt lua@tecgraf.puc-rio.br
\vspace{2.0ex}\\
%MCC 08/95 ---
\tecgraf\ --- Computer Science Department --- PUC-Rio
}

\date{{\small \tt\$Date: 2000/09/18 19:41:16 $ $}}

\maketitle

\pagestyle{plain}
\pagenumbering{roman}

%\thispagestyle{empty}
%\pagestyle{empty}

\begin{abstract}
\noindent
Lua is a powerful, light-weight programming language
designed for extending applications.
Lua is also frequently used as a general-purpose, stand-alone language.
Lua combines simple procedural syntax
(similar to Pascal)
with
powerful data description constructs
based on associative arrays and extensible semantics.
Lua is
dynamically typed,
interpreted from bytecodes,
and has automatic memory management with garbage collection,
making it ideal for
configuration,
scripting,
and
rapid prototyping.

This document describes version \Version\ of the Lua programming language
and the Application Program Interface (API)
that allows interaction between Lua programs and their host C~programs.
\end{abstract}

\def\abstractname{Resumo}
\begin{abstract}
\noindent
Lua \'e uma linguagem de programa\c{c}\~ao
poderosa e leve,
projetada para estender aplica\c{c}\~oes.
Lua tamb\'em \'e frequentemente usada como uma linguagem de prop\'osito geral.
Lua combina programa\c{c}\~ao procedural
(com sintaxe semelhante \`a de Pascal)
com
poderosas constru\c{c}\~oes para descri\c{c}\~ao de dados,
baseadas em tabelas associativas e sem\^antica extens\'\i vel.
Lua \'e
tipada dinamicamente,
interpretada a partir de \emph{bytecodes},
e tem gerenciamento autom\'atico de mem\'oria com coleta de lixo.
Essas caracter\'{\i}sticas fazem de Lua uma linguagem ideal para
configura\c{c}\~ao,
automa\c{c}\~ao (\emph{scripting})
e prototipagem r\'apida.

Este documento descreve a vers\~ao \Version\ da linguagem de
programa\c{c}\~ao Lua e a Interface de Programa\c{c}\~ao (API) que permite
a intera\c{c}\~ao entre programas Lua e programas C~hospedeiros.
\end{abstract}

\newpage
\null
\newpage
\tableofcontents

\newpage
\setcounter{page}{1}
\pagenumbering{arabic}
\pagestyle{plain}


\section{Introduction}

Lua is an extension programming language designed to support
general procedural programming with data description
facilities.
Lua is intended to be used as a powerful, light-weight
configuration language for any program that needs one.

Lua is implemented as a library, written in C.
Being an extension language, Lua has no notion of a ``main'' program:
it only works \emph{embedded} in a host client,
called the \emph{embedding} program.
This host program can invoke functions to execute a piece of
code in Lua, can write and read Lua variables,
and can register C~functions to be called by Lua code.
Through the use of C~functions, Lua can be augmented to cope with
a wide range of different domains,
thus creating customized programming languages sharing a syntactical framework.

Lua is free-distribution software,
and is provided as usual with no guarantees,
as stated in its copyright notice.
The implementation described in this manual is available
at the following URL's:
\begin{verbatim}
       http://www.tecgraf.puc-rio.br/lua/
       ftp://ftp.tecgraf.puc-rio.br/pub/lua/
\end{verbatim}

Like any other reference manual,
this document is dry in places.
For a discussion of the decisions behind the design of Lua,
see the papers below,
which are available at the web site above.
\begin{itemize}
\item
R.~Ierusalimschy, L.~H.~de Figueiredo, and W.~Celes.
Lua---an extensible extension language.
\emph{Software: Practice \& Experience} {\bf 26} \#6 (1996) 635--652.
\item
L.~H.~de Figueiredo, R.~Ierusalimschy, and W.~Celes.
The design and implementation of a language for extending applications.
\emph{Proceedings of XXI Brazilian Seminar on Software and Hardware} (1994) 273--283.
\item
L.~H.~de Figueiredo, R.~Ierusalimschy, and W.~Celes.
Lua: an extensible embedded language.
\emph{Dr. Dobb's Journal} {\bf  21} \#12 (Dec 1996) 26--33.
\end{itemize}

\section{Environment and Chunks}

All statements in Lua are executed in a \Def{global environment}.
This environment is initialized with a call from the embedding program to
\verb|lua_open| and
persists until a call to \verb|lua_close|,
or the end of the embedding program.
If necessary,
the host programmer can create multiple independent global
environments, and freely switch between them \see{mangstate}.

The global environment can be manipulated by Lua code or
by the embedding program,
which can read and write global variables
using API functions from the library that implements Lua.

\Index{Global variables} in Lua do not need to be declared.
Any variable is assumed to be global unless explicitly declared local
\see{localvar}.
Before the first assignment, the value of a global variable is \nil;
this default can be changed \see{tag-method}.
A table is used to keep all global names and values
(tables are explained in \See{TypesSec}).

The unit of execution of Lua is called a \Def{chunk}.
A chunk is simply a sequence of statements,
which are executed sequentially.
Each statement can be optionally followed by a semicolon:
\begin{Produc}
\produc{chunk}{\rep{stat \opt{\ter{;}}}}
\end{Produc}%
Statements are described in \See{stats}.
(The notation above is the usual extended BNF,
in which
\rep{\emph{a}} means 0 or more \emph{a}'s,
\opt{\emph{a}} means an optional \emph{a}, and
\oneormore{\emph{a}} means one or more \emph{a}'s.
The complete syntax of Lua is given on page~\pageref{BNF}.)

A chunk may be stored in a file or in a string inside the host program.
When a chunk is executed, first it is pre-compiled into bytecodes for
a virtual machine, and then the statements are executed in sequential order.
All modifications a chunk effects on the global environment persist
after the chunk ends.

Chunks may also be pre-compiled into binary form;
see program \IndexVerb{luac} for details.
Text files with chunks and their binary pre-compiled forms
are interchangeable.
Lua automatically detects the file type and acts accordingly.
\index{pre-compilation}

\section{\Index{Types and Tags}} \label{TypesSec}

Lua is a \emph{dynamically typed language}.
This means that
variables do not have types; only values do.
Therefore, there are no type definitions in the language.
All values carry their own type.
Besides a type, all values also have a \IndexEmph{tag}.

There are six \Index{basic types} in Lua: \Def{nil}, \Def{number},
\Def{string}, \Def{function}, \Def{userdata}, and \Def{table}.
\emph{Nil} is the type of the value \nil,
whose main property is to be different from any other value.
\emph{Number} represents real (double-precision floating-point) numbers,
while \emph{string} has the usual meaning.
\index{eight-bit clean}
Lua is 8-bit clean,
and so strings may contain any 8-bit character,
\emph{including} embedded zeros (\verb|'\0'|) \see{lexical}.
The \verb|type| function returns a string describing the type
of a given value \see{pdf-type}.

Functions are considered \emph{first-class values} in Lua.
This means that functions can be stored in variables,
passed as arguments to other functions, and returned as results.
Lua can call (and manipulate) functions written in Lua and
functions written in C.
The kinds of functions can be distinguished by their tags:
all Lua functions have the same tag,
and all C~functions have the same tag,
which is different from the tag of Lua functions.
The \verb|tag| function returns the tag
of a given value \see{pdf-tag}.

The type \emph{userdata} is provided to allow
arbitrary \Index{C pointers} to be stored in Lua variables.
This type corresponds to a \verb|void*|
and has no pre-defined operations in Lua,
except for assignment and equality test.
However, by using \emph{tag methods},
the programmer can define operations for \emph{userdata} values
\see{tag-method}.

The type \emph{table} implements \Index{associative arrays},
that is, \Index{arrays} that can be indexed not only with numbers,
but with any value (except \nil).
Therefore, this type may be used not only to represent ordinary arrays,
but also symbol tables, sets, records, etc.
Tables are the main data structuring mechanism in Lua.
To represent \Index{records}, Lua uses the field name as an index.
The language supports this representation by
providing \verb|a.name| as syntactic sugar for \verb|a["name"]|.
Tables may also carry \emph{methods}:
Because functions are first class values,
table fields may contain functions.
The form \verb|t:f(x)| is syntactic sugar for \verb|t.f(t,x)|,
which calls the method \verb|f| from the table \verb|t| passing
the table itself as the first parameter \see{func-def}.

Note that tables are \emph{objects}, and not values.
Variables do not contain tables, only \emph{references} to them.
Assignment, parameter passing, and returns always manipulate references
to tables, and do not imply any kind of copy.
Moreover, tables must be explicitly created before used
\see{tableconstructor}.

Each of the types \M{nil}, \M{number}, and \M{string} has a different tag.
All values of each of these types have the same pre-defined tag.
Values of type \M{function} can have two different tags,
depending on whether they are Lua functions or C~functions.
Finally,
values of type \M{userdata} and \M{table} can have variable tags,
assigned by the programmer \see{tag-method}.
The function \verb|tag| returns the tag of a given value.
User tags are created with the function \verb|newtag|,
The function \verb|settag| \see{pdf-newtag}
is used to change the tag of a table.
The data of userdata can only be set from~C.

Tags are mainly used to select \emph{tag methods} when
some events occur.
Tag methods are the main mechanism for extending the
semantics of Lua \see{tag-method}.

\section{The Language}

This section describes the lexis, the syntax, and the semantics of Lua.


\subsection{Lexical Conventions} \label{lexical}

\IndexEmph{Identifiers} in Lua can be any string of letters,
digits, and underscores,
not beginning with a digit.
This coincides with the definition of identifiers in most languages,
except that
the definition of letter depends on the current locale:
Any character considered alphabetic by the current locale
can be used in an identifier.
The following words are \emph{reserved}, and cannot be used as identifiers:
\index{reserved words}
\begin{verbatim}
       and       break     do        else      elseif
       end       for       function  if        in
       local     nil       not       or        repeat
       return    then      until     while
\end{verbatim}

Lua is a case-sensitive language:
\T{and} is a reserved word, but \T{And} and \T{\'and}
(if the locale permits) are two different, valid identifiers.
As a convention, identifiers starting with underscore followed by
uppercase letters (such as \verb|_INPUT|)
are reserved for internal variables.

The following strings denote other \Index{tokens}:
\begin{verbatim}
       ~=    <=    >=    <     >     ==    =     +     -     *     /     %
       (     )     {     }     [     ]     ;     ,     .     ..    ...
\end{verbatim}

\IndexEmph{Literal strings}
can be delimited by matching single or double quotes,
and can contain the C-like escape sequences
`\verb|\a|' (bell),
`\verb|\b|' (backspace),
`\verb|\f|' (form feed),
`\verb|\n|' (newline),
`\verb|\r|' (carriage return),
`\verb|\t|' (horizontal tab),
`\verb|\v|' (vertical tab),
`\verb|\\|' (backslash),
`\verb|\"|' (double quote),
`\verb|\'|' (single quote),
and `\verb|\|\emph{newline}' (that is, a backslash followed by a real newline,
which  results in a newline in the string).
A character in a string may also be specified by its numerical value,
through the escape sequence `\verb|\|\emph{ddd}',
where \emph{ddd} is a sequence of up to three \emph{decimal} digits.
Strings in Lua may contain any 8-bit value, including embedded zeros,
which can be specified as `\verb|\000|'.

Literal strings can also be delimited by matching \verb|[[| \dots\ \verb|]]|.
Literals in this bracketed form may run for several lines,
may contain nested \verb|[[| \dots\ \verb|]]| pairs,
and do not interpret escape sequences.
This form is specially convenient for
writing strings that contain program pieces or
other quoted strings.
As an example, in a system using ASCII,
the following three literals are equivalent:
\begin{verbatim}
       1)   "alo\n123\""
       2)   '\97lo\10\04923"'
       3)   [[alo
            123"]]
\end{verbatim}

\IndexEmph{Comments} start anywhere outside a string with a
double hyphen (\verb|--|) and run until the end of the line.
Moreover,
the first line of a chunk is skipped if it starts with \verb|#|.
This facility allows the use of Lua as a script interpreter
in Unix systems \see{lua-sa}.

\IndexEmph{Numerical constants} may be written with an optional decimal part
and an optional decimal exponent.
Examples of valid numerical constants are
\begin{verbatim}
       3     3.0     3.1416  314.16e-2   0.31416E1
\end{verbatim}

\subsection{\Index{Coercion}} \label{coercion}

Lua provides some automatic conversions between values at run time.
Any arithmetic operation applied to a string tries to convert
that string to a number, following the usual rules.
Conversely, whenever a number is used when a string is expected,
that number is converted to a string, in a reasonable format.
The format is chosen so that
a conversion from number to string then back to number
reproduces the original number \emph{exactly}.
Thus,
the conversion does not necessarily produces nice-looking text for some numbers.
For complete control of how numbers are converted to strings,
use the \verb|format| function \see{format}.


\subsection{\Index{Adjustment}} \label{adjust}

Functions in Lua can return many values.
Because there are no type declarations,
when a function is called
the system does not know how many values the function will return,
or how many parameters it needs.
Therefore, sometimes, a list of values must be \emph{adjusted}, at run time,
to a given length.
If there are more values than are needed,
then the excess values are thrown away.
If there are less values than are needed,
then the list is extended with as many  \nil's as needed.
This adjustment occurs in multiple assignments \see{assignment}
and in function calls \see{functioncall}.


\subsection{Statements}\label{stats}

Lua supports an almost conventional set of \Index{statements},
similar to those in Pascal or C.
The conventional commands include
assignment, control structures, and procedure calls.
Non-conventional commands include table constructors
\see{tableconstructor}
and local variable declarations \see{localvar}.

\subsubsection{Blocks}
A \Index{block} is a list of statements;
syntactically, a block is equal to a chunk:
\begin{Produc}
\produc{block}{chunk}
\end{Produc}%

A block may be explicitly delimited:
\begin{Produc}
\produc{stat}{\rwd{do} block \rwd{end}}
\end{Produc}%
This is useful to control the scope of local variables \see{localvar},
and to add a \rwd{return} or \rwd{break} statement in the middle
of another block; for instance,
\begin{verbatim}
       do return end        -- return is the last statement in this block
\end{verbatim}

\subsubsection{\Index{Assignment}} \label{assignment}
Lua allows \Index{multiple assignment}.
Therefore, the syntax for assignment
defines a list of variables on the left side
and a list of expressions on the right side.
The elements in both lists are separated by commas:
\begin{Produc}
\produc{stat}{varlist1 \ter{=} explist1}
\produc{varlist1}{var \rep{\ter{,} var}}
\end{Produc}%
This statement first evaluates all values on the right side
and eventual indices on the left side,
and then makes the assignments.
So
\begin{verbatim}
       i = 3
       i, a[i] = 4, 20
\end{verbatim}
sets \verb|a[3]| to 20, but does not affect \verb|a[4]|
because the \verb|i| in \verb|a[i]| is evaluated
before it is assigned \verb|4|.

Multiple assignment can be used to exchange two values, as in
\begin{verbatim}
       x, y = y, x
\end{verbatim}

The two lists in a multiple assignment may have different lengths.
Before the assignment, the list of values is adjusted to
the length of the list of variables \see{adjust}.

A single name can denote a global variable, a local variable,
or a formal parameter:
\begin{Produc}
\produc{var}{name}
\end{Produc}%
Square brackets are used to index a table:
\begin{Produc}
\produc{var}{varorfunc \ter{[} exp1 \ter{]}}
\produc{varorfunc}{var \Or functioncall}
\end{Produc}%
The \M{varorfunc} should result in a table value,
from where the field indexed by the expression \M{exp1}
value gets the assigned value.

The syntax \verb|var.NAME| is just syntactic sugar for
\verb|var["NAME"]|:
\begin{Produc}
\produc{var}{varorfunc \ter{.} name}
\end{Produc}%

The meaning of assignments and evaluations of global variables and
indexed variables can be changed by tag methods \see{tag-method}.
Actually,
an assignment \verb|x = val|, where \verb|x| is a global variable,
is equivalent to a call \verb|setglobal("x", val)|;
an assignment \verb|t[i] = val| is equivalent to
\verb|settable_event(t,i,val)|.
See \See{tag-method} for a complete description of these functions.
(The function \verb|setglobal| is defined in the basic library.
The function \T{settable\_event} is used only for explanatory purposes.)

\subsubsection{Control Structures}
The control structures
\index{while-do}\index{repeat-until}\index{if-then-else}%
\T{if}, \T{while}, and \T{repeat} have the usual meaning and
familiar syntax:
\begin{Produc}
\produc{stat}{\rwd{while} exp1 \rwd{do} block \rwd{end}}
\produc{stat}{\rwd{repeat} block \rwd{until} exp1}
\produc{stat}{\rwd{if} exp1 \rwd{then} block
  \rep{\rwd{elseif} exp1 \rwd{then} block}
   \opt{\rwd{else} block} \rwd{end}}
\end{Produc}%
The \Index{condition expression} \M{exp1} of a control structure may return any value.
All values different from \nil\ are considered true;
only \nil\ is considered false.

\index{return}
The \rwd{return} statement is used to return values
from a function or from a chunk.
\label{return}
Because functions or chunks may return more than one value,
the syntax for a \Index{return statement} is
\begin{Produc}
\produc{stat}{\rwd{return} \opt{explist1}}
\end{Produc}%

\index{break}
The \rwd{break} statement can be used to terminate the execution of a loop,
skipping to the next statement after the loop:
\begin{Produc}
\produc{stat}{\rwd{break}}
\end{Produc}%
A \rwd{break} ends the innermost enclosing loop
(while, repeat, or for).

\NOTE
For syntactic reasons, \rwd{return} and \rwd{break}
statements can only be written as the last statements of a block.

\subsubsection{For Statement} \label{for}\index{for}

The \rwd{for} statement has two forms,
one for numbers and one for tables.

The numerical \rwd{for} loop has the following syntax:
\begin{Produc}
\produc{stat}{\rwd{for} name \ter{=} exp1 \ter{,} exp1 \opt{\ter{,} exp1}
                    \rwd{do} block \rwd{end}}
\end{Produc}%
A \rwd{for} statement like
\begin{verbatim}
       for var = e1 ,e2, e3 do block end
\end{verbatim}
is equivalent to the code:
\begin{verbatim}
       do
         local var, _limit, _step = tonumber(e1), tonumber(e2), tonumber(e3)
         if not (var and _limit and _step) then error() end
         while (_step>0 and var<=_limit) or (_step<=0 and var>=_limit) do
           block
           var = var+_step
         end
       end
\end{verbatim}
Note the following:
\begin{itemize}\itemsep=0pt
\item \verb|_limit| and \verb|_step| are invisible variables.
The names are here for explanatory purposes only.
\item The behavior is \emph{undefined} if you assign to \verb|var| inside
the block.
\item If the third expression (the step) is absent, then a step of 1 is used.
\item Both the limit and the step are evaluated only once,
before the loop starts.
\item The variable \verb|var| is local to the statement;
you cannot use its value after the \rwd{for} ends.
\item You can use \rwd{break} to exit a \rwd{for}.
If you need the value of the index,
assign it to another variable before breaking.
\end{itemize}

The table \rwd{for} statement traverses all pairs
(index,value) of a given table.
It has the following syntax:
\begin{Produc}
\produc{stat}{\rwd{for} name \ter{,} name \rwd{in} exp1
                    \rwd{do} block \rwd{end}}
\end{Produc}%
A \rwd{for} statement like
\begin{verbatim}
       for index, value in exp do block end
\end{verbatim}
is equivalent to the code:
\begin{verbatim}
       do
         local _t = exp
         local index, value = next(t, nil)
         while index do
           block
           index, value = next(t, index)
         end
       end
\end{verbatim}
Note the following:
\begin{itemize}\itemsep=0pt
\item \verb|_t| is an invisible variable.
The name is here for explanatory purposes only.
\item The behavior is \emph{undefined} if you assign to \verb|index| inside
the block.
\item The behavior is \emph{undefined} if you change
the table \verb|_t| during the traversal.
\item The variables \verb|index| and \verb|value| are local to the statement;
you cannot use their values after the \rwd{for} ends.
\item You can use \rwd{break} to exit a \rwd{for}.
If you need the value of \verb|index| or \verb|value|,
assign them to other variables before breaking.
\item The order that table elements are traversed is undefined,
\emph{even for numerical indices}.
If you want to traverse indices in numerical order,
use a numerical \rwd{for}.
\end{itemize}


\subsubsection{Function Calls as Statements} \label{funcstat}
Because of possible side-effects,
function calls can be executed as statements:
\begin{Produc}
\produc{stat}{functioncall}
\end{Produc}%
In this case, all returned values are thrown away.
Function calls are explained in \See{functioncall}.

\subsubsection{Local Declarations} \label{localvar}
\Index{Local variables} may be declared anywhere inside a block.
The declaration may include an initial assignment:
\begin{Produc}
\produc{stat}{\rwd{local} declist \opt{init}}
\produc{declist}{name \rep{\ter{,} name}}
\produc{init}{\ter{=} explist1}
\end{Produc}%
If present, an initial assignment has the same semantics
of a multiple assignment.
Otherwise, all variables are initialized with \nil.

A chunk is also a block,
so local variables can be declared outside any explicit block.

The scope of local variables begins \emph{after}
the declaration and lasts until the end of the block.
Thus, the code
\verb|local print=print|
creates a local variable called \verb|print| whose
initial value is that of the \emph{global} variable of the same name.


\subsection{\Index{Expressions}}

\subsubsection{\Index{Basic Expressions}}
The basic expressions in Lua are
\begin{Produc}
\produc{exp}{\ter{(} exp \ter{)}}
\produc{exp}{\rwd{nil}}
\produc{exp}{number}
\produc{exp}{literal}
\produc{exp}{function}
\produc{exp}{var}
\produc{exp}{upvalue}
\produc{exp}{functioncall}
\produc{exp}{tableconstructor}
\end{Produc}%

Numbers (numerical constants) and
literal strings are explained in \See{lexical};
variables are explained in \See{assignment};
upvalues are explained in \See{upvalue};
function definitions (\M{function}) are explained in \See{func-def};
function calls are explained in \See{functioncall}.
Table constructors are explained in \See{tableconstructor}.

An access to a global variable \verb|x| is equivalent to a
call \verb|getglobal("x")|;
an access to an indexed variable \verb|t[i]| is equivalent to
a call \verb|gettable_event(t,i)|.
See \See{tag-method} for a description of these functions.
(Function \verb|getglobal| is defined in the basic library.
Function \T{gettable\_event} is used only for explanatory purposes.)

The non-terminal \M{exp1} is used to indicate that the values
returned by an expression must be adjusted to one single value:
\begin{Produc}
\produc{exp1}{exp}
\end{Produc}%

\subsubsection{Arithmetic Operators}
Lua supports the usual \Index{arithmetic operators}:
the binary \verb|+| (addition),
\verb|-| (subtraction), \verb|*| (multiplication),
\verb|/| (division), and \verb|^| (exponentiation);
and unary \verb|-| (negation).
If the operands are numbers, or strings that can be converted to
numbers (according to the rules given in \See{coercion}),
then all operations except exponentiation have the usual meaning.
Otherwise, an appropriate tag method is called \see{tag-method}.
An exponentiation always calls a tag method.
The standard mathematical library redefines this method for numbers,
giving the expected meaning to \Index{exponentiation}
\see{mathlib}.

\subsubsection{Relational Operators}
The \Index{relational operators} in Lua are
\begin{verbatim}
       ==    ~=    <     >     <=    >=
\end{verbatim}
These operators return \nil\ as false and a value different from \nil\ as true.

Equality (\verb|==|) first compares the tags of its operands.
If they are different, then the result is \nil.
Otherwise, their values are compared.
Numbers and strings are compared in the usual way.
Tables, userdata, and functions are compared by reference,
that is, two tables are considered equal only if they are the \emph{same} table.
The operator \verb|~=| is exactly the negation of equality (\verb|==|).

\NOTE
The conversion rules of \See{coercion}
\emph{do not} apply to equality comparisons.
Thus, \verb|"0"==0| evaluates to \emph{false},
and \verb|t[0]| and \verb|t["0"]| denote different
entries in a table.
\medskip

The order operators work as follows.
If both arguments are numbers, then they are compared as such.
Otherwise, if both arguments are strings,
then their values are compared using lexicographical order.
Otherwise, the ``lt'' tag method is called \see{tag-method}.

\subsubsection{Logical Operators}
The \Index{logical operators} in Lua are
\index{and}\index{or}\index{not}
\begin{verbatim}
       and   or    not
\end{verbatim}
Like the control structures, all logical operators
consider \nil\ as false and anything else as true.

The conjunction operator \verb|and| returns \nil\ if its first argument is \nil;
otherwise, it returns its second argument.
The disjunction operator \verb|or| returns its first argument
if it is different from \nil;
otherwise, it returns its second argument.
Both \verb|and| and \verb|or| use \Index{short-cut evaluation},
that is,
the second operand is evaluated only when necessary.

There are two useful Lua idioms that use logical operators.
The first idiom is
\begin{verbatim}
       x = x or v
\end{verbatim}
which is equivalent to
\begin{verbatim}
       if x == nil then x = v end
\end{verbatim}
This idiom sets \verb|x| to a default value \verb|v| when \verb|x| is not set.

The second idiom is
\begin{verbatim}
       x = a and b or c
\end{verbatim}
which should be read as \verb|x = a and (b or c)|.
This idiom is equivalent to
\begin{verbatim}
       if a then x = b else x = c end
\end{verbatim}
provided that \verb|b| is not \nil.

\subsubsection{Concatenation} \label{concat}
The string \Index{concatenation} operator in Lua is
denoted by two dots (`\IndexVerb{..}').
If both operands are strings or numbers, then they are converted to
strings according to the rules in \See{coercion}.
Otherwise, the ``concat'' tag method is called \see{tag-method}.

\subsubsection{Precedence}
\Index{Operator precedence} in Lua follows the table below,
from the lower to the higher priority:
\begin{verbatim}
       and   or
       <     >     <=    >=    ~=    ==
       ..
       +     -
       *     /
       not   - (unary)
       ^
\end{verbatim}
All binary operators are left associative,
except for \verb|^| (exponentiation),
which is right associative.
\NOTE
The pre-compiler may rearrange the order of evaluation of
associative operators (such as~\verb|..| or~\verb|+|),
as long as these optimizations do not change normal results.
However, these optimizations may change some results
if you define non-associative
tag methods for these operators.

\subsubsection{Table Constructors} \label{tableconstructor}
Table \Index{constructors} are expressions that create tables;
every time a constructor is evaluated, a new table is created.
Constructors can be used to create empty tables,
or to create a table and initialize some fields.
The general syntax for constructors is
\begin{Produc}
\produc{tableconstructor}{\ter{\{} fieldlist \ter{\}}}
\produc{fieldlist}{lfieldlist \Or ffieldlist \Or lfieldlist \ter{;} ffieldlist
	\Or ffieldlist \ter{;} lfieldlist}
\produc{lfieldlist}{\opt{lfieldlist1}}
\produc{ffieldlist}{\opt{ffieldlist1}}
\end{Produc}%

The form \emph{lfieldlist1} is used to initialize lists:
\begin{Produc}
\produc{lfieldlist1}{exp \rep{\ter{,} exp} \opt{\ter{,}}}
\end{Produc}%
The expressions in the list are assigned to consecutive numerical indices,
starting with 1.
For example,
\begin{verbatim}
       a = {"v1", "v2", 34}
\end{verbatim}
is equivalent to
\begin{verbatim}
       do
         local temp = {}
         temp[1] = "v1"
         temp[2] = "v2"
         temp[3] = 34
         a = temp
       end
\end{verbatim}

The form \emph{ffieldlist1} initializes other fields in a table:
\begin{Produc}
\produc{ffieldlist1}{ffield \rep{\ter{,} ffield} \opt{\ter{,}}}
\produc{ffield}{\ter{[} exp \ter{]} \ter{=} exp \Or name \ter{=} exp}
\end{Produc}%
For example,
\begin{verbatim}
       a = {[f(k)] = g(y), x = 1, y = 3, [0] = b+c}
\end{verbatim}
is equivalent to
\begin{verbatim}
       do
         local temp = {}
         temp[f(k)] = g(y)
         temp.x = 1    -- or temp["x"] = 1
         temp.y = 3    -- or temp["y"] = 3
         temp[0] = b+c
         a = temp
       end
\end{verbatim}
An expression like \verb|{x = 1, y = 4}| is
in fact syntactic sugar for \verb|{["x"] = 1, ["y"] = 4}|.

Both forms may have an optional trailing comma,
and can be used in the same constructor separated by
a semi-colon.
For example, all forms below are correct.
\begin{verbatim}
       x = {;}
       x = {"a", "b",}
       x = {type="list"; "a", "b"}
       x = {f(0), f(1), f(2),; n=3,}
\end{verbatim}

\subsubsection{Function Calls}  \label{functioncall}
A \Index{function call} in Lua has the following syntax:
\begin{Produc}
\produc{functioncall}{varorfunc args}
\end{Produc}%
First, \M{varorfunc} is evaluated.
If its value has type \emph{function},
then this function is called,
with the given arguments.
Otherwise, the ``function'' tag method is called,
having as first parameter the value of \M{varorfunc},
and then the original call arguments.

The form
\begin{Produc}
\produc{functioncall}{varorfunc \ter{:} name args}
\end{Produc}%
can be used to call ``methods''.
A call \verb|v:name(...)|
is syntactic sugar for \verb|v.name(v, ...)|,
except that \verb|v| is evaluated only once.

Arguments have the following syntax:
\begin{Produc}
\produc{args}{\ter{(} \opt{explist1} \ter{)}}
\produc{args}{tableconstructor}
\produc{args}{\Nter{literal}}
\produc{explist1}{\rep{exp1 \ter{,}} exp}
\end{Produc}%
All argument expressions are evaluated before the call.
A call of the form \verb|f{...}| is syntactic sugar for
\verb|f({...})|, that is,
the parameter list is a single new table.
A call of the form \verb|f'...'|
(or \verb|f"..."| or \verb|f[[...]]|) is syntactic sugar for
\verb|f('...')|, that is,
the parameter list is a single literal string.

Because a function can return any number of results
\see{return},
the number of results must be adjusted before they are used.
If the function is called as a statement \see{funcstat},
then its return list is adjusted to~0,
thus discarding all returned values.
If the function is called in a place that needs a single value
(syntactically denoted by the non-terminal \M{exp1}),
then its return list is adjusted to~1,
thus discarding all returned values but the first one.
If the function is called in a place that can hold many values
(syntactically denoted by the non-terminal \M{exp}),
then no adjustment is made.
The only places that can hold many values
is the last (or the only) expression in an assignment,
in an argument list, or in a return statement.
Here are some examples:
\begin{verbatim}
       f();               -- adjusted to 0 results
       g(f(), x);         -- f() is adjusted to 1 result
       g(x, f());         -- g gets x plus all values returned by f()
       a,b,c = f(), x;    -- f() is adjusted to 1 result (and c gets nil)
       a,b,c = x, f();    -- f() is adjusted to 2
       a,b,c = f();       -- f() is adjusted to 3
       return f();        -- returns all values returned by f()
       return x,y,f();    -- returns a, b, and all values returned by f()
\end{verbatim}

\subsubsection{\Index{Function Definitions}} \label{func-def}

The syntax for function definition is
\begin{Produc}
\produc{function}{\rwd{function} \ter{(} \opt{parlist1} \ter{)}
  block \rwd{end}}
\produc{stat}{\rwd{function} funcname \ter{(} \opt{parlist1} \ter{)}
  block \rwd{end}}
\produc{funcname}{name \Or name \ter{.} name \Or name \ter{:} name}
\end{Produc}%
The statement
\begin{verbatim}
       function f () ...  end
\end{verbatim}
is just syntactic sugar for
\begin{verbatim}
       f = function () ...  end
\end{verbatim}
and the statement
\begin{verbatim}
       function v.f () ...  end
\end{verbatim}
is syntactic sugar for
\begin{verbatim}
       v.f = function () ...  end
\end{verbatim}

A function definition is an executable expression,
whose value has type \emph{function}.
When Lua pre-compiles a chunk,
all its function bodies are pre-compiled too.
Then, whenever Lua executes the function definition,
its upvalues are fixed \see{upvalue},
and the function is \emph{instantiated} (or \emph{closed}).
This function instance (or \emph{closure})
is the final value of the expression.
Different instances of the same function
may have different upvalues.

Parameters act as local variables,
initialized with the argument values:
\begin{Produc}
\produc{parlist1}{\ter{\ldots}}
\produc{parlist1}{name \rep{\ter{,} name} \opt{\ter{,} \ter{\ldots}}}
\end{Produc}%
\label{vararg}
When a function is called,
the list of \Index{arguments} is adjusted to
the length of the list of parameters \see{adjust},
unless the function is a \Def{vararg} function,
which is
indicated by three dots (`\verb|...|') at the end of its parameter list.
A vararg function does not adjust its argument list;
instead, it collects all extra arguments into an implicit parameter,
called \IndexVerb{arg}.
The value of \verb|arg| is a table,
with a field~\verb|n| whose value is the number of extra arguments,
and the extra arguments at positions 1,~2,~\ldots,\M{n}.

As an example, consider the following definitions:
\begin{verbatim}
       function f(a, b) end
       function g(a, b, ...) end
       function r() return 1,2,3 end
\end{verbatim}
Then, we have the following mapping from arguments to parameters:
\begin{verbatim}
       CALL            PARAMETERS

       f(3)             a=3, b=nil
       f(3, 4)          a=3, b=4
       f(3, 4, 5)       a=3, b=4
       f(r(), 10)       a=1, b=10
       f(r())           a=1, b=2

       g(3)             a=3, b=nil, arg={n=0}
       g(3, 4)          a=3, b=4, arg={n=0}
       g(3, 4, 5, 8)    a=3, b=4, arg={5, 8; n=2}
       g(5, r())        a=5, b=1, arg={2, 3; n=2}
\end{verbatim}

Results are returned using the \rwd{return} statement \see{return}.
If control reaches the end of a function
without encountering a \rwd{return} statement,
then the function returns with no results.

The syntax
\begin{Produc}
\produc{funcname}{name \ter{:} name}
\end{Produc}%
is used for defining \IndexEmph{methods},
that is, functions that have an implicit extra parameter \IndexVerb{self}:
Thus, the statement
\begin{verbatim}
       function v:f (...) ...  end
\end{verbatim}
is equivalent to
\begin{verbatim}
       v.f = function (self, ...) ...  end
\end{verbatim}
Note that the function gets an extra formal parameter called \verb|self|.
Note also that \verb|v| must have been
previously initialized with a table value.


\subsection{Visibility and Upvalues} \label{upvalue}
\index{Visibility} \index{Upvalues}

A function body may refer to its own local variables
(which include its parameters) and to global variables,
as long as they are not \emph{shadowed} by local
variables from enclosing functions.
A function \emph{cannot} access a local
variable from an enclosing function,
since such variables may no longer exist when the function is called.
However, a function may access the \emph{value} of a local variable
from an enclosing function, using \emph{upvalues},
whose syntax is
\begin{Produc}
\produc{upvalue}{\ter{\%} name}
\end{Produc}%
An upvalue is somewhat similar to a variable expression,
but whose value is \emph{frozen} when the function wherein it
appears is instantiated.
The name used in an upvalue may be the name of any variable visible
at the point where the function is defined,
that is,
global variables and local variables from the immediately enclosing function.
Note that when the upvalue is a table,
only the \emph{reference} to that table
(which is the value of the upvalue) is frozen;
the table contents can be changed at will.
Using table values as upvalues is a technique for having
writable but private state attached to functions.

Here are some examples:
\begin{verbatim}
       a,b,c = 1,2,3   -- global variables
       local d
       function f (x)
         local b = {}       -- x and b are local to f; b shadows the global b
         local g = function (a)
           local y     -- a and y are local to g
           p = a       -- OK, access local `a'
           p = c       -- OK, access global `c'
           p = b       -- ERROR: cannot access a variable in outer scope
           p = %b      -- OK, access frozen value of `b' (local to `f')
           %b = 3      -- ERROR: cannot change an upvalue
           %b.x = 3    -- OK, change the table contents
           p = %c      -- OK, access frozen value of global `c'
           p = %y      -- ERROR: `y' is not visible where `g' is defined
           p = %d      -- ERROR: `d' is not visible where `g' is defined
         end           -- g
       end             -- f
\end{verbatim}


\subsection{Error Handling} \label{error}

Because Lua is an extension language,
all Lua actions start from C~code in the host program
calling a function from the Lua library.
Whenever an error occurs during Lua compilation or execution,
the function \verb|_ERRORMESSAGE| is called \Deffunc{_ERRORMESSAGE}
(provided it is different from \nil),
and then the corresponding function from the library
(\verb|lua_dofile|, \verb|lua_dostring|,
\verb|lua_dobuffer|, or \verb|lua_callfunction|)
is terminated, returning an error condition.

Memory allocation errors are an exception to the previous rule.
When memory allocation fails, Lua may not be able to execute the
\verb|_ERRORMESSAGE| function.
So, for this kind of error, Lua does not call
the \verb|_ERRORMESSAGE| function;
instead, the corresponding function from the library
returns immediately with a special error code (\verb|LUA_ERRMEM|).
This and other error codes are defined in \verb|lua.h|.

The only argument to \verb|_ERRORMESSAGE| is a string
describing the error.
The default definition for
this function calls \verb|_ALERT|, \Deffunc{_ALERT}
which prints the message to \verb|stderr| \see{alert}.
The standard I/O library redefines \verb|_ERRORMESSAGE|
and uses the debug facilities \see{debugI}
to print some extra information,
such as a call stack traceback.

Lua code can explicitly generate an error by calling the
function \verb|error| \see{pdf-error}.
Lua code can ``catch'' an error using the function
\verb|call| \see{pdf-call}.


\subsection{Tag Methods} \label{tag-method}

Lua provides a powerful mechanism to extend its semantics,
called \Def{tag methods}.
A tag method is a programmer-defined function
that is called at specific key points during the evaluation of a program,
allowing the programmer to change the standard Lua behavior at these points.
Each of these points is called an \Def{event}.

The tag method called for any specific event is selected
according to the tag of the values involved
in the event \see{TypesSec}.
The function \IndexVerb{settagmethod} changes the tag method
associated with a given pair \M{(tag, event)}.
Its first parameter is the tag, the second parameter is the event name
(a string; see below),
and the third parameter is the new method (a function),
or \nil\ to restore the default behavior for the pair.
The \verb|settagmethod| function returns the previous tag method for that pair.
A companion function \IndexVerb{gettagmethod}
receives a tag and an event name and returns the
current method associated with the pair.

Tag methods are called in the following events,
identified by the given names.
The semantics of tag methods is better explained by a Lua function
describing the behavior of the interpreter at each event.
This function not only shows when a tag method is called,
but also its arguments, its results, and the default behavior.
The code shown here is only \emph{illustrative};
the real behavior is hard coded in the interpreter,
and it is much more efficient than this simulation.
All functions used in these descriptions
(\verb|rawget|, \verb|tonumber|, \verb|call|, etc.)
are described in \See{predefined}.

\begin{description}

\item[``add'':]\index{add event}
called when a \verb|+| operation is applied to non-numerical operands.

The function \verb|getbinmethod| below defines how Lua chooses a tag method
for a binary operation.
First, Lua tries the first operand.
If its tag does not define a tag method for the operation,
then Lua tries the second operand.
If it also fails, then it gets a tag method from tag~0.
\begin{verbatim}
       function getbinmethod (op1, op2, event)
         return gettagmethod(tag(op1), event) or
                gettagmethod(tag(op2), event) or
                gettagmethod(0, event)
       end
\end{verbatim}
Using this function,
the tag method for the ``add'' event is
\begin{verbatim}
       function add_event (op1, op2)
         local o1, o2 = tonumber(op1), tonumber(op2)
         if o1 and o2 then  -- both operands are numeric
           return o1+o2  -- '+' here is the primitive 'add'
         else  -- at least one of the operands is not numeric
           local tm = getbinmethod(op1, op2, "add")
           if tm then
             -- call the method with both operands and an extra
             -- argument with the event name
             return tm(op1, op2, "add")
           else  -- no tag method available: default behavior
             error("unexpected type at arithmetic operation")
           end
         end
       end
\end{verbatim}

\item[``sub'':]\index{sub event}
called when a \verb|-| operation is applied to non-numerical operands.
Behavior similar to the ``add'' event.

\item[``mul'':]\index{mul event}
called when a \verb|*| operation is applied to non-numerical operands.
Behavior similar to the ``add'' event.

\item[``div'':]\index{div event}
called when a \verb|/| operation is applied to non-numerical operands.
Behavior similar to the ``add'' event.

\item[``pow'':]\index{pow event}
called when a \verb|^| operation (exponentiation) is applied,
even for numerical operands.
\begin{verbatim}
       function pow_event (op1, op2)
         local tm = getbinmethod(op1, op2, "pow")
         if tm then
           -- call the method with both operands and an extra
           -- argument with the event name
           return tm(op1, op2, "pow")
         else  -- no tag method available: default behavior
           error("unexpected type at arithmetic operation")
         end
       end
\end{verbatim}

\item[``unm'':]\index{unm event}
called when a unary \verb|-| operation is applied to a non-numerical operand.
\begin{verbatim}
       function unm_event (op)
         local o = tonumber(op)
         if o then  -- operand is numeric
           return -o  -- '-' here is the primitive 'unm'
         else  -- the operand is not numeric.
           -- Try to get a tag method from the operand;
           --  if it does not have one, try a "global" one (tag 0)
           local tm = gettagmethod(tag(op), "unm") or
                      gettagmethod(0, "unm")
           if tm then
             -- call the method with the operand, nil, and an extra
             -- argument with the event name
             return tm(op, nil, "unm")
           else  -- no tag method available: default behavior
             error("unexpected type at arithmetic operation")
           end
         end
       end
\end{verbatim}

\item[``lt'':]\index{lt event}
called when an order operation is applied to non-numerical
or non-string operands.
It corresponds to the \verb|<| operator.
\begin{verbatim}
       function lt_event (op1, op2)
         if type(op1) == "number" and type(op2) == "number" then
           return op1 < op2   -- numeric comparison
         elseif type(op1) == "string" and type(op2) == "string" then
           return op1 < op2   -- lexicographic comparison
         else
           local tm = getbinmethod(op1, op2, "lt")
           if tm then
             return tm(op1, op2, "lt")
           else
             error("unexpected type at comparison");
           end
         end
       end
\end{verbatim}
The other order operators use this tag method according to the
usual equivalences:
\begin{verbatim}
       a>b    <=>  b<a
       a<=b   <=>  not (b<a)
       a>=b   <=>  not (a<b)
\end{verbatim}

\item[``concat'':]\index{concatenation event}
called when a concatenation is applied to non-string operands.
\begin{verbatim}
       function concat_event (op1, op2)
         if (type(op1) == "string" or type(op1) == "number") and
            (type(op2) == "string" or type(op2) == "number") then
           return op1..op2  -- primitive string concatenation
         else
           local tm = getbinmethod(op1, op2, "concat")
           if tm then
             return tm(op1, op2, "concat")
           else
             error("unexpected type for concatenation")
           end
         end
       end
\end{verbatim}

\item[``index'':]\index{index event}
called when Lua tries to retrieve the value of an index
not present in a table.
See the ``gettable'' event for its semantics.

\item[``getglobal'':]\index{getglobal event}
called whenever Lua needs the value of a global variable.
This method can only be set for \nil\ and for tags
created by \verb|newtag|.
Note that
the tag is that of the \emph{current value} of the global variable.
\begin{verbatim}
       function getglobal (varname)
         -- access the table of globals
         local value = rawget(globals(), varname)
         local tm = gettagmethod(tag(value), "getglobal")
         if not tm then
           return value
         else
           return tm(varname, value)
         end
       end
\end{verbatim}
The function \verb|getglobal| is defined in the basic library~\see{predefined}.

\item[``setglobal'':]\index{setglobal event}
called whenever Lua assigns to a global variable.
This method cannot be set for numbers, strings, and tables and
userdata with the default tag.
\begin{verbatim}
       function setglobal (varname, newvalue)
         local oldvalue = rawget(globals(), varname)
         local tm = gettagmethod(tag(oldvalue), "setglobal")
         if not tm then
           rawset(globals(), varname, newvalue)
         else
           tm(varname, oldvalue, newvalue)
         end
       end
\end{verbatim}
The function \verb|setglobal| is defined in the basic library~\see{predefined}.

\item[``gettable'':]\index{gettable event}
called whenever Lua accesses an indexed variable.
This method cannot be set for tables with the default tag.
\begin{verbatim}
       function gettable_event (table, index)
         local tm = gettagmethod(tag(table), "gettable")
         if tm then
           return tm(table, index)
         elseif type(table) ~= "table" then
           error("indexed expression not a table");
         else
           local v = rawget(table, index)
           tm = gettagmethod(tag(table), "index")
           if v == nil and tm then
             return tm(table, index)
           else
             return v
           end
         end
       end
\end{verbatim}

\item[``settable'':]\index{settable event}
called when Lua assigns to an indexed variable.
This method cannot be set for tables with the default tag.
\begin{verbatim}
       function settable_event (table, index, value)
         local tm = gettagmethod(tag(table), "settable")
         if tm then
           tm(table, index, value)
         elseif type(table) ~= "table" then
           error("indexed expression not a table")
         else
           rawset(table, index, value)
         end
       end
\end{verbatim}

\item[``function'':]\index{function event}
called when Lua tries to call a non-function value.
\begin{verbatim}
       function function_event (func, ...)
         if type(func) == "function" then
           return call(func, arg)
         else
           local tm = gettagmethod(tag(func), "function")
           if tm then
             for i=arg.n,1,-1 do
               arg[i+1] = arg[i]
             end
             arg.n = arg.n+1
             arg[1] = func
             return call(tm, arg)
           else
             error("call expression not a function")
           end
         end
       end
\end{verbatim}

\item[``gc'':]\index{gc event}
called when Lua is ``garbage collecting'' a userdata.
This tag method can be set only from~C,
and cannot be set for a userdata with the default tag.
For each userdata to be collected,
Lua does the equivalent of the following function:
\begin{verbatim}
       function gc_event (obj)
         local tm = gettagmethod(tag(obj), "gc")
         if tm then
           tm(obj)
         end
       end
\end{verbatim}
Moreover, at the end of a garbage collection cycle,
Lua does the equivalent of the call \verb|gc_event(nil)|.
\Tochange{This}

\end{description}




\section{The Application Program Interface}

This section describes the API for Lua, that is,
the set of C~functions available to the host program to communicate
with Lua.
All API functions and related types and constants
are declared in the header file \verb|lua.h|.

\NOTE
Even when we use the term ``function'',
any facility in the API may be provided as a \emph{macro} instead.
All such macros use each of its arguments exactly once,
and so do not generate hidden side-effects.


\subsection{States} \label{mangstate}

The Lua library is fully reentrant:
it does not have any global variable.
The whole state of the Lua interpreter
(global variables, stack, tag methods, etc.)
is stored in a dynamically allocated structure; \Deffunc{lua_State}
this state must be passed as the first argument to
every function in the library (except \verb|lua_open| below).

Before calling any API function,
you must create a state.
This is done by calling\Deffunc{lua_open}
\begin{verbatim}
       lua_State *lua_open (int stacksize);
\end{verbatim}
The sole argument to this function is the stack size for the interpreter.
(Each function call needs one stack position for each argument, local variable
and temporary values, plus one position for book-keeping.
The stack must also have some 20 extra positions available.
For very small implementations, without recursive functions,
a stack size of 100 should be enough.)
If \verb|stacksize| is zero,
then a default size is used (the default is 1024).

To release a state created with \verb|lua_open|, call
\begin{verbatim}
       void lua_close (lua_State *L);
\end{verbatim}
This function destroys all objects in the given Lua environment
(calling the corresponding garbage-collection tag methods)
and frees all dynamic memory used by that state.
Usually, you do not need to call this function,
because all resources are naturally released when your program ends.
On the other hand,
long-running programs ---
like a daemon or a web server ---
might need to release states as soon as they are not needed,
to avoid growing too big.

With the exception of \verb|lua_open|,
all functions in the API need a state as their first argument.


\subsection{The Stack and Indices}

Lua uses a \emph{stack} to pass values to and from C.
Each element in this stack represents a Lua value
(nil, number, string, etc.).

For convenience,
most query operations in the API do not follow a strict stack discipline.
Instead, they can refer to any element in the stack by using an \emph{index}:
A positive index represents an \emph{absolute} stack position
(starting at 1, not 0 as in C);
a negative index represents an \emph{offset} from the top of the stack.
More specifically, if the stack has \M{n} elements,
index 1 represents the first element
(that is, the first element pushed onto the stack),
index \M{n} represents the last element;
index \Math{-1} also represents the last element
(that is, the element at the top),
and index \Math{-n} represents the first element.
We say that an index is \emph{valid}
if it lays between 1 and the stack top
(that is, \verb|(1 <= abs(index) <= top)|).
\index{stack index} \index{valid index}

At any time, you can get the index of the top element by calling
\Deffunc{lua_gettop}
\begin{verbatim}
       int lua_gettop (lua_State *L);
\end{verbatim}
Because indices start at 1,
the result of \verb|lua_gettop| is equal to the number of elements in the stack
(0 means an empty stack).

When you interact with Lua API,
\emph{you are responsible for controlling stack overflow}.
The function \Deffunc{lua_stackspace}
\begin{verbatim}
       int lua_stackspace (lua_State *L);
\end{verbatim}
returns the number of stack positions still available.
Whenever Lua calls C, \Deffunc{LUA_MINSTACK}
it ensures that
at least \verb|LUA_MINSTACK| positions are still available.
\verb|LUA_MINSTACK| is defined in \verb|lua.h| and is at least~16,
and so you have to worry about stack space only
when your code has loops pushing elements onto the stack.

Most query functions accept as indices any value inside the
available stack space.
Such indices are called \emph{acceptable indices}.
More formally, we can define an \IndexEmph{acceptable index}
as
\begin{verbatim}
     (index < 0 && abs(index) <= top) || (index > 0 && index <= top + stackspace)
\end{verbatim}
(Note that 0 is not an acceptable index.)

\subsection{Stack Manipulation}
The API offers the following functions for basic stack manipulation:
\Deffunc{lua_settop}\Deffunc{lua_pushvalue}
\Deffunc{lua_remove}\Deffunc{lua_insert}
\begin{verbatim}
       void lua_settop    (lua_State *L, int index);
       void lua_pushvalue (lua_State *L, int index);
       void lua_remove    (lua_State *L, int index);
       void lua_insert    (lua_State *L, int index);
\end{verbatim}

\verb|lua_settop| accepts any acceptable index,
or 0,
and sets the stack top to that index.
If the new top is larger than the old one,
then the new elements are filled with \nil.
If \verb|index| is 0, then all stack elements are removed.
A useful macro defined in the API is
\begin{verbatim}
       #define lua_pop(L,n) lua_settop(L, -(n)-1)
\end{verbatim}
which pops \verb|n| elements from the stack.

\verb|lua_pushvalue| pushes onto the stack a copy of the element
at the given index.
\verb|lua_remove| removes the element at the given position,
shifting down the elements on top of that position to fill in the gap.
\verb|lua_insert| moves the top element into the given position,
shifting up the elements on top of that position to open space.
These functions accept only valid indices.
As an example, if the stack starts as \verb|10 20 30 40 50|
(from bottom to top),
then
\begin{verbatim}
       lua_pushvalue(L, 3)    --> 10 20 30 40 50 30
       lua_pushvalue(L, -1)   --> 10 20 30 40 50 30 30
       lua_remove(L, -3)      --> 10 20 30 40 30 30
       lua_remove(L,  6)      --> 10 20 30 40 30
       lua_insert(L,  1)      --> 30 10 20 30 40
       lua_insert(L, -1)      --> 30 10 20 30 40  (no effect)
       lua_settop(L, -3)      --> 30 10 20
       lua_settop(L, 6)       --> 30 10 20 nil nil nil
\end{verbatim}


\subsection{Querying the Stack}

To check the type of a stack element,
the following functions are available:
\Deffunc{lua_isnil}\Deffunc{lua_isnumber}\Deffunc{lua_isstring}
\Deffunc{lua_istable}\Deffunc{lua_iscfunction}\Deffunc{lua_isuserdata}
\Deffunc{lua_isfunction}\Deffunc{lua_type}
\begin{verbatim}
       const char *lua_type        (lua_State *L, int index);
       int         lua_tag         (lua_State *L, int index);
       int         lua_isnil       (lua_State *L, int index);
       int         lua_isnumber    (lua_State *L, int index);
       int         lua_isstring    (lua_State *L, int index);
       int         lua_istable     (lua_State *L, int index);
       int         lua_isfunction  (lua_State *L, int index);
       int         lua_iscfunction (lua_State *L, int index);
       int         lua_isuserdata  (lua_State *L, int index);
\end{verbatim}
These functions can be called with any acceptable index.

\verb|lua_type| returns one of the following strings,
describing the type of the given object:
\verb|"nil"|, \verb|"number"|, \verb|"string"|, \verb|"table"|,
\verb|"function"|, \verb|"userdata"|; or \verb|"NO VALUE"|,
if the index is non-valid (that is, if that stack position is ``empty'').

\verb|lua_tag| returns the tag of a value,
or \verb|LUA_NOTAG| for a non-valid index.
(Very dirty trick: some type names start with the same letter (Number-Nil);
others have the second letter in common (nUmber-fUnction).
However, you can use the emph{third} letter as a unique scalar
identification for each type.)

The \verb|lua_is*| functions return 1 if the object is compatible
with the given type, and 0 otherwise.
They always return 0 for a non-valid index.
\verb|lua_isnumber| accepts numbers and numerical strings,
\verb|lua_isstring| accepts strings and numbers \see{coercion},
and \verb|lua_isfunction| accepts both Lua functions and C~functions.
To distinguish between Lua functions and C~functions,
you should use \verb|lua_iscfunction|.
To distinguish between numbers and numerical strings,
you can use \verb|lua_type|.

The API also has functions to compare two values in the stack:
\begin{verbatim}
       int lua_equal    (lua_State *L, int index1, int index2);
       int lua_lessthan (lua_State *L, int index1, int index2);
\end{verbatim}
These functions are equivalent to their counterparts in Lua.
Specifically, \verb|lua_lessthan| is equivalent to the \verb|lt_event|
described in~\ref{tag-method}.
Both functions return 0 if any of the indices are non-valid.

To translate a value in the stack to a specific C~type,
you can use the following conversion functions:
\Deffunc{lua_tonumber}\Deffunc{lua_tostring}\Deffunc{lua_strlen}
\Deffunc{lua_tocfunction}\Deffunc{lua_touserdata}
\begin{verbatim}
       double         lua_tonumber    (lua_State *L, int index);
       const char    *lua_tostring    (lua_State *L, int index);
       size_t         lua_strlen      (lua_State *L, int index);
       lua_CFunction  lua_tocfunction (lua_State *L, int index);
       void          *lua_touserdata  (lua_State *L, int index);
\end{verbatim}
These functions can be called with any acceptable index.
When called with a non-valid index,
they act as if the given value had an incorrect type.

\verb|lua_tonumber| converts the value at the given index
to a floating-point number.
This value must be a number or a string convertible to number
\see{coercion}; otherwise, \verb|lua_tonumber| returns~0.

\verb|lua_tostring| converts a Lua value to a string
(\verb|const char*|).
This value must be a string or a number;
otherwise, the function returns \verb|NULL|.
This function returns a pointer to a string inside the Lua environment.
Those strings always have a 0 after their last character (like in C),
but may contain other zeros in their body.
If you do not know whether a string may contain zeros,
you should use \verb|lua_strlen| to get its actual length.
Because Lua has garbage collection,
there is no guarantee that the pointer returned by \verb|lua_tostring|
will be valid after the respective value is removed from the stack.

\verb|lua_tocfunction| converts a value in the stack to a C~function.
This value must be a C~function;
otherwise, \verb|lua_tocfunction| returns \verb|NULL|.
The type \verb|lua_CFunction| is explained in \See{LuacallC}.

\verb|lua_touserdata| converts a value to \verb|void*|.
This value must have type \emph{userdata};
otherwise, \verb|lua_touserdata| returns \verb|NULL|.



\subsection{Pushing values onto the Stack}

The API has the following functions to
push C~values onto the stack:
\Deffunc{lua_pushnumber}\Deffunc{lua_pushlstring}\Deffunc{lua_pushstring}
\Deffunc{lua_pushcfunction}\Deffunc{lua_pushusertag}
\Deffunc{lua_pushnil}\Deffunc{lua_pushuserdata}\label{pushing}
\begin{verbatim}
       void lua_pushnumber    (lua_State *L, double n);
       void lua_pushlstring   (lua_State *L, const char *s, size_t len);
       void lua_pushstring    (lua_State *L, const char *s);
       void lua_pushusertag   (lua_State *L, void *u, int tag);
       void lua_pushnil       (lua_State *L);
       void lua_pushcfunction (lua_State *L, lua_CFunction f);
\end{verbatim}
These functions receive a C~value,
convert it to a corresponding Lua value,
and push the result onto the stack.
In particular, \verb|lua_pushlstring| and \verb|lua_pushstring|
make an \emph{internal copy} of the given string.
\verb|lua_pushstring| can only be used to push proper C~strings
(that is, strings that end with a zero and do not contain embedded zeros);
otherwise you should use the more general \verb|lua_pushlstring|,
which accepts an explicit size.


\subsection{Garbage Collection}\label{GC}

A garbage collection cycle can be forced by:
\Deffunc{lua_collectgarbage}
\begin{verbatim}
       long lua_collectgarbage (lua_State *L, long limit);
\end{verbatim}
This function returns the number of objects collected.
The argument \verb|limit| makes the next cycle occur only
after that number of new objects have been created.
If \verb|limit| is 0,
then Lua uses an adaptive heuristic to set this limit.

\Tochange{This function}

\subsection{Userdata and Tags}\label{C-tags}

Because userdata are objects,
the function \verb|lua_pushusertag| may create a new userdata.
If Lua has a userdata with the given value (\verb|void*|) and tag,
then that userdata is pushed.
Otherwise, a new userdata is created, with the given value and tag.
If this function is called with
\verb|tag| equal to \verb|LUA_ANYTAG|\Deffunc{LUA_ANYTAG},
then Lua will try to find any userdata with the given value,
regardless of its tag.
If there is no userdata with that value, then a new one is created,
with tag equal to 0.

Userdata can have different tags,
whose semantics are only known to the host program.
Tags are created with the function
\Deffunc{lua_newtag}
\begin{verbatim}
       int lua_newtag (lua_State *L);
\end{verbatim}
The function \verb|lua_settag| changes the tag of
the object on top of the stack (and pops it):
\Deffunc{lua_settag}
\begin{verbatim}
       void lua_settag (lua_State *L, int tag);
\end{verbatim}
The object must be a userdata or a table;
the given \verb|tag| must be a value created with \verb|lua_newtag|.

\subsection{Executing Lua Code}
A host program can execute Lua chunks written in a file or in a string
by using the following functions:%
\Deffunc{lua_dofile}\Deffunc{lua_dostring}\Deffunc{lua_dobuffer}%
\begin{verbatim}
       int lua_dofile   (lua_State *L, const char *filename);
       int lua_dostring (lua_State *L, const char *string);
       int lua_dobuffer (lua_State *L, const char *buff,
                         size_t size, const char *name);
\end{verbatim}
These functions return
0 in case of success, or one of the following error codes if they fail
(these constants are defined in \verb|lua.h|.):
\begin{itemize}
\item \verb|LUA_ERRRUN| ---
error while running the chunk.
\item \verb|LUA_ERRSYNTAX| ---
syntax error during pre-compilation.
\item \verb|LUA_ERRMEM| ---
memory allocation error.
For such errors, Lua does not call the \verb|_ERRORMESSAGE| function
\see{error}.
\item \verb|LUA_ERRFILE| ---
error opening the file (only for \verb|lua_dofile|).
In this case,
you may want to
check \verb|errno|,
call \verb|strerror|,
or call \verb|perror| to tell the user what went wrong.
\end{itemize}

When called with argument \verb|NULL|,
\verb|lua_dofile| executes the \verb|stdin| stream.
\verb|lua_dofile| and \verb|lua_dobuffer|
are both able to execute pre-compiled chunks.
They automatically detect whether the chunk is text or binary,
and load it accordingly (see program \IndexVerb{luac}).
\verb|lua_dostring| executes only source code,
given in textual form.

The third parameter to \verb|lua_dobuffer|
is the ``name of the chunk'',
used in error messages and debug information.
If \verb|name| is \verb|NULL|,
then Lua gives a default name to the chunk.

These functions push onto the stack
any values eventually returned by the chunks.
A chunk may return any number of values;
Lua takes care that these values fit into the stack space,
but after the call the responsibility is back with you.
If you need to push other elements after calling any of these functions,
and you want to play safe,
you must either check the stack space or remove the returned elements
from the stack (if you do not need them).
For instance, the following code
loads a chunk in a file and discards all results returned by this chunk,
leaving the stack as it was before the call:
\begin{verbatim}
      {
       int oldtop = lua_gettop(L);
       lua_dofile(L, filename);
       lua_settop(L, oldtop);
      }
\end{verbatim}


\subsection{Manipulating Global Variables in Lua}

To read the value of a global Lua variable,
you call
\Deffunc{lua_getglobal}
\begin{verbatim}
       void lua_getglobal (lua_State *L, const char *varname);
\end{verbatim}
which pushes onto the stack the value of the given variable.
As in Lua, this function may trigger a tag method
for the ``getglobal'' event.
To read the real value of a global variable,
without invoking any tag method,
use the \verb|lua_rawget| function over the table of globals
(see below).

To store a value in a global variable,
you call
\Deffunc{lua_setglobal}
\begin{verbatim}
       void lua_setglobal (lua_State *L, const char *varname);
\end{verbatim}
which pops from the stack the value to be stored in the given variable.
As in Lua, this function may trigger a tag method
for the ``setglobal'' event.
To set the real value of a global variable,
without invoking any tag method,
use the \verb|lua_rawset| function over the table of globals.

All global variables are kept in an ordinary Lua table.
You can get this table calling
\Deffunc{lua_getglobals}
\begin{verbatim}
       void lua_getglobals (lua_State *L);
\end{verbatim}
which pushes the current table of globals onto the stack.
To set another table as the table of globals,
you call
\Deffunc{lua_setglobals}
\begin{verbatim}
       void lua_setglobals (lua_State *L);
\end{verbatim}
The table to be used is popped from the stack.

\subsection{Manipulating Tables in Lua}
Lua tables can also be manipulated through the API.

To read the value of in a table,
the table must reside somewhere in the stack.
With this set,
you call
\Deffunc{lua_gettable}
\begin{verbatim}
       void lua_gettable (lua_State *L, int index);
\end{verbatim}
where \verb|index| refers to the table.
\verb|lua_gettable| pops a key from the stack,
and returns (on the stack) the contents of the table at that key.
As in Lua, this operation may trigger a tag method
for the ``gettable'' event.
To get the real value of any table key,
without invoking any tag method,
use the \emph{raw} version:
\Deffunc{lua_rawget}
\begin{verbatim}
       void lua_rawget (lua_State *L, int index);
\end{verbatim}

To store a value into a table that resides somewhere in the stack,
you push the key and the value onto the stack
(in this order),
and then call
\Deffunc{lua_settable}
\begin{verbatim}
       void lua_settable (lua_State *L, int index);
\end{verbatim}
where \verb|index| refers to the table.
\verb|lua_settable| pops from the stack both the key and the value.
As in Lua, this operation may trigger a tag method
for the ``settable'' event.
To set the real value of any table index,
without invoking any tag method,
use the \emph{raw} version:
\Deffunc{lua_rawset}
\begin{verbatim}
       void lua_rawset (lua_State *L, int index);
\end{verbatim}

Finally, the function
\Deffunc{lua_newtable}
\begin{verbatim}
       void lua_newtable (lua_State *L);
\end{verbatim}
creates a new, empty table and and pushes it onto the stack.

\subsection{Using Tables as Arrays}
The API has functions that help to use Lua tables as arrays,
that is,
tables indexed by numbers only:
\Deffunc{lua_rawgeti}
\Deffunc{lua_rawseti}
\Deffunc{lua_getn}
\begin{verbatim}
       void lua_rawgeti (lua_State *L, int index, int n);
       void lua_rawseti (lua_State *L, int index, int n);
       int  lua_getn    (lua_State *L, int index);
\end{verbatim}

\verb|lua_rawgeti| gets the value of the \verb|n|-th element of the table
at stack position \verb|index|.

\verb|lua_rawseti| sets the value of the \verb|n|-th element of the table
at stack position \verb|index| to the value at the top of the stack.

\verb|lua_getn| returns the number of elements in the table
at stack position \verb|index|.
This number is the value of the table field \verb|n|,
if it has a numeric value,
or
the largest numerical index with a non-nil value in the table.

\subsection{Calling Lua Functions}

Functions defined in Lua
can be called from the host program.
This is done using the following protocol:
First, the function to be called is pushed onto the stack;
then, the arguments to the function are pushed
\see{pushing} in direct order, i.e., the first argument is pushed first.
Finally, the function is called using
\Deffunc{lua_call}
\begin{verbatim}
       int lua_call (lua_State *L, int nargs, int nresults);
\end{verbatim}
This function returns the same error codes as \verb|lua_dostring|.
Here,
\verb|nargs| is the number of arguments that you pushed onto the stack.
All arguments and the function value are popped from the stack,
and the function results are pushed.
The number of results are adjusted \see{adjust} to \verb|nresults|,
unless \verb|nresults| is \IndexVerb{LUA_MULTRET}.
In that case, \emph{all} results from the function are pushed.
The function results are pushed in direct order
(the first result is pushed first),
so that after the call the last result is on the top.

The following example shows how the host program may do the
equivalent to the Lua code:
\begin{verbatim}
       a,b = f("how", t.x, 4)
\end{verbatim}
Here it is in~C:
\begin{verbatim}
    lua_getglobal(L, "t");                      /* global `t' (for later use) */
    lua_getglobal(L, "f");                           /* function to be called */
    lua_pushstring(L, "how");                                 /* 1st argument */
    lua_pushstring(L, "x");                            /* push the string `x' */
    lua_gettable(L, -4);                      /* push result of t.x (2nd arg) */
    lua_pushnumber(L, 4);                                     /* 3rd argument */
    lua_call(L, 3, 2);        /* call function with 3 arguments and 2 results */
    lua_setglobal(L, "b");                         /* set global variable `b' */
    lua_setglobal(L, "a");                         /* set global variable `a' */
    lua_pop(L, 1);                               /* remove `t' from the stack */
\end{verbatim}
Notice that the code above is ``balanced'':
at its end the stack is back to its original configuration.
This is considered good programming practice.

Some special Lua functions have their own C~interfaces.
The host program can generate a Lua error calling the function
\Deffunc{lua_error}
\begin{verbatim}
       void lua_error (lua_State *L, const char *message);
\end{verbatim}
This function never returns.
If \verb|lua_error| is called from a C~function that has been called from Lua,
then the corresponding Lua execution terminates,
as if an error had occurred inside Lua code.
Otherwise, the whole host program terminates with a call to
\verb|exit(EXIT_FAILURE)|.
Before terminating execution,
the \verb|message| is passed to the error handler function,
\verb|_ERRORMESSAGE| \see{error}.
If \verb|message| is \verb|NULL|,
then \verb|_ERRORMESSAGE| is not called.

Tag methods can be changed with \Deffunc{lua_settagmethod}
\begin{verbatim}
       void lua_settagmethod (lua_State *L, int tag, const char *event);
\end{verbatim}
The second parameter is the tag,
and the third is the event name \see{tag-method};
the new method is popped from the stack,
and the old one is pushed in its place.
To just get the current value of a tag method,
use the function \Deffunc{lua_gettagmethod}
\begin{verbatim}
       void lua_gettagmethod (lua_State *L, int tag, const char *event);
\end{verbatim}

It is also possible to copy all tag methods from one tag
to another: \Deffunc{lua_copytagmethods}
\begin{verbatim}
       int lua_copytagmethods (lua_State *L, int tagto, int tagfrom);
\end{verbatim}
This function returns \verb|tagto|.

You can traverse a table with the function \Deffunc{lua_next}
\begin{verbatim}
       int lua_next (lua_State *L, int index);
\end{verbatim}
\verb|index| refers to the table to be traversed.
The function pops a key from the stack,
and pushes a key-value pair from the table
(the ``next'' pair after the given key).
If there are no more elements, then the function returns 0
(and pushes nothing).
A typical traversal looks like this:
\begin{verbatim}
       /* table is in the stack at index `t' */
       lua_pushnil(L);  /* first key */
       while (lua_next(L, t) != 0) {
         /* `key' is at index -2 and `value' at index -1 */
         printf("%s - %s\n", lua_type(L, -2), lua_type(L, -1));
         lua_pop(L, 1);  /* removes `value'; keeps `index' for next iteration */
       }
\end{verbatim}

The function \Deffunc{lua_concat}
\begin{verbatim}
       void lua_concat (lua_State *L, int n);
\end{verbatim}
concatenates the \verb|n| values at the top of the stack,
pops them, and leaves the result at the top.
\verb|n|~must be at least 2.
Concatenation is done following the usual semantics of Lua
\see{concat}.


\subsection{Defining C Functions} \label{LuacallC}
To register a C~function to Lua,
there is the following convenience macro:
\Deffunc{lua_register}
\begin{verbatim}
     #define lua_register(L, n, f) (lua_pushcfunction(L, f), lua_setglobal(L, n))
     /* const char *n;   */
     /* lua_CFunction f; */
\end{verbatim}
which receives the name the function will have in Lua,
and a pointer to the function.
This pointer must have type \verb|lua_CFunction|,
which is defined as
\Deffunc{lua_CFunction}
\begin{verbatim}
       typedef int (*lua_CFunction) (lua_State *L);
\end{verbatim}
that is, a pointer to a function with integer result and a single argument,
a Lua environment.

In order to communicate properly with Lua,
a C~function must follow the following protocol,
which defines the way parameters and results are passed:
A C~function receives its arguments from Lua in the stack,
in direct order (first argument is pushed first).
To return values to Lua, a C~function just pushes them onto the stack,
in direct order,
%\see{valuesCLua},
and returns the number of results.
Like a Lua function, a C~function called by Lua can also return
many results.

As an example, the following function receives a variable number
of numerical arguments and returns their average and sum:
\begin{verbatim}
       static int foo (lua_State *L) {
         int n = lua_gettop(L);    /* number of arguments */
         double sum = 0;
         int i;
         for (i = 1; i <= n; i++) {
           if (!lua_isnumber(L, i))
             lua_error(L, "incorrect argument to function `foo'");
           sum += lua_tonumber(L, i);
         }
         lua_pushnumber(L, sum/n);        /* first result */
         lua_pushnumber(L, sum);         /* second result */
         return 2;                   /* number of results */
       }
\end{verbatim}
This function may be registered in Lua as \verb|average| by calling
\begin{verbatim}
       lua_register(L, "average", foo);
\end{verbatim}


When a C~function is created,
it is possible to associate some \emph{upvalues} to it
\see{upvalue},
thus creating a \IndexEmph{C~closure};
these values are passed to the function whenever it is called,
as common arguments.
To associate upvalues to a C~function,
first these values should be pushed onto the stack.
Then the function \Deffunc{lua_pushcclosure}
\begin{verbatim}
       void lua_pushcclosure (lua_State *L, lua_CFunction fn, int n);
\end{verbatim}
is used to push the C~function onto the stack,
with the argument \verb|n| telling how many upvalues should be
associated with the function
(these upvalues are popped from the stack);
in fact, the macro \verb|lua_pushcfunction| is defined as
\verb|lua_pushcclosure| with \verb|n| set to 0.
Then, whenever the C~function is called,
these upvalues are inserted as the \emph{last} arguments to the function,
after the actual arguments provided in the call.
This makes it easy to get the upvalues without knowing how many arguments
the function received (recall that functions in Lua can receive any number of
arguments): The \M{i}-th upvalue is in the stack at index \Math{i-n+1},
where \M{n} is the number of upvalues.

For more examples of C~functions and closures, see files
\verb|lbaselib.c|, \verb|liolib.c|, \verb|lmathlib.c|, and \verb|lstrlib.c|
in the official Lua distribution.

\subsection{References to Lua Objects}

If the C~code needs to keep a Lua value
outside the life span of a C~function,
then it must create a \Def{reference} to the value.
The routines to manipulate references are the following:
\Deffunc{lua_ref}\Deffunc{lua_getref}
\Deffunc{lua_unref}
\begin{verbatim}
       int   lua_ref    (lua_State *L, int lock);
       int   lua_getref (lua_State *L, int ref);
       void  lua_unref  (lua_State *L, int ref);
\end{verbatim}

\verb|lua_ref| pops a value from
the stack, creates a reference to it,
and returns this reference.
For a \nil\ value,
the reference is always \verb|LUA_REFNIL|.\Deffunc{LUA_REFNIL}
The constant \verb|LUA_NOREF| \Deffunc{LUA_NOREF}
is different from any valid reference.
If \verb|lock| is true, then the object is \emph{locked}:
this means the object will not be garbage collected.
\emph{Unlocked references may be garbage collected}.

Whenever the referenced object is needed in~C,
a call to \verb|lua_getref|
pushes that object onto the stack;
if the object has been collected,
\verb|lua_getref| returns 0 (and does not push anything).

When a reference is no longer needed,
it should be released with a call to \verb|lua_unref|.



\section{Standard Libraries}

The standard libraries provide useful routines
that are implemented directly through the standard API.
Therefore, they are not necessary to the language,
and are provided as separate C~modules.
Currently, Lua has the following standard libraries:
\begin{itemize}
\item basic library;
\item string manipulation;
\item mathematical functions (sin, log, etc);
\item input and output (plus some system facilities).
\end{itemize}
To have access to these libraries,
the C~host program must call the functions
\verb|lua_baselibopen|,
\verb|lua_strlibopen|, \verb|lua_mathlibopen|,
and \verb|lua_iolibopen|, declared in \verb|lualib.h|.
\Deffunc{lua_strlibopen}\Deffunc{lua_mathlibopen}\Deffunc{lua_iolibopen}

The basic library provides some core functions to Lua.
Therefore, if you do not include this library in your application,
you should check carefully whether you need to provide some alternative
implementation for some facilities.
(For instance, without function \verb|_ERRORMESSAGE|,
defined in the basic library, Lua is unable to show error messages.)


\subsection{Basic Functions} \label{predefined}

\subsubsection*{\ff \T{_ALERT (message)}}\Deffunc{alert}\label{alert}
Prints its only string argument to \IndexVerb{stderr}.
All error messages in Lua are printed through the function stored
in the \verb|_ALERT| global variable
\see{error}.
Therefore, a program may assign another function to this variable
to change the way such messages are shown
(for instance, for systems without \verb|stderr|).

\subsubsection*{\ff \T{assert (v [, message])}}\Deffunc{assert}
Issues an \emph{``assertion failed!''} error
when its argument \verb|v| is \nil.
This function is equivalent to the following Lua function:
\begin{verbatim}
       function assert (v, m)
         if not v then
           m = m or ""
           error("assertion failed!  " .. m)
         end
       end
\end{verbatim}

\subsubsection*{\ff \T{call (func, arg [, mode [, errhandler]])}}\Deffunc{call}
\label{pdf-call}
Calls function \verb|func| with
the arguments given by the table \verb|arg|.
The call is equivalent to
\begin{verbatim}
       func(arg[1], arg[2], ..., arg[n])
\end{verbatim}
where \verb|n| is the result of \verb|getn(arg)| \see{getn}.
All results from \verb|func| are simply returned by \verb|call|.

By default,
if an error occurs during the call to \verb|func|,
the error is propagated.
If the string \verb|mode| contains \verb|"x"|,
then the call is \emph{protected}.\index{protected calls}
In this mode, function \verb|call| does not propagate an error,
regardless of what happens during the call.
Instead, it returns \nil\ to signal the error
(besides calling the appropriated error handler).

If \verb|errhandler| is provided,
the error function \verb|_ERRORMESSAGE| is temporarily set to \verb|errhandler|,
while \verb|func| runs.
In particular, if \verb|errhandler| is \nil,
no error messages will be issued during the execution of the called function.

\subsubsection*{\ff \T{collectgarbage ([limit])}}\Deffunc{collectgarbage}
Forces a garbage collection cycle.
Returns the number of objects collected.
The optional argument \verb|limit| is a number that
makes the next cycle occur only after that number of new
objects have been created.
If \verb|limit| is absent or equal to 0,
then Lua uses an adaptive algorithm to set this limit.
\verb|collectgarbage| is equivalent to
the API function \verb|lua_collectgarbage|.

\Tochange{This function}

\subsubsection*{\ff \T{copytagmethods (tagto, tagfrom)}}
\Deffunc{copytagmethods}
Copies all tag methods from one tag to another;
it returns \verb|tagto|.

\subsubsection*{\ff \T{dofile (filename)}}\Deffunc{dofile}
Receives a file name,
opens the named file, and executes its contents as a Lua chunk,
or as pre-compiled chunks.
When called without arguments,
\verb|dofile| executes the contents of the standard input (\verb|stdin|).
If there is any error executing the file,
then \verb|dofile| returns \nil.
Otherwise, it returns the values returned by the chunk,
or a non-\nil\ value if the chunk returns no values.
It issues an error when called with a non-string argument.
\verb|dofile| is equivalent to the API function \verb|lua_dofile|.

\subsubsection*{\ff \T{dostring (string [, chunkname])}}\Deffunc{dostring}
Executes a given string as a Lua chunk.
If there is any error executing the string,
then \verb|dostring| returns \nil.
Otherwise, it returns the values returned by the chunk,
or a non-\nil\ value if the chunk returns no values.
The optional parameter \verb|chunkname|
is the ``name of the chunk'',
used in error messages and debug information.
\verb|dostring| is equivalent to the API function \verb|lua_dostring|.

\subsubsection*{\ff \T{error (message)}}\Deffunc{error}\label{pdf-error}
Calls the error handler \see{error} and then terminates
the last protected function called
(in~C: \verb|lua_dofile|, \verb|lua_dostring|,
\verb|lua_dobuffer|, or \verb|lua_callfunction|;
in Lua: \verb|dofile|, \verb|dostring|, or \verb|call| in protected mode).
If \verb|message| is \nil, then the error handler is not called.
Function \verb|error| never returns.
\verb|error| is equivalent to the API function \verb|lua_error|.

\subsubsection*{\ff \T{foreach (table, func)}}\Deffunc{foreach}
Executes the given \verb|func| over all elements of \verb|table|.
For each element, the function is called with the index and
respective value as arguments.
If the function returns any non-\nil\ value,
then the loop is broken, and this value is returned
as the final value of \verb|foreach|.

This function could be defined in Lua:
\begin{verbatim}
       function foreach (t, f)
         for i, v in t do
           local res = f(i, v)
           if res then return res end
         end
       end
\end{verbatim}

The behavior of \verb|foreach| is \emph{undefined} if you change
the table \verb|_t| during the traversal.


\subsubsection*{\ff \T{foreachi (table, func)}}\Deffunc{foreachi}
Executes the given \verb|func| over the
numerical indices of \verb|table|.
For each index, the function is called with the index and
respective value as arguments.
Indices are visited in sequential order,
from 1 to \verb|n|,
where \verb|n| is the result of \verb|getn(table)| \see{getn}.
If the function returns any non-\nil\ value,
then the loop is broken, and this value is returned
as the final value of \verb|foreachi|.

This function could be defined in Lua:
\begin{verbatim}
       function foreachi (t, f)
         for i=1,getn(t) do
           local res = f(i, t[i])
           if res then return res end
         end
       end
\end{verbatim}


\subsubsection*{\ff \T{foreachvar (function)}}\Deffunc{foreachvar}
This function is obsolete.
Use \verb|foreach(globals(), function)| instead.


\subsubsection*{\ff \T{getglobal (name)}}\Deffunc{getglobal}
Gets the value of a global variable,
or calls a tag method for ``getglobal''.
Its full semantics is explained in \See{tag-method}.
The string \verb|name| does not need to be a
syntactically valid variable name.

\subsubsection*{\ff \T{getn (table)}}\Deffunc{getn}\label{getn}
Returns the ``size'' of a table, when seen as a list.
If the table has an \verb|n| field with a numeric value,
this value is its ``size''.
Otherwise, the size is the largest numerical index with a non-nil
value in the table.
This function could be defined in Lua:
\begin{verbatim}
       function getn (t)
         if type(t.n) == 'number' then return t.n end
         local max = 0
         for i, _ in t do
           if type(i) == 'number' and i>max then max=i end
         end
         return max
       end
\end{verbatim}

\subsubsection*{\ff \T{gettagmethod (tag, event)}}
\Deffunc{gettagmethod}
Returns the current tag method
for a given pair \M{(tag, event)}.

\subsubsection*{\ff \T{globals ([table])}}\Deffunc{globals}
Returns the current table of globals.
If the argument \verb|table| is given,
then it sets this table as the table of globals.

\subsubsection*{\ff \T{newtag ()}}\Deffunc{newtag}\label{pdf-newtag}
Returns a new tag.
\verb|newtag| is equivalent to the API function \verb|lua_newtag|.

\subsubsection*{\ff \T{next (table, [index])}}\Deffunc{next}
Allows a program to traverse all fields of a table.
Its first argument is a table and its second argument
is an index in this table.
It returns the next index of the table and the
value associated with the index.
When called with \nil\ as its second argument,
\verb|next| returns the first index
of the table and its associated value.
When called with the last index,
or with \nil\ in an empty table,
\verb|next| returns \nil.
If the second argument is absent, then it is interpreted as \nil.

Lua has no declaration of fields;
semantically, there is no difference between a
field not present in a table or a field with value \nil.
Therefore, \verb|next| only considers fields with non-\nil\ values.
The order in which the indices are enumerated is not specified,
\emph{even for numeric indices}
(to traverse a table in numeric order,
use a counter or the function \verb|foreachi|).

The behavior of \verb|next| is \emph{undefined} if you change
the table during the traversal.

\subsubsection*{\ff \T{nextvar (name)}}\Deffunc{nextvar}
This function is obsolete.
Use \verb|next(globals(), name)| instead.

\subsubsection*{\ff \T{print (e1, e2, ...)}}\Deffunc{print}
Receives any number of arguments,
and prints their values using the strings returned by \verb|tostring|.
This function is not intended for formatted output,
but only as a quick way to show a value,
for instance for debugging.
See \See{libio} for functions for formatted output.

\subsubsection*{\ff \T{rawget (table, index)}}\Deffunc{rawget}
Gets the real value of \verb|table[index]|,
without invoking any tag method.
\verb|table| must be a table,
and \verb|index| is any value different from \nil.

\subsubsection*{\ff \T{rawgetglobal (name)}}\Deffunc{rawgetglobal}
This function is obsolete.
Use \verb|rawget(globals(), name)| instead.

\subsubsection*{\ff \T{rawgettable (table, index)}}\Deffunc{rawgettable}
This function has been renamed to \verb|rawget|.

\subsubsection*{\ff \T{rawset (table, index, value)}}\Deffunc{rawset}
Sets the real value of \verb|table[index]| to \verb|value|,
without invoking any tag method.
\verb|table| must be a table,
\verb|index| is any value different from \nil,
and \verb|value| is any Lua value.

\subsubsection*{\ff \T{rawsetglobal (name, value)}}\Deffunc{rawsetglobal}
This function is obsolete.
Use \verb|rawset(globals(), name, value)| instead.

\subsubsection*{\ff \T{rawsettable (table, index, value)}}\Deffunc{rawsettable}
This function has been renamed to \verb|rawset|.

\subsubsection*{\ff \T{setglobal (name, value)}}\Deffunc{setglobal}
Sets the named global variable to the given value,
or calls a tag method for ``setglobal''.
Its full semantics is explained in \See{tag-method}.
The string \verb|name| does not need to be a
syntactically valid variable name.

\subsubsection*{\ff \T{settag (t, tag)}}\Deffunc{settag}
Sets the tag of a given table \see{TypesSec}.
\verb|tag| must be a value created with \verb|newtag|
\see{pdf-newtag}.
It returns the value of its first argument (the table).
For the safety of host programs,
it is impossible to change the tag of a userdata from Lua.

\subsubsection*{\ff \T{settagmethod (tag, event, newmethod)}}
\Deffunc{settagmethod}
Sets a new tag method to the given pair \M{(tag, event)}.
It returns the old method.
If \verb|newmethod| is \nil,
then \verb|settagmethod| restores the default behavior for the given event.

\subsubsection*{\ff \T{sort (table [, comp])}}\Deffunc{sort}
Sorts table elements in a given order, \emph{in-place},
from \verb|table[1]| to \verb|table[n]|,
where \verb|n| is the result of \verb|getn(table)| \see{getn}.
If \verb|comp| is given,
it must be a function that receives two table elements,
and returns true when the first is less than the second
(so that \verb|not comp(a[i+1], a[i])| will be true after the sort).
If \verb|comp| is not given,
the standard Lua operator \verb|<| is used instead.

The sort algorithm is not stable
(that is, elements considered equal by the given order
may have their relative positions changed by the sort).

\subsubsection*{\ff \T{tag (v)}}\Deffunc{tag}\label{pdf-tag}
Allows Lua programs to test the tag of a value \see{TypesSec}.
It receives one argument, and returns its tag (a number).
\verb|tag| is equivalent to the API function \verb|lua_tag|.

\subsubsection*{\ff \T{tonumber (e [, base])}}\Deffunc{tonumber}
Receives one argument,
and tries to convert it to a number.
If the argument is already a number or a string convertible
to a number, then \verb|tonumber| returns that number;
otherwise, it returns \nil.

An optional argument specifies the base to interpret the numeral.
The base may be any integer between 2 and 36, inclusive.
In bases above~10, the letter `A' (either upper or lower case)
represents~10, `B' represents~11, and so forth, with `Z' representing 35.

In base 10 (the default), the number may have a decimal part,
as well as an optional exponent part \see{coercion}.
In other bases, only unsigned integers are accepted.

\subsubsection*{\ff \T{tostring (e)}}\Deffunc{tostring}
Receives an argument of any type and
converts it to a string in a reasonable format.
For complete control of how numbers are converted,
use function \verb|format|.



\subsubsection*{\ff \T{tinsert (table [, pos] , value)}}\Deffunc{tinsert}

Inserts element \verb|value| at table position \verb|pos|,
shifting other elements to open space, if necessary.
The default value for \verb|pos| is \verb|n+1|,
where \verb|n| is the result of \verb|getn(table)| \see{getn},
so that a call \verb|tinsert(t,x)| inserts \verb|x| at the end
of table \verb|t|.
This function also sets or increments the field \verb|n| of the table
to \verb|n+1|.

This function is equivalent to the following Lua function,
except that the table accesses are all \emph{raw}
(that is, without tag methods):
\begin{verbatim}
       function tinsert (t, ...)
         local pos, value
         local n = getn(t)
         if arg.n == 1 then
           pos, value = n+1, arg[1]
         else
           pos, value = arg[1], arg[2]
         end
         t.n = n+1;
         for i=n,pos,-1 do
           t[i+1] = t[i]
         end
         t[pos] = value
       end
\end{verbatim}

\subsubsection*{\ff \T{tremove (table [, pos])}}\Deffunc{tremove}

Removes from \verb|table| the element at position \verb|pos|,
shifting other elements to close the space, if necessary.
Returns the value of the removed element.
The default value for \verb|pos| is \verb|n|,
where \verb|n| is the result of \verb|getn(table)| \see{getn},
so that a call \verb|tremove(t)| removes the last element
of table \verb|t|.
This function also sets or decrements the field \verb|n| of the table
to \verb|n-1|.

This function is equivalent to the following Lua function,
except that the table accesses are all \emph{raw}
(that is, without tag methods):
\begin{verbatim}
       function tremove (t, pos)
         local n = getn(t)
         if n<=0 then return end
         pos = pos or n
         local value = t[pos]
         for i=pos,n-1 do
           t[i] = t[i+1]
         end
         t[n] = nil
         t.n = n-1
         return value
       end
\end{verbatim}

\subsubsection*{\ff \T{type (v)}}\Deffunc{type}\label{pdf-type}
Allows Lua programs to test the type of a value.
It receives one argument, and returns its type, coded as a string.
The possible results of this function are
\verb|"nil"| (a string, not the value \nil),
\verb|"number"|,
\verb|"string"|,
\verb|"table"|,
\verb|"function"|,
and \verb|"userdata"|.
\verb|type| is equivalent to the API function \verb|lua_type|.


\subsection{String Manipulation}
This library provides generic functions for string manipulation,
such as finding and extracting substrings and pattern matching.
When indexing a string in Lua, the first character is at position~1
(not at~0, as in C).

\subsubsection*{\ff \T{strbyte (s [, i])}}\Deffunc{strbyte}
Returns the internal numerical code of the character \verb|s[i]|.
If \verb|i| is absent, then it is assumed to be 1.
If \verb|i| is negative,
it is replaced by the length of the string minus its
absolute value plus 1.
Therefore, \Math{-1} points to the last character of \verb|s|.

\NOTE
Numerical codes are not necessarily portable across platforms.

\subsubsection*{\ff \T{strchar (i1, i2, \ldots)}}\Deffunc{strchar}
Receives 0 or more integers.
Returns a string with length equal to the number of arguments,
wherein each character has the internal numerical code equal
to its correspondent argument.

\NOTE
Numerical codes are not necessarily portable across platforms.

\subsubsection*{\ff \T{strfind (str, pattern [, init [, plain]])}}
\Deffunc{strfind}
Looks for the first \emph{match} of
\verb|pattern| in \verb|str|.
If it finds one, then it returns the indices of \verb|str|
where this occurrence starts and ends;
otherwise, it returns \nil.
If the pattern specifies captures (see \verb|gsub| below),
the captured strings are returned as extra results.
A third optional numerical argument specifies where to start the search;
its default value is 1.
If \verb|init| is negative,
it is replaced by the length of the string minus its
absolute value plus 1.
Therefore, \Math{-1} points to the last character of \verb|str|.
A value of 1 as a fourth optional argument
turns off the pattern matching facilities,
so the function does a plain ``find substring'' operation,
with no characters in \verb|pattern| being considered ``magic''.

\subsubsection*{\ff \T{strlen (s)}}\Deffunc{strlen}
Receives a string and returns its length.
The empty string \verb|""| has length 0.
Embedded zeros are counted,
and so \verb|"a\000b\000c"| has length 5.

\subsubsection*{\ff \T{strlower (s)}}\Deffunc{strlower}
Receives a string and returns a copy of that string with all
upper case letters changed to lower case.
All other characters are left unchanged.
The definition of what is an upper-case
letter depends on the current locale.

\subsubsection*{\ff \T{strrep (s, n)}}\Deffunc{strrep}
Returns a string that is the concatenation of \verb|n| copies of
the string \verb|s|.

\subsubsection*{\ff \T{strsub (s, i [, j])}}\Deffunc{strsub}
Returns another string, which is a substring of \verb|s|,
starting at \verb|i|  and running until \verb|j|.
If \verb|i| or \verb|j| are negative,
they are replaced by the length of the string minus their
absolute value plus 1.
Therefore, \Math{-1} points to the last character of \verb|s|
and \Math{-2} to the previous one.
If \verb|j| is absent, it is assumed to be equal to \Math{-1}
(which is the same as the string length).
In particular,
the call \verb|strsub(s,1,j)| returns a prefix of \verb|s|
with length \verb|j|,
and the call \verb|strsub(s, -i)| returns a suffix of \verb|s|
with length \verb|i|.

\subsubsection*{\ff \T{strupper (s)}}\Deffunc{strupper}
Receives a string and returns a copy of that string with all
lower case letters changed to upper case.
All other characters are left unchanged.
The definition of what is a lower case
letter depends on the current locale.

\subsubsection*{\ff \T{format (formatstring, e1, e2, \ldots)}}\Deffunc{format}
\label{format}
Returns a formatted version of its variable number of arguments
following the description given in its first argument (which must be a string).
The format string follows the same rules as the \verb|printf| family of
standard C~functions.
The only differences are that the options/modifiers
\verb|*|, \verb|l|, \verb|L|, \verb|n|, \verb|p|,
and \verb|h| are not supported,
and there is an extra option, \verb|q|.
The \verb|q| option formats a string in a form suitable to be safely read
back by the Lua interpreter:
The string is written between double quotes,
and all double quotes, returns, and backslashes in the string
are correctly escaped when written.
For instance, the call
\begin{verbatim}
       format('%q', 'a string with "quotes" and \n new line')
\end{verbatim}
will produce the string:
\begin{verbatim}
"a string with \"quotes\" and \
 new line"
\end{verbatim}

Conversions can be applied to the \M{n}-th argument in the argument list,
rather than the next unused argument.
In this case, the conversion character \verb|%| is replaced
by the sequence \verb|%d$|, where \verb|d| is a
decimal digit in the range [1,9],
giving the position of the argument in the argument list.
For instance, the call \verb|format("%2$d -> %1$03d", 1, 34)| will
result in \verb|"34 -> 001"|.
The same argument can be used in more than one conversion.

The options \verb|c|, \verb|d|, \verb|E|, \verb|e|, \verb|f|,
\verb|g|, \verb|G|, \verb|i|, \verb|o|, \verb|u|, \verb|X|, and \verb|x| all
expect a number as argument,
whereas \verb|q| and \verb|s| expect a string.
The \verb|*| modifier can be simulated by building
the appropriate format string.
For example, \verb|"%*g"| can be simulated with
\verb|"%"..width.."g"|.

\NOTE
Neither the format string nor the string values to be formatted with
\T{format} can contain embedded zeros.

\subsubsection*{\ff \T{gsub (s, pat, repl [, n])}}
\Deffunc{gsub}
Returns a copy of \verb|s|,
in which all occurrences of the pattern \verb|pat| have been
replaced by a replacement string specified by \verb|repl|.
This function also returns, as a second value,
the total number of substitutions made.

If \verb|repl| is a string, then its value is used for replacement.
Any sequence in \verb|repl| of the form \verb|%n|
with \verb|n| between 1 and 9
stands for the value of the \M{n}-th captured substring.

If \verb|repl| is a function, then this function is called every time a
match occurs, with all captured substrings passed as arguments,
in order (see below).
If the value returned by this function is a string,
then it is used as the replacement string;
otherwise, the replacement string is the empty string.

The last, optional parameter \verb|n| limits
the maximum number of substitutions to occur.
For instance, when \verb|n| is 1 only the first occurrence of
\verb|pat| is replaced.

Here are some examples:
\begin{verbatim}
   x = gsub("hello world", "(%w+)", "%1 %1")
   --> x="hello hello world world"

   x = gsub("hello world", "(%w+)", "%1 %1", 1)
   --> x="hello hello world"

   x = gsub("hello world from Lua", "(%w+)%s*(%w+)", "%2 %1")
   --> x="world hello Lua from"

   x = gsub("home = $HOME, user = $USER", "%$(%w+)", getenv)
   --> x="home = /home/roberto, user = roberto"  (for instance)

   x = gsub("4+5 = $return 4+5$", "%$(.-)%$", dostring)
   --> x="4+5 = 9"

   local t = {name="lua", version="4.0"}
   x = gsub("$name - $version", "%$(%w+)", function (v) return %t[v] end)
   --> x="lua - 4.0"

   t = {n=0}
   gsub("first second word", "(%w+)", function (w) tinsert(%t, w) end)
   --> t={"first", "second", "word"; n=3}
\end{verbatim}


\subsubsection*{Patterns} \label{pm}

\paragraph{Character Class:}
a \Def{character class} is used to represent a set of characters.
The following combinations are allowed in describing a character class:
\begin{description}
\item[\emph{x}] (where \emph{x} is any character not in the list
\verb|^$()%.[]*+-?|)
--- represents the character \emph{x} itself.
\item[\T{.}] --- (a dot) represents all characters.
\item[\T{\%a}] --- represents all letters.
\item[\T{\%c}] --- represents all control characters.
\item[\T{\%d}] --- represents all digits.
\item[\T{\%l}] --- represents all lower case letters.
\item[\T{\%p}] --- represents all punctuation characters.
\item[\T{\%s}] --- represents all space characters.
\item[\T{\%u}] --- represents all upper case letters.
\item[\T{\%w}] --- represents all alphanumeric characters.
\item[\T{\%x}] --- represents all hexadecimal digits.
\item[\T{\%z}] --- represents the character with representation 0.
\item[\T{\%\M{x}}] (where \M{x} is any non-alphanumeric character)  ---
represents the character \M{x}.
This is the standard way to escape the magic characters \verb|()%.[]*+-?|.
We recommend that any ``punct'' character (even the non magic)
should be preceded by a \verb|%|
when used to represent itself in a pattern.

\item[\T{[char-set]}] ---
represents the class which is the union of all
characters in char-set.
A range of characters may be specified by
separating the end characters of the range with a \verb|-|.
All classes \verb|%|\emph{x} described above may also be used as
components in a char-set.
All other characters in char-set represent themselves.
For example, \verb|[%w_]| (or \verb|[_%w]|)
represents all alphanumeric characters plus the underscore,
\verb|[0-7]| represents the octal digits,
and \verb|[0-7%l%-]| represents the octal digits plus
the lower case letters plus the \verb|-| character.

The interaction between ranges and classes is not defined.
Therefore, patterns like \verb|[%a-z]| or \verb|[a-%%]|
have no meaning.

\item[\T{[\^{ }char-set]}] ---
represents the complement of char-set,
where char-set is interpreted as above.
\end{description}
For all classes represented by single letters (\verb|%a|, \verb|%c|, \ldots),
the corresponding upper-case letter represents the complement of the class.
For instance, \verb|%S| represents all non-space characters.

The definitions of letter, space, etc. depend on the current locale.
In particular, the class \verb|[a-z]| may not be equivalent to \verb|%l|.
The second form should be preferred for portability.

\paragraph{Pattern Item:}
a \Def{pattern item} may be
\begin{itemize}
\item
a single character class,
which matches any single character in the class;
\item
a single character class followed by \verb|*|,
which matches 0 or more repetitions of characters in the class.
These repetition items will always match the longest possible sequence;
\item
a single character class followed by \verb|+|,
which matches 1 or more repetitions of characters in the class.
These repetition items will always match the longest possible sequence;
\item
a single character class followed by \verb|-|,
which also matches 0 or more repetitions of characters in the class.
Unlike \verb|*|,
these repetition items will always match the shortest possible sequence;
\item
a single character class followed by \verb|?|,
which matches 0 or 1 occurrence of a character in the class;
\item
\T{\%\M{n}}, for \M{n} between 1 and 9;
such item matches a sub-string equal to the \M{n}-th captured string
(see below);
\item
\T{\%b\M{xy}}, where \M{x} and \M{y} are two distinct characters;
such item matches strings that start with~\M{x}, end with~\M{y},
and where the \M{x} and \M{y} are \emph{balanced}.
This means that, if one reads the string from left to right,
counting \Math{+1} for an \M{x} and \Math{-1} for a \M{y},
the ending \M{y} is the first where the count reaches 0.
For instance, the item \verb|%b()| matches expressions with
balanced parentheses.
\end{itemize}

\paragraph{Pattern:}
a \Def{pattern} is a sequence of pattern items.
A \verb|^| at the beginning of a pattern anchors the match at the
beginning of the subject string.
A \verb|$| at the end of a pattern anchors the match at the
end of the subject string.
At other positions,
\verb|^| and \verb|$| have no special meaning and represent themselves.

\paragraph{Captures:}
A pattern may contain sub-patterns enclosed in parentheses,
that describe \Def{captures}.
When a match succeeds, the sub-strings of the subject string
that match captures are stored (\emph{captured}) for future use.
Captures are numbered according to their left parentheses.
For instance, in the pattern \verb|"(a*(.)%w(%s*))"|,
the part of the string matching \verb|"a*(.)%w(%s*)"| is
stored as the first capture (and therefore has number~1);
the character matching \verb|.| is captured with number~2,
and the part matching \verb|%s*| has number~3.

\NOTE
{\em A pattern cannot contain embedded zeros.
Use \verb|%z| instead.}


\subsection{Mathematical Functions} \label{mathlib}

This library is an interface to some functions of the standard C~math library.
In addition, it registers a tag method for the binary operator \verb|^| that
returns \Math{x^y} when applied to numbers \verb|x^y|.

The library provides the following functions:
\Deffunc{abs}\Deffunc{acos}\Deffunc{asin}\Deffunc{atan}
\Deffunc{atan2}\Deffunc{ceil}\Deffunc{cos}\Deffunc{floor}
\Deffunc{log}\Deffunc{log10}\Deffunc{max}\Deffunc{min}
\Deffunc{mod}\Deffunc{sin}\Deffunc{sqrt}\Deffunc{tan}
\Deffunc{frexp}\Deffunc{ldexp}
\Deffunc{random}\Deffunc{randomseed}
\begin{verbatim}
       abs  acos  asin  atan  atan2  ceil  cos  deg    floor  log     log10
       max  min   mod   rad   sin    sqrt  tan  frexp  ldexp  random  randomseed
\end{verbatim}
plus a global variable \IndexVerb{PI}.
Most of them
are only interfaces to the homonymous functions in the C~library,
except that, for the trigonometric functions,
all angles are expressed in \emph{degrees}, not radians.
Functions \IndexVerb{deg} and \IndexVerb{rad} can be used to convert
between radians and degrees.

The function \verb|max| returns the maximum
value of its numeric arguments.
Similarly, \verb|min| computes the minimum.
Both can be used with 1, 2, or more arguments.

The functions \verb|random| and \verb|randomseed| are interfaces to
the simple random generator functions \verb|rand| and \verb|srand|,
provided by ANSI C.
(No guarantees can be given for their statistical properties.)
The function \verb|random|, when called without arguments,
returns a pseudo-random real number in the range \Math{[0,1)}.
When called with a number \Math{n},
\verb|random| returns a pseudo-random integer in the range \Math{[1,n]}.
When called with two arguments, \Math{l} and \Math{u},
\verb|random| returns a pseudo-random integer in the range \Math{[l,u]}.


\subsection{I/O Facilities} \label{libio}

All input and output operations in Lua are done, by default,
over two \Def{file handles}, one for reading and one for writing.
These handles are stored in two Lua global variables,
called \verb|_INPUT| and \verb|_OUTPUT|.
The global variables
\verb|_STDIN|, \verb|_STDOUT|, and \verb|_STDERR|
are initialized with file descriptors for
\verb|stdin|, \verb|stdout| and \verb|stderr|.
Initially, \verb|_INPUT=_STDIN| and \verb|_OUTPUT=_STDOUT|.
\Deffunc{_INPUT}\Deffunc{_OUTPUT}
\Deffunc{_STDIN}\Deffunc{_STDOUT}\Deffunc{_STDERR}

A file handle is a userdata containing the file stream \verb|FILE*|,
and with a distinctive tag created by the I/O library.

Unless otherwise stated,
all I/O functions return \nil\ on failure and
some value different from \nil\ on success.

\subsubsection*{\ff \T{openfile (filename, mode)}}\Deffunc{openfile}

This function opens a file,
in the mode specified in the string \verb|mode|.
It returns a new file handle,
or, in case of errors, \nil\ plus a string describing the error.
This function does not modify either \verb|_INPUT| or \verb|_OUTPUT|.

The \verb|mode| string can be any of the following:
\begin{description}
\item[``r''] read mode;
\item[``w''] write mode;
\item[``a''] append mode;
\item[``r+''] update mode, all previous data is preserved;
\item[``w+''] update mode, all previous data is erased;
\item[``a+''] append update mode, previous data is preserved,
  writing is only allowed at the end of file.
\end{description}
The \verb|mode| string may also have a \verb|b| at the end,
which is needed in some systems to open the file in binary mode.
This string is exactlty what is used in the standard~C function \verb|fopen|.

\subsubsection*{\ff \T{closefile (handle)}}\Deffunc{closefile}

This function closes the given file.
It does not modify either \verb|_INPUT| or \verb|_OUTPUT|.

\subsubsection*{\ff \T{readfrom (filename)}}\Deffunc{readfrom}

This function may be called in two ways.
When called with a file name, it opens the named file,
sets its handle as the value of \verb|_INPUT|,
and returns this value.
It does not close the current input file.
When called without parameters,
it closes the \verb|_INPUT| file,
and restores \verb|stdin| as the value of \verb|_INPUT|.

If this function fails, it returns \nil,
plus a string describing the error.

\NOTE
(system dependency)
if \verb|filename| starts with a \verb-|-,
then a \Index{piped input} is opened, via function \IndexVerb{popen}.
Not all systems implement pipes.
Moreover,
the number of files that can be open at the same time is
usually limited and depends on the system.

\subsubsection*{\ff \T{writeto (filename)}}\Deffunc{writeto}

This function may be called in two ways.
When called with a file name,
it opens the named file,
sets its handle as the value of \verb|_OUTPUT|,
and returns this value.
It does not close the current output file.
Note that, if the file already exists,
then it will be \emph{completely erased} with this operation.
When called without parameters,
this function closes the \verb|_OUTPUT| file,
and restores \verb|stdout| as the value of \verb|_OUTPUT|.
\index{closing a file}

If this function fails, it returns \nil,
plus a string describing the error.

\NOTE
(system dependency)
if \verb|filename| starts with a \verb-|-,
then a \Index{piped input} is opened, via function \IndexVerb{popen}.
Not all systems implement pipes.
Moreover,
the number of files that can be open at the same time is
usually limited and depends on the system.

\subsubsection*{\ff \T{appendto (filename)}}\Deffunc{appendto}

Opens a file named \verb|filename| and sets it as the
value of \verb|_OUTPUT|.
Unlike the \verb|writeto| operation,
this function does not erase any previous contents of the file;
instead, anything written to the file is appended to its end.
If this function fails, it returns \nil,
plus a string describing the error.

\subsubsection*{\ff \T{remove (filename)}}\Deffunc{remove}

Deletes the file with the given name.
If this function fails, it returns \nil,
plus a string describing the error.

\subsubsection*{\ff \T{rename (name1, name2)}}\Deffunc{rename}

Renames file named \verb|name1| to \verb|name2|.
If this function fails, it returns \nil,
plus a string describing the error.

\subsubsection*{\ff \T{flush ([filehandle])}}\Deffunc{flush}

Saves any written data to the given file.
If \verb|filehandle| is not specified,
then \verb|flush| flushes all open files.
If this function fails, it returns \nil,
plus a string describing the error.

\subsubsection*{\ff \T{seek (filehandle [, whence] [, offset])}}\Deffunc{seek}

Sets and gets the file position,
measured in bytes from the beginning of the file,
to the position given by \verb|offset| plus a base
specified by the string \verb|whence|, as follows:
\begin{description}
\item[``set''] base is position 0 (beginning of the file);
\item[``cur''] base is current position;
\item[``end''] base is end of file;
\end{description}
In case of success, function \verb|seek| returns the final file position,
measured in bytes from the beginning of the file.
If the call fails, it returns \nil,
plus a string describing the error.

The default value for \verb|whence| is \verb|"cur"|,
and for \verb|offset| is 0.
Therefore, the call \verb|seek(file)| returns the current
file position, without changing it;
the call \verb|seek(file, "set")| sets the position to the
beginning of the file (and returns 0);
and the call \verb|seek(file, "end")| sets the position to the
end of the file, and returns its size.

\subsubsection*{\ff \T{tmpname ()}}\Deffunc{tmpname}

Returns a string with a file name that can safely
be used for a temporary file.
The file must be explicitly opened before its use
and removed when no longer needed.

\subsubsection*{\ff \T{read ([filehandle,] format1, ...)}}\Deffunc{read}

Reads file \verb|_INPUT|,
or \verb|filehandle| if this argument is given,
according to the given formats, which specify what to read.
For each format,
the function returns a string (or a number) with the characters read,
or \nil\ if it cannot read data with the specified format.
When called without formats,
it uses a default format that reads the next line
(see below).

The available formats are
\begin{description}
\item[``*n''] reads a number;
this is the only format that returns a number instead of a string.
\item[``*l''] reads the next line
(skipping the end of line), or \nil\ on end of file.
This is the default format.
\item[``*a''] reads the whole file, starting at the current position.
On end of file, it returns the empty string.
\item[``*w''] reads the next word
(maximal sequence of non--white-space characters),
skipping spaces if necessary, or \nil\ on end of file.
\item[\emph{number}] reads a string with up to that number of characters,
or \nil\ on end of file.
\end{description}

\subsubsection*{\ff \T{write ([filehandle, ] value1, ...)}}\Deffunc{write}

Writes the value of each of its arguments to
file \verb|_OUTPUT|,
or to \verb|filehandle| if this argument is given.
The arguments must be strings or numbers.
To write other values,
use \verb|tostring| or \verb|format| before \verb|write|.
If this function fails, it returns \nil,
plus a string describing the error.

\subsection{System Facilities} \label{libiosys}

\subsubsection*{\ff \T{clock ()}}\Deffunc{clock}

Returns an approximation of the amount of CPU time
used by the program, in seconds.

\subsubsection*{\ff \T{date ([format])}}\Deffunc{date}

Returns a string containing date and time
formatted according to the given string \verb|format|,
following the same rules of the ANSI~C function \verb|strftime|.
When called without arguments,
it returns a reasonable date and time representation that depends on
the host system and on the current locale.

\subsubsection*{\ff \T{execute (command)}}\Deffunc{execute}

This function is equivalent to the C~function \verb|system|.
It passes \verb|command| to be executed by an operating system shell.
It returns a status code, which is system-dependent.

\subsubsection*{\ff \T{exit ([code])}}\Deffunc{exit}

Calls the C~function \verb|exit|,
with an optional \verb|code|,
to terminate the program.
The default value for \verb|code| is the success code.

\subsubsection*{\ff \T{getenv (varname)}}\Deffunc{getenv}

Returns the value of the process environment variable \verb|varname|,
or \nil\ if the variable is not defined.

\subsubsection*{\ff \T{setlocale (locale [, category])}}\Deffunc{setlocale}

This function is an interface to the ANSI~C function \verb|setlocale|.
\verb|locale| is a string specifying a locale;
\verb|category| is an optional string describing which category to change:
\verb|"all"|, \verb|"collate"|, \verb|"ctype"|,
\verb|"monetary"|, \verb|"numeric"|, or \verb|"time"|;
the default category is \verb|"all"|.
The function returns the name of the new locale,
or \nil\ if the request cannot be honored.


\section{The Debug Interface} \label{debugI}

Lua has no built-in debugging facilities.
Instead, it offers a special interface,
by means of functions and \emph{hooks},
which allows the construction of different
kinds of debuggers, profilers, and other tools
that need ``inside information'' from the interpreter.
This interface is declared in \verb|luadebug.h|.

\subsection{Stack and Function Information}

\Deffunc{lua_getstack}
The main function to get information about the interpreter stack is
\begin{verbatim}
       int lua_getstack (lua_State *L, int level, lua_Debug *ar);
\end{verbatim}
It fills parts of a \verb|lua_Debug| structure with
an identification of the \emph{activation record}
of the function executing at a given level.
Level~0 is the current running function,
whereas level \Math{n+1} is the function that has called level \Math{n}.
Usually, \verb|lua_getstack| returns 1;
when called with a level greater than the stack depth,
it returns 0.

\Deffunc{lua_Debug}
The structure \verb|lua_Debug| is used to carry different pieces of
information about an active function:
\begin{verbatim}
      typedef struct lua_Debug {
        const char *event;     /* "call", "return" */
        int currentline;       /* (l) */
        const char *name;      /* (n) */
        const char *namewhat;  /* (n) global, tag method, local, field */
        int nups;              /* (u) number of upvalues */
        int linedefined;       /* (S) */
        const char *what;      /* (S) "Lua" function, "C" function, Lua "main" */
        const char *source;    /* (S) */
        char short_src[LUA_IDSIZE]; /* (S) */

        /* private part */
        ...
      } lua_Debug;
\end{verbatim}
\verb|lua_getstack| fills only the private part
of this structure, for future use.
To fill in the other fields of \verb|lua_Debug| with useful information,
call \Deffunc{lua_getinfo}
\begin{verbatim}
       int lua_getinfo (lua_State *L, const char *what, lua_Debug *ar);
\end{verbatim}
This function returns 0 on error
(e.g., an invalid option in \verb|what|).
Each character in the string \verb|what|
selects some fields of \verb|ar| to be filled,
as indicated by the letter in parentheses in the definition of \verb|lua_Debug|:
An \verb|S| fills in the fields \verb|source|, \verb|linedefined|,
and \verb|what|;
\verb|l| fills in the field \verb|currentline|, etc.
Moreover, character \verb|f| pushes onto the stack the function that is
running at the given level.

To get information about a function that is not active (that is,
it is not in the stack),
you push the function onto the stack,
and start the \verb|what| string with the character \verb|>|.
For instance, to know in which line a function \verb|f| was defined,
you can write
\begin{verbatim}
       lua_Debug ar;
       lua_getglobal(L, "f");
       lua_getinfo(L, ">S", &ar);
       printf("%d\n", ar.linedefined);
\end{verbatim}

The fields of \verb|lua_Debug| have the following meaning:
\begin{description}

\item[source]
If the function was defined in a string,
\verb|source| is that string;
if the function was defined in a file,
\verb|source| starts with a \verb|@| followed by the file name.

\item[short\_src]
A ``printable'' version of \verb|source|, to be used in error messages.

\item[linedefined]
the line number where the definition of the function starts.

\item[what] the string \verb|"Lua"| if this is a Lua function,
\verb|"C"| if this is a C~function,
or \verb|"main"| if this is the main part of a chunk.

\item[currentline]
the current line where the given function is executing.
When no line information is available,
\verb|currentline| is set to \Math{-1}.

\item[name]
a reasonable name for the given function.
Because functions in Lua are first class values,
they do not have a fixed name:
Some functions may be the value of many global variables,
while others may be stored only in a table field.
The \verb|lua_getinfo| function checks whether the given
function is a tag method or the value of a global variable.
If the given function is a tag method,
then \verb|name| points to the event name.
If the given function is the value of a global variable,
then \verb|name| points to the variable name.
If the given function is neither a tag method nor a global variable,
then \verb|name| is set to \verb|NULL|.

\item[namewhat]
Explains the previous field.
If the function is a global variable,
\verb|namewhat| is \verb|"global"|;
if the function is a tag method,
\verb|namewhat| is \verb|"tag-method"|;
otherwise \verb|namewhat| is \verb|""| (the empty string).

\item[nups]
Number of upvalues of a function.

\end{description}


\subsection{Manipulating Local Variables}

For the manipulation of local variables,
\verb|luadebug.h| uses indices:
The first parameter has index 1, and so on,
until the last active local variable.

\Deffunc{lua_getlocal}\Deffunc{lua_setlocal}
The following functions allow the manipulation of the
local variables of a given activation record.
\begin{verbatim}
       const char *lua_getlocal (lua_State *L, const lua_Debug *ar, int n);
       const char *lua_setlocal (lua_State *L, const lua_Debug *ar, int n);
\end{verbatim}
The parameter \verb|ar| must be a valid activation record,
filled by a previous call to \verb|lua_getstack| or
given as argument to a hook \see{sub-hooks}.
Function \verb|lua_getlocal| gets the index of a local variable
(\verb|n|), pushes its value onto the stack,
and returns its name.
For \verb|lua_setlocal|,
you push the new value onto the stack,
and the function assigns that value to the variable and returns its name.
Both functions return NULL on failure;
that happens if the index is greater than
the number of active local variables.

As an example, the following function lists the names of all
local variables for a function in a given level of the stack:
\begin{verbatim}
       int listvars (lua_State *L, int level) {
         lua_Debug ar;
         int i = 1;
         const char *name;
         if (lua_getstack(L, level, &ar) == 0)
           return 0;  /* failure: no such level in the stack */
         while ((name = lua_getlocal(L, &ar, i++)) != NULL) {
           printf("%s\n", name);
           lua_pop(L, 1);  /* remove variable value */
         }
         return 1;
       }
\end{verbatim}


\subsection{Hooks}\label{sub-hooks}

The Lua interpreter offers two hooks for debugging purposes:
a \emph{call} hook and a \emph{line} hook.
Both have the same type,
\begin{verbatim}
       typedef void (*lua_Hook) (lua_State *L, lua_Debug *ar);
\end{verbatim}
and you can set them with the following functions:
\Deffunc{lua_Hook}\Deffunc{lua_setcallhook}\Deffunc{lua_setlinehook}
\begin{verbatim}
       lua_Hook lua_setcallhook (lua_State *L, lua_Hook func);
       lua_Hook lua_setlinehook (lua_State *L, lua_Hook func);
\end{verbatim}
A hook is disabled when its value is \verb|NULL|,
which is the initial value of both hooks.
The functions \verb|lua_setcallhook| and \verb|lua_setlinehook|
set their corresponding hooks and return their previous values.

The call hook is called whenever the
interpreter enters or leaves a function.
The \verb|event| field of \verb|ar| has the strings \verb|"call"|
or \verb|"return"|.
This \verb|ar| can then be used in calls to \verb|lua_getinfo|,
\verb|lua_getlocal|, and \verb|lua_setlocal|,
to get more information about the function and to manipulate its
local variables.

The line hook is called every time the interpreter changes
the line of code it is executing.
The \verb|event| field of \verb|ar| has the string \verb|"line"|,
and the \verb|currentline| field has the line number.
Again, you can use this \verb|ar| in other calls to the debug API.

While Lua is running a hook, it disables other calls to hooks.
Therefore, if a hook calls Lua to execute a function or a chunk,
this execution ocurrs without any calls to hooks.

A hook cannot call \T{lua_error}.
It must return to Lua through a regular return.
(There is no problem if the error is inside a chunk or a Lua function
called by the hook, because those errors are protected;
the control returns to the hook anyway.)


\subsection{The Reflexive Debug Interface}

The library \verb|ldblib| provides
the functionality of the debug interface to Lua programs.
If you want to use this library,
your host application must open it,
by calling \verb|lua_dblibopen|.

You should exert great care when using this library.
The functions provided here should be used exclusively for debugging
and similar tasks (e.g., profiling).
Please resist the temptation to use them as a
usual programming tool.
They are slow and violate some (otherwise) secure aspects of the
language (e.g., privacy of local variables).
As a general rule, if your program does not need this library,
do not open it.


\subsubsection*{\ff \T{getinfo (function, [what])}}\Deffunc{getinfo}

This function returns a table with information about a function.
You can give the function directly,
or you can give a number as the value of \verb|function|,
which means the function running at level \verb|function| of the stack:
Level 0 is the current function (\verb|getinfo| itself);
level 1 is the function that called \verb|getinfo|;
and so on.
If \verb|function| is a number larger than the number of active functions,
\verb|getinfo| returns \nil.

The returned table contains all the fields returned by \verb|lua_getinfo|,
with the string \verb|what| describing what to get.
The default for \verb|what| is to get all information available.

For instance, the expression \verb|getinfo(1,"n").name| returns
the name of the current function, if a reasonable name can be found,
and \verb|getinfo(print)| returns a table with all available information
about the \verb|print| function.


\subsubsection*{\ff \T{getlocal (level, local)}}\Deffunc{getlocal}

This function returns the name and the value of the local variable
with index \verb|local| of the function at level \verb|level| of the stack.
(The first parameter has index 1, and so on,
until the last active local variable.)
The function returns \nil\ if there is no local
variable with the given index,
and raises an error when called with a \verb|level| out of range.
(You can call \verb|getstack| to check whether the level is valid.)

\subsubsection*{\ff \T{setlocal (level, local, value)}}\Deffunc{setlocal}

This function assigns the value \verb|value| to the local variable
with index \verb|local| of the function at level \verb|level| of the stack.
The function returns \nil\ if there is no local
variable with the given index,
and raises an error when called with a \verb|level| out of range.

\subsubsection*{\ff \T{setcallhook (hook)}}\Deffunc{setcallhook}

Sets the function \verb|hook| as the call hook;
this hook will be called every time the interpreter starts and
exits the execution of a function.
The only argument to this hook is the event name (\verb|"call"| or
\verb|"return"|).
You can call \verb|getstack| with level 2 to get more information about
the function being called or returning
(level 0 is the \verb|getstack| function,
and level 1 is the hook function).

When called without arguments,
this function turns off call hooks.

\subsubsection*{\ff \T{setlinehook (hook)}}\Deffunc{setlinehook}

Sets the function \verb|hook| as the line hook;
this hook will be called every time the interpreter changes
the line of code it is executing.
The only argument to the hook is the line number the interpreter
is about to execute.

When called without arguments,
this function turns off line hooks.


\section{\Index{Lua Stand-alone}} \label{lua-sa}

Although Lua has been designed as an extension language,
it is frequently used as a stand-alone language.
An interpreter for Lua as a stand-alone language,
called simply \verb|lua|,
is provided with the standard distribution.

This program can be called with any sequence of the following arguments:
\begin{description}\leftskip=20pt
\item[\T{-} ] executes \verb|stdin| as a file;
\item[\T{-c}] calls \verb|lua_close| after running all arguments;
\item[\T{-e} \rm\emph{stat}] executes string \verb|stat|;
\item[\T{-f filename}] executes file \verb|filename| with the
remaining arguments in table \verb|arg|;
\item[\T{-i}] enters interactive mode with prompt;
\item[\T{-q}] enters interactive mode without prompt;
\item[\T{-v}] prints version information;
\item[\T{var=value}] sets global \verb|var| to string \verb|"value"|;
\item[\T{filename}] executes file \verb|filename|.
\end{description}
When called without arguments,
Lua behaves as \verb|lua -v -i| when \verb|stdin| is a terminal,
and as \verb|lua -| otherwise.

All arguments are handled in order, except \verb|-c|.
For instance, an invocation like
\begin{verbatim}
       $ lua -i a=test prog.lua
\end{verbatim}
will first interact with the user until an \verb|EOF| in \verb|stdin|,
then will set \verb|a| to \verb|"test"|,
and finally will run the file \verb|prog.lua|.
(Here,
\verb|$| is the shell prompt. Your prompt may be different.)

When the option \T{-f filename} is used,
all remaining arguments in the command line
are passed to the Lua program in a table called \verb|arg|.
In this table,
the field \verb|n| gets the index of the last argument,
and the field 0 gets the \T{filename}.
For instance, in the call
\begin{verbatim}
       $ lua a.lua -f b.lua t1 t3
\end{verbatim}
the interpreter first runs the file \T{a.lua},
then creates a table \T{arg},
\begin{verbatim}
       arg = {"t1", "t3";  n = 2, [0] = "b.lua"}
\end{verbatim}
and then runs the file \T{b.lua}.
\Deffunc{getargs}
The stand-alone interpreter also provides a \verb|getargs| function that
can be used to access \emph{all} command line arguments.
For instance, if you call Lua with the line
\begin{verbatim}
       $ lua -c a b
\end{verbatim}
and the file \verb|a| (or \verb|b|) calls \verb|getargs|,
the call will return the table
\begin{verbatim}
       {[0] = "lua", [1] = "-c", [2] = "a", [3] = "b", n = 3}
\end{verbatim}

In interactive mode,
a multi-line statement can be written finishing intermediate
lines with a backslash (`\verb|\|').
If the global variable \verb|_PROMPT| is defined as a string,
then its value is used as the prompt. \index{_PROMPT}
Therefore, the prompt can be changed directly on the command line:
\begin{verbatim}
       $ lua _PROMPT='myprompt> ' -i
\end{verbatim}

In Unix systems, Lua scripts can be made into executable programs
by using \verb|chmod +x| and the~\verb|#!| form,
as in \verb|#!/usr/local/bin/lua|,
or \verb|#!/usr/local/bin/lua -f| to get other arguments.


\section*{Acknowledgments}

The authors would like to thank CENPES/PETROBRAS which,
jointly with \tecgraf, used early versions of
this system extensively and gave valuable comments.
The authors would also like to thank Carlos Henrique Levy,
who found the name of the game.
Lua means ``moon'' in Portuguese.


\appendix

\section*{Incompatibilities with Previous Versions}
\addcontentsline{toc}{section}{Incompatibilities with Previous Versions}

Lua 4.0 is a major revision of the language.
We took a great care to avoid incompatibilities with
the previous public versions of Lua,
some differences had to be introduced.
Here is a list of all these incompatibilities.


\subsection*{Incompatibilities with \Index{version 3.2}}

\subsubsection*{Changes in the Language}
\begin{itemize}

\item
All pragmas (\verb|$debug|, \verb|$if|, \ldots) have been removed.

\item
\rwd{for}, \rwd{break}, and \rwd{in} now are reserved words.

\item
Garbage-collection tag methods for tables is now deprecated.

\item
There is now only one tag method for order operators.

\item
In nested function calls like \verb|f(g(x))|
\emph{all} return values from \verb|g| are passed as arguments to \verb|f|.
This only happens when \verb|g| is the last
or the only argument to \verb|f|.

\item
The pre-compiler may assume that some operators are associative,
for optimizations.
This may cause problems if these operators
have non-associative tag methods.

\item Old pre-compiled code is obsolete, and must be re-compiled.

\end{itemize}


\subsubsection*{Changes in the Libraries}
\begin{itemize}

\item
When traversing a table with \verb|next| or \verb|foreach|,
the table cannot be modified in any way.

\item
General read patterns are now deprecated.

\item
The functions \verb|rawgettable| and \verb|rawsettable|
have been renamed to \verb|rawget| and \verb|rawset|.

\item
The functions \verb|foreachvar|, \verb|nextvar|,
\verb|rawsetglobal|, and \verb|rawgetglobal| are deprecated.
You can get their functionality using table operations
over the table of globals,
which is returned by \verb|globals|.

\item
\verb|setglobal| and \verb|sort| no longer return a value;
\verb|type| no longer returns a second value.

\item
The \verb|p| option in function \verb|call| is deprecated.

\end{itemize}


\subsubsection*{Changes in the API}
\begin{itemize}

\item
The API has been completely rewritten:
It is now fully reentrant and much clearer.

\item
The debug API has been completely rewritten.

%\item
%A \verb|const| qualifier has been added to \verb|char*|
%in all API functions that handle C~strings.
%
%\item
%Some variables of type \verb|long| were changed to \verb|size_t|.
%
%\item
%\verb|luaL_openlib| no longer automatically calls \verb|lua_open|.
%So,
%you must now explicitly call \verb|lua_open| before opening
%the standard libraries.
%
%\item
%\verb|lua_type| now returns a string describing the type,
%and is no longer a synonym for \verb|lua_tag|.

\end{itemize}

%{===============================================================
\section*{The Complete Syntax of Lua} \label{BNF}

\addcontentsline{toc}{section}{The complete syntax of Lua}

\renewenvironment{Produc}{\vspace{0.8ex}\par\noindent\hspace{3ex}\it\begin{tabular}{rrl}}{\end{tabular}\vspace{0.8ex}\par\noindent}

\renewcommand{\OrNL}{\\ & \Or & }

\begin{Produc}

\produc{chunk}{\rep{stat \opt{\ter{;}}}}

\produc{block}{chunk}

\produc{stat}{%
	varlist1 \ter{=} explist1
\OrNL	functioncall
\OrNL	\rwd{do} block \rwd{end}
\OrNL	\rwd{while} exp1 \rwd{do} block \rwd{end}
\OrNL	\rwd{repeat} block \rwd{until} exp1
\OrNL	\rwd{if} exp1 \rwd{then} block
	\rep{\rwd{elseif} exp1 \rwd{then} block}
	\opt{\rwd{else} block} \rwd{end}
\OrNL	\rwd{return} \opt{explist1}
\OrNL	\rwd{break}
\OrNL	\rwd{for} \Nter{name} \ter{=} exp1 \ter{,} exp1 \opt{\ter{,} exp1}
	\rwd{do} block \rwd{end}
\OrNL   \rwd{for} \Nter{name} \ter{,} \Nter{name} \rwd{in} exp1
                    \rwd{do} block \rwd{end}
\OrNL	\rwd{function} funcname \ter{(} \opt{parlist1} \ter{)} block \rwd{end}
\OrNL	\rwd{local} declist \opt{init}
}

\produc{funcname}{%
	\Nter{name}
\Or	\Nter{name} \ter{.} \Nter{name}
\Or	\Nter{name} \ter{:} \Nter{name}
}

\produc{varlist1}{var \rep{\ter{,} var}}

\produc{var}{%
	\Nter{name}
\Or	varorfunc \ter{[} exp1 \ter{]}
\Or	varorfunc \ter{.} \Nter{name}
}

\produc{varorfunc}{var \Or functioncall}

\produc{declist}{\Nter{name} \rep{\ter{,} \Nter{name}}}

\produc{init}{\ter{=} explist1}

\produc{explist1}{\rep{exp1 \ter{,}} exp}

\produc{exp1}{exp}

\produc{exp}{%
	\rwd{nil}
\Or	\Nter{number}
\Or	\Nter{literal}
\Or	var
\Or	function
\Or	upvalue
\OrNL	functioncall
\Or	tableconstructor
\Or	\ter{(} exp \ter{)}
\Or	exp binop exp
\Or	unop exp
}


\produc{functioncall}{%
	varorfunc args
\Or	varorfunc \ter{:} \Nter{name} args
}

\produc{args}{%
	\ter{(} \opt{explist1} \ter{)}
\Or	tableconstructor
\Or	\Nter{literal}
}

\produc{function}{\rwd{function} \ter{(} \opt{parlist1} \ter{)} block \rwd{end}}

\produc{parlist1}{%
	\ter{\ldots}
\Or	\Nter{name} \rep{\ter{,} \Nter{name}} \opt{\ter{,} \ter{\ldots}}
}

\produc{upvalue}{\ter{\%} \Nter{name}}

\produc{tableconstructor}{\ter{\{} fieldlist \ter{\}}}
\produc{fieldlist}{%
	lfieldlist
\Or	ffieldlist
\Or	lfieldlist \ter{;} ffieldlist
\Or	ffieldlist \ter{;} lfieldlist
}
\produc{lfieldlist}{\opt{lfieldlist1}}
\produc{ffieldlist}{\opt{ffieldlist1}}
\produc{lfieldlist1}{exp \rep{\ter{,} exp} \opt{\ter{,}}}
\produc{ffieldlist1}{ffield \rep{\ter{,} ffield} \opt{\ter{,}}}
\produc{ffield}{%
	\ter{[} exp \ter{]} \ter{=} exp
\Or	\Nter{name} \ter{=} exp
}

\produc{binop}{\ter{+} \Or \ter{-} \Or \ter{*} \Or \ter{/} \Or \ter{\^{ }} \Or
  \ter{..} \OrNL \ter{<} \Or \ter{<=} \Or \ter{>} \Or \ter{>=}
  \Or \ter{==} \Or \ter{\~{ }=} \OrNL \rwd{and} \Or \rwd{or}}

\produc{unop}{\ter{-} \Or \rwd{not}}

\end{Produc}
%}===============================================================

% restore underscore to usual meaning
\catcode`\_=8

\newcommand{\indexentry}[2]{\item {#1} #2}
\begin{theindex}
\addcontentsline{toc}{section}{Index}
\input{manual.id}
\end{theindex}

\end{document}
