% $Id: manual.tex,v 2.7 1997/06/27 18:39:34 roberto Exp roberto $

\documentstyle[fullpage,11pt,bnf]{article}

\newcommand{\rw}[1]{{\bf #1}}
\newcommand{\See}[1]{Section~\ref{#1}}
\newcommand{\see}[1]{(see \See{#1})}
\newcommand{\M}[1]{\emph{#1}}
\newcommand{\Math}[1]{$#1$}
\newcommand{\nil}{{\bf nil}}
\newcommand{\Line}{\rule{\linewidth}{.5mm}}
\def\tecgraf{{\sf TeC\kern-.21em\lower.7ex\hbox{Graf}}}

\newcommand{\Index}[1]{#1\index{#1}}
\newcommand{\IndexVerb}[1]{{\tt #1}\index{#1}}
\newcommand{\Def}[1]{{\em #1}\index{#1}}
\newcommand{\Deffunc}[1]{\index{#1}}

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

\newcommand{\Version}{3.0}

\makeindex

\begin{document}

\title{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 \verb$Date: 1997/06/27 18:39:34 $}

\maketitle

\thispagestyle{empty}
\pagestyle{empty}

\begin{abstract}
\noindent
Lua is an extension programming language designed to be used
as a configuration language for any program that needs one.
This document describes version \Version\ of the Lua programming language and
the API that allows interaction between Lua programs and their host C programs.
\end{abstract}

\vspace{4ex}
\begin{quotation}
\small
\begin{center}{\bf Sum\'ario}\end{center}
\vspace{1ex}
\noindent
Lua \'e uma linguagem de extens\~ao projetada para ser usada como
linguagem de configura\c{c}\~ao em qualquer programa que precise de
uma.
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{quotation}


\vfill
\begin{quotation}
\noindent
\footnotesize
Copyright \copyright\ 1994--1997 TeCGraf, PUC-Rio.
Written by Waldemar Celes Filho,
Roberto Ierusalimschy, Luiz Henrique de Figueiredo.
All rights reserved.
%
Permission is hereby granted, without written agreement and without license or
royalty fees, to use, copy, modify, and distribute this software and its
documentation for any purpose, subject to the following conditions:
%
The above copyright notice and this permission notice shall appear in all
copies or substantial portions of this software.
%
The name ``Lua'' cannot be used for any modified form
of this software that does not originate from the authors.
Nevertheless, the name ``Lua'' may and should be
used to designate the language implemented and described in this package,
even if embedded in any other system, as long as its syntax and semantics
remain unchanged.
%
The authors specifically disclaim any warranties, including,
but not limited to, the implied warranties of merchantability
and fitness for a particular purpose.
The software 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 liable to any party for direct, indirect, special, incidental, or
consequential damages arising out of the use of this software and its
documentation.
\end{quotation}
\vfill

\newpage

\tableofcontents

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


\section{Introduction}

Lua is an extension programming language designed to support
general procedural programming with data description
facilities.
It is intended to be used as a light-weight, but powerful,
configuration language for any program that needs one.
Lua has been designed and implemented by
W.~Celes,
R.~Ierusalimschy and
L.~H.~de Figueiredo.

Lua is implemented as a library, written in C.
Being an extension language, Lua has no notion of a ``main'' program:
it only works {\em embedded\/} in a host client,
called the {\em 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 provided as usual with no guarantees,
as stated in the copyright notice in the front page of this manual.
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/lua.tar.gz
\end{verbatim}


\section{Environment and Chunks}

All statements in Lua are executed in a \Def{global environment}.
This environment, which keeps all global variables and functions,
is initialized at the beginning of the embedding program and
persists until its end.

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

\Index{Global variables} do not need declaration.
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}.

The unit of execution of Lua is called a \Def{chunk}.
The syntax%
\footnote{As usual, \rep{{\em a}} means 0 or more {\em a\/}'s,
\opt{{\em a}} means an optional {\em a} and \oneormore{{\em a}} means
one or more {\em a\/}'s.}
for chunks is:
\begin{Produc}
\produc{chunk}{\rep{stat \Or function} \opt{ret}}
\end{Produc}%
A chunk may contain statements and function definitions,
and may be in a file or in a string inside the host program.
A chunk may optionally end with a \verb|return| statement \see{return}.
When a chunk is executed, first all its functions and statements are compiled,
then the statements are executed in sequential order.
All modifications a chunk effects on the global environment persist
after its end.
Those include modifications to global variables and definitions
of new functions%
\footnote{Actually, a function definition is an
assignment to a global variable \see{TypesSec}.}.

Chunks may 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 dynamically typed language.
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 \Index{tag}.

There are six \Index{basic types} in Lua: \Def{nil}, \Def{number},
\Def{string}, \Def{function}, \Def{userdata}, and \Def{table}.
{\em Nil\/} is the type of the value \nil,
whose main property is to be different from any other value.
{\em Number\/} represents real (floating-point) numbers,
while {\em string\/} has the usual meaning.
The function \verb|type| returns a string describing the type
of a given value \see{pdf-type}.

Functions are considered first-class values in Lua.
This means that functions can be stored in variables,
passed as arguments to other functions and returned as results.
When a function is defined in Lua, its body is compiled and stored
in a given variable.
Lua can call (and manipulate) functions written in Lua and
functions written in C.
They 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 a Lua function.

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

The type {\em 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.
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 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
itself as the first parameter \see{func-def}.

It is important to notice that tables are {\em objects}, and not values.
Variables cannot contain tables, only {\em 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}.

Tags are mainly used to select tag methods when
some events occur \see{tag-method}.
Each of the types nil, number and string has a different tag.
All values of each of these types have this same pre-defined tag.
Values of type function can have two different tags,
depending on whether they are Lua or C functions.
Finally,
values of type userdata and table can have
as many different tags as needed \see{tag-method}.
Tags are created with the function \verb|newtag|,
and the function \verb|tag| returns the tag of a given value.
To change the tag of a given table,
there is the function \verb|settag| \see{pdf-newtag}.


\section{The Language}

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


\subsection{Lexical Conventions} \label{lexical}

Lua is a case-sensitive language.
\Index{Identifiers} can be any string of letters, digits, and underscores,
not beginning with a digit.
The following words are reserved, and cannot be used as identifiers:
\index{reserved words}
\begin{verbatim}
      and       do        else      elseif
      end       function  if        local
      nil       not       or        repeat
      return    then      until     while
\end{verbatim}

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

\Index{Literal strings} can be delimited by matching single or double quotes,
and can contain the C-like escape sequences
\verb|'\n'|, \verb|'\t'| and \verb|'\r'|.
Literal strings can also be delimited by matching \verb|[[ ... ]]|.
Literals in this bracketed form may run for several lines,
may contain nested \verb|[[ ... ]]| pairs,
and do not interpret escape sequences.
This form is specially convenient for
handling strings that contain program pieces or
other quoted strings.

\Index{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 file is skipped if it starts with \verb|#|%
\footnote{This facility allows the use of Lua as a script interpreter
in Unix systems \see{lua-sa}.}.

\Index{Numerical constants} may be written with an optional decimal part,
and an optional decimal exponent.
Examples of valid numerical constants are:
\begin{verbatim}
       4     4.0     0.4     4.57e-3     0.3e12
\end{verbatim}

\subsection{The \Index{Pre-processor}} \label{pre-processor}

All lines that start with a \verb|$| are handled by a pre-processor.
The \verb|$| can be followed by any of the following directives:
\begin{description}
\item[{\tt debug}] --- turn on some debugging facilities \see{pragma}.
\item[{\tt nodebug}] --- turn off some debugging facilities \see{pragma}.
\item[{\tt if \M{cond}}] --- starts a conditional part.
If \M{cond} is false, then this part is skipped by the lexical analyzer.
\item[{\tt ifnot \M{cond}}] --- starts a conditional part.
If \M{cond} is true, then this part is skipped by the lexical analyzer.
\item[{\tt end}] --- ends a conditional part.
\item[{\tt else}] --- starts an ``else'' conditional part,
switching the ``skip'' status.
\item[{\tt endinput}] --- ends the lexical parse of the file.
\end{description}

Directives can be freely nested.
Particularly, a \verb|$endinput| may occur inside a \verb|$if|;
in that case, even the matching \verb|$end| is not parsed.

A \M{cond} part may be:
\begin{description}
\item[{\tt nil}] --- always false.
\item[{\tt 1}] --- always true.
\item[\M{name}] --- true if the value of the
global variable \M{name} is different from \nil.
Notice that \M{name} is evaluated before the chunk starts its execution.
Therefore, actions in a chunk do not affect its own conditional directives.
\end{description}

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

Lua provides some automatic conversions between values.
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, according to the following rule:
if the number is an integer, it is written without exponent or decimal point;
otherwise, it is formatted following the \verb|%g|
conversion specification of the \verb|printf| function in the
standard C library.
For complete control on 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,
the system does not know how many values a function will return,
or how many parameters it needs.
Therefore, sometimes, a list of values must be {\em adjusted\/}, at run time,
to a given length.
If there are more values than are needed, then the last values are thrown away.
If there are more needs than values, then the list is extended with as
many  \nil's as needed.
Adjustment occurs in multiple assignment and function calls.


\subsection{Statements}

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, which are executed sequentially.
Any statement can be optionally followed by a semicolon:
\begin{Produc}
\produc{block}{\rep{stat sc} \opt{ret}}
\produc{sc}{\opt{\ter{;}}}
\end{Produc}%
For syntactic reasons, a \IndexVerb{return} statement can only be written
as the last statement of a block.
This restriction also avoids some ``statement not reached'' conditions.

\subsubsection{\Index{Assignment}} \label{assignment}
The language 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.
Both lists have their elements 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.
Therefore, it can be used to exchange two values, as in
\begin{verbatim}
   x, y = y, x
\end{verbatim}
The two lists may have different lengths.
Before the assignment, the list of values is {\em adjusted\/} to
the length of the list of variables \see{adjust}.

A single name can denote a global or 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}{var \ter{[} exp1 \ter{]}}
\end{Produc}%
The \verb|var| should result in a table value,
where the field indexed by the expression value gets the assigned value.

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 description of these functions%
\footnote{Function \verb|setglobal| is pre-defined in Lua.
Function {\tt settable\_event} is used only for explanation purposes.}.

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

\subsubsection{Control Structures}
The \Index{condition expression} of a control structure may return any value.
All values different from \nil\ are considered true;
only \nil\ is considered false.
{\tt if}'s, {\tt while}'s and {\tt repeat}'s have the usual meaning.

\index{while-do}\index{repeat-until}\index{if-then-else}
\begin{Produc}
\produc{stat}{\rwd{while} exp1 \rwd{do} block \rwd{end} \OrNL
\rwd{repeat} block \rwd{until} exp1 \OrNL
\rwd{if} exp1 \rwd{then} block \rep{elseif}
   \opt{\rwd{else} block} \rwd{end}}
\produc{elseif}{\rwd{elseif} exp1 \rwd{then} block}
\end{Produc}

A {\tt return} is used to return values from a function or a chunk.
\label{return}
Because they may return more than one value,
the syntax for a \Index{return statement} is:
\begin{Produc}
\produc{ret}{\rwd{return} \opt{explist1} \opt{sc}}
\end{Produc}

\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, returned values are thrown away.
Function calls are explained in Section~\ref{functioncall}.

\subsubsection{Local Declarations} \label{localvar}
\Index{Local variables} may be declared anywhere inside a block.
Their scope begins after the declaration and lasts until the
end of the 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.


\subsection{\Index{Expressions}}

\subsubsection{\Index{Simple Expressions}}
Simple expressions are:
\begin{Produc}
\produc{exp}{\ter{(} exp \ter{)}}
\produc{exp}{\rwd{nil}}
\produc{exp}{\ter{number}}
\produc{exp}{\ter{literal}}
\produc{exp}{var}
\end{Produc}%
Numbers (numerical constants) and
string literals are explained in Section~\ref{lexical}.
Variables are explained in Section~\ref{assignment}.

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%
\footnote{Function \verb|getglobal| is pre-defined in Lua.
Function {\tt gettable\_event} is used only for explanation 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 Section~\ref{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}
Lua provides the following \Index{relational operators}:
\begin{verbatim}
       <   >   <=  >=  ~=  ==
\end{verbatim}
All these return \nil\ as false and a value different from \nil\ as true.

Equality first compares the types 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 same table.
The operator \verb|~=| is exactly the negation of equality (\verb|==|).
Note that the conversion rules of Section~\ref{coercion}
{\em do not\/} apply to equality comparisons.
Thus, \verb|"0"==0| evaluates to false.

The other operators work as follows.
If both arguments are numbers, then they are compared as such.
Otherwise, if both arguments are strings,
their values are compared using lexicographical order.
Otherwise, the ``order'' tag method is called \see{tag-method}.
%Note that the conversion rules of Section~\ref{coercion}
%do apply to order operators.
%Thus, \verb|"2">"12"| evaluates to true.

\subsubsection{Logical Operators}
Like control structures, all logical operators
consider \nil\ as false and anything else as true.
The \Index{logical operators} are:
\index{and}\index{or}\index{not}
\begin{verbatim}
             and   or   not
\end{verbatim}
The operator \verb|and| returns \nil\ if its first argument is \nil;
otherwise, it returns its second argument.
The 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.

\subsubsection{Concatenation}
Lua offers a string \Index{concatenation} operator,
denoted by ``\IndexVerb{..}''.
If operands are strings or numbers, then they are converted to
strings according to the rules in Section~\ref{coercion}.
Otherwise, the ``concat'' tag method is called \see{tag-method}.

\subsubsection{Precedence}
\Index{Operator precedence} 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.

\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}
\produc{lfieldlist}{\opt{lfieldlist1}}
\produc{ffieldlist}{\opt{ffieldlist1}}
\end{Produc}

The form {\em 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 essentially equivalent to:
\begin{verbatim}
   temp = {}
   temp[1] = "v1"
   temp[2] = "v2"
   temp[3] = 34
   a = temp
\end{verbatim}

The form {\em 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 essentially equivalent to:
\begin{verbatim}
   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{verbatim}
An expression like \verb|{x = 1, y = 4}| is
in fact syntactic sugar for \verb|{["x"] = 1, ["y"] = 4}|.

\subsubsection{Function Calls}  \label{functioncall}
A \Index{function call} has the following syntax:
\begin{Produc}
\produc{functioncall}{var realParams}
\end{Produc}%
Here, \M{var} can be any variable (global, local, indexed, etc).
If its value has type {\em function\/},
then this function is called.
Otherwise, the ``function'' tag method is called,
having as first parameter the value of \M{var},
and then the original call parameters.

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

\begin{Produc}
\produc{realParams}{\ter{(} \opt{explist1} \ter{)}}
\produc{realParams}{tableconstructor}
\produc{explist1}{exp1 \rep{\ter{,} exp1}}
\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.

Because a function can return any number of results
\see{return},
the number of results must be adjusted before 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.


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

Functions in Lua can be defined anywhere in the global level of a chunk.
The syntax for function definition is:
\begin{Produc}
\produc{function}{\rwd{function} var \ter{(} \opt{parlist1} \ter{)}
  block \rwd{end}}
\end{Produc}

When Lua pre-compiles a chunk,
all its function bodies are pre-compiled, too.
Then, when Lua ``executes'' the function definition,
its body is stored, with type {\em function},
into the variable \verb|var|.
It is in this sense that
a function definition is an assignment to a global variable.

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,
indicated by the dots (\ldots) at the end of its parameter list.
A vararg function does not adjust its argument list;
instead, it collects any extra arguments in an implicit parameter,
called \Def{arg}.
This parameter is always initialized as a table,
with a field \verb|n| with the number of extra arguments,
and the extra arguments at positions 1, 2, \ldots

As an example, suppose definitions like:
\begin{verbatim}
      function f(a, b) end
      function g(a, b, ...) 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

     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}
\end{verbatim}

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

There is a special syntax for defining \Index{methods},
that is, functions that have an extra parameter \Def{self}.
\begin{Produc}
\produc{function}{\rwd{function} var \ter{:} name \ter{(} \opt{parlist1}
  \ter{)} block \rwd{end}}
\end{Produc}%
Thus, a declaration like
\begin{verbatim}
function v:f (...)
  ...
end
\end{verbatim}
is equivalent to
\begin{verbatim}
function v.f (self, ...)
  ...
end
\end{verbatim}
that is, the function gets an extra formal parameter called \verb|self|.
Notice that
the variable \verb|v| must have been
previously initialized with a table value.


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

Lua provides a powerful mechanism to extend its semantics,
called \Def{Tag Methods}.
A tag method (TM) is a programmer-defined function
that can be called at many key points of the evaluation of a program,
allowing a 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 the event name
(a string, see below),
and the third parameter is the new method (a function),
or \nil\ to restore the default behavior.
The function returns the previous tag method.
Another 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.
The function not only shows when a tag method is called,
but also its arguments, its results and the default behavior.
Please notice that the code shown here is only 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|rawgetglobal|, \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| 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}
\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 \verb|"add"| event.

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

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

\item[``pow'':]\index{pow event}
called when a \verb|^| operation is applied.
\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 an 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 a \verb|<| operation is applied to non numerical
or non string operands.
\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}

\item[``gt'':]\index{gt event}
called when a \verb|>| operation is applied to non numerical
or non string operands.
Behavior similar to \verb|"lt"| event.

\item[``le'':]\index{le event}
called when a \verb|<=| operation is applied to non numerical
or non string operands.
Behavior similar to \verb|"lt"| event.

\item[``ge'':]\index{ge event}
called when a \verb|>=| operation is applied to non numerical
or non string operands.
Behavior similar to \verb|"lt"| event.

\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 event \verb|"gettable"| for its semantics.

\item[``getglobal'':]\index{getglobal event}
called whenever Lua accesses a global variable.
This method can only be set for \nil\ and for tags
created by \verb|newtag|.
\begin{verbatim}
      function getglobal (varname)
        local value = rawgetglobal(varname)
        local tm = gettagmethod(tag(value), "getglobal")
        if not tm then
          return value
        else
          return tm(varname, value)
        end
      end
\end{verbatim}
Notice: the function \verb|getglobal| is pre-defined in Lua \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 default tags.
\begin{verbatim}
      function setglobal (varname, newvalue)
        local oldvalue = rawgetglobal(varname)
        local tm = gettagmethod(tag(oldvalue), "setglobal")
        if not tm then
          return rawsetglobal(varname, newvalue)
        else
          return tm(varname, oldvalue, newvalue)
        end
      end
\end{verbatim}
Notice: the function \verb|setglobal| is pre-defined in Lua \see{predefined}.

\item[``gettable'':]\index{gettable event}
called whenever Lua accesses an indexed variable.
This method cannot be set for tables with 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 = rawgettable(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 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
          rawsettable(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
            local i = arg.n
            while i > 0 do
              arg[i+1] = arg[i]
              i = i-1
            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 an object.
This method cannot be set for strings, numbers, functions,
and userdata with default tag.
For each object 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)|.

\end{description}



\subsection{Error Handling} \label{error}

Because Lua is an extension language,
all Lua actions start from C code calling a function from the Lua library.
Whenever an error occurs during Lua compilation or execution,
the \Def{error method} is called,
and then the corresponding function from the library
(\verb|lua_dofile|, \verb|lua_dostring|, or \verb|lua_callfunction|)
is terminated returning an error condition.

The only argument to the error method is a string
describing the error.
The default method prints this message in \verb|stderr|.
If needed, it is possible to change the error method with the
function \verb|seterrormethod|,
which gets the new error handler as its only parameter
\see{pdf-seterrormethod}.
The standard I/O library uses this facility to redefine the error method,
using the debug facilities \see{debugI},
in order to print some extra information,
like the call stack.

To provide more information about errors,
Lua programs should include the compilation pragma \verb|$debug|.
\index{debug pragma}\label{pragma}
When an error occurs in a program compiled with this option,
the I/O error routine is able to print the number of the
lines where the calls (and the error) were made.

Lua code can explicitly generate an error by calling the built-in
function \verb|error| \see{pdf-error}.


\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 the Lua library.
The API functions can be classified in the following categories:
\begin{enumerate}
\item exchanging values between C and Lua;
\item executing Lua code;
\item manipulating (reading and writing) Lua objects;
\item calling Lua functions;
\item C functions to be called by Lua;
\item manipulating references to Lua Objects.
\end{enumerate}
All API functions and related types and constants
are declared in the header file \verb|lua.h|.

\subsection{Exchanging Values between C and Lua} \label{valuesCLua}
Because Lua has no static type system,
all values passed between Lua and C have type
\verb|lua_Object|\Deffunc{lua_Object},
which works like an abstract type in C that can hold any Lua value.
Values of type \verb|lua_Object| have no meaning outside Lua;
for instance,
the comparison of two \verb|lua_Object's| is undefined.

To check the type of a \verb|lua_Object|,
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}
\begin{verbatim}
int            lua_isnil                (lua_Object object);
int            lua_isnumber             (lua_Object object);
int            lua_isstring             (lua_Object object);
int            lua_istable              (lua_Object object);
int            lua_isfunction           (lua_Object object);
int            lua_iscfunction          (lua_Object object);
int            lua_isuserdata           (lua_Object object);
\end{verbatim}
All macros return 1 if the object is compatible with the given type,
and 0 otherwise.
The function \verb|lua_isnumber| accepts numbers and numerical strings,
whereas
\verb|lua_isstring| accepts strings and numbers \see{coercion},
and \verb|lua_isfunction| accepts Lua and C functions.

To check the tag of a \verb|lua_Object|,
the following function is available:
\Deffunc{lua_tag}
\begin{verbatim}
int            lua_tag                  (lua_Object object);
\end{verbatim}

To translate a value from type \verb|lua_Object| to a specific C type,
the programmer can use:
\Deffunc{lua_getnumber}\Deffunc{lua_getstring}
\Deffunc{lua_getcfunction}\Deffunc{lua_getuserdata}
\begin{verbatim}
float          lua_getnumber            (lua_Object object);
char          *lua_getstring            (lua_Object object);
lua_CFunction  lua_getcfunction         (lua_Object object);
void          *lua_getuserdata          (lua_Object object);
\end{verbatim}

\verb|lua_getnumber| converts a \verb|lua_Object| to a floating-point number.
This \verb|lua_Object| must be a number or a string convertible to number
\see{coercion}; otherwise, the function returns~0.

\verb|lua_getstring| converts a \verb|lua_Object| to a string (\verb|char*|).
This \verb|lua_Object| must be a string or a number;
otherwise, the function returns~0 (the \verb|NULL| pointer).
This function does not create a new string,
but returns a pointer to a string inside the Lua environment.
Because Lua has garbage collection,
there is no guarantee that such pointer will be valid after the block ends
(see below).

\verb|lua_getcfunction| converts a \verb|lua_Object| to a C function.
This \verb|lua_Object| must have type {\em CFunction\/};
otherwise, the function returns 0 (the \verb|NULL| pointer).
The type \verb|lua_CFunction| is explained in Section~\ref{LuacallC}.

\verb|lua_getuserdata| converts a \verb|lua_Object| to \verb|void*|.
This \verb|lua_Object| must have type {\em userdata\/};
otherwise, the function returns 0 (the \verb|NULL| pointer).

Because Lua has automatic memory management and garbage collection,
a \verb|lua_Object| has a limited scope,
and is only valid inside the {\em block\/} where it was created.
A C function called from Lua is a block,
and its parameters are valid only until its end.
It is good programming practice to convert Lua objects to C values
as soon as they are available,
and never to store \verb|lua_Object|s in C global variables.

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


All communication between Lua and C is done through two
abstract data types, called \Def{lua2C} and \Def{C2lua}.
The first one, as the name implies, is used to pass values
from Lua to C: parameters when Lua calls C and results when C calls Lua.
The structure C2lua is used in the reverse direction:
parameters when C calls Lua and results when Lua calls C.

The structure lua2C is an abstract array,
which can be indexed with the function:
\Deffunc{lua_lua2C}
\begin{verbatim}
lua_Object lua_lua2C (int number);
\end{verbatim}
where \verb|number| starts with 1.
When called with a number larger than the array size,
this function returns \verb|LUA_NOOBJECT|\Deffunc{LUA_NOOBJECT}.
In this way, it is possible to write C functions that receive
a variable number of parameters,
and to call Lua functions that return a variable number of results.
Notice that the structure lua2C cannot be directly modified by C code.

The second structure, C2lua, is a stack.
Pushing elements into this stack
is done with the following functions:
\Deffunc{lua_pushnumber}\Deffunc{lua_pushstring}
\Deffunc{lua_pushcfunction}\Deffunc{lua_pushusertag}
\Deffunc{lua_pushnil}\Deffunc{lua_pushobject}
\Deffunc{lua_pushuserdata}\label{pushing}
\begin{verbatim}
void           lua_pushnumber           (double n);
void           lua_pushstring           (char *s);
void           lua_pushcfunction        (lua_CFunction f);
void           lua_pushusertag          (void *u, int tag);
void           lua_pushnil              (void);
void           lua_pushobject           (lua_Object object);
\end{verbatim}
All of them receive a C value,
convert it to a corresponding \verb|lua_Object|,
and leave the result on the top of C2lua.
The function
\Deffunc{lua_pop}
\begin{verbatim}
lua_Object     lua_pop                  (void);
\end{verbatim}
returns a reference to the object at the top of the C2lua stack,
and pops it.

As a general rule, all API functions pop from the stack
all elements that they use. 

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,
that userdata is pushed.
Otherwise, a new userdata is created, with the given value and tag.
If this function is called with
\verb|tag|=\verb|LUA_ANYTAG|\Deffunc{LUA_ANYTAG},
then Lua will try to find any userdata with the given value,
no matter its tag.
If there is no userdata with that value, then a new one is created,
with tag=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               (void);
\end{verbatim}
The function \verb|lua_settag| changes the tag of
the object on the top of C2lua (and pops it);
the object must be a userdata or a table.
\Deffunc{lua_settag}
\begin{verbatim}
void           lua_settag               (int tag);
\end{verbatim}
\verb|tag| must be a value created with \verb|lua_newtag|.

When C code calls Lua repeatedly, as in a loop,
objects returned by these calls can accumulate,
and may cause a stack overflow.
To avoid this,
nested blocks can be defined with the functions:
\begin{verbatim}
void           lua_beginblock           (void);
void           lua_endblock             (void);
\end{verbatim}
After the end of the block,
all \verb|lua_Object|'s created inside it are released.
The use of explicit nested blocks is strongly encouraged.

\subsection{Executing Lua Code}
A host program can execute Lua chunks written in a file or in a string
using the following functions:%
\Deffunc{lua_dofile}\Deffunc{lua_dostring}
\begin{verbatim}
int lua_dofile   (char *filename);
int lua_dostring (char *string);
\end{verbatim}
Both functions return an error code:
0, in case of success; non zero, in case of errors.
More specifically, \verb|lua_dofile| returns 2 if for any reason
it could not open the file.
The function \verb|lua_dofile|, if called with argument \verb|NULL|,
executes the \verb|stdin| stream.
Function \verb|lua_dofile| is also able to execute pre-compiled chunks.
It automatically detects whether the file is text or binary,
and loads it accordingly (see program \IndexVerb{luac}).

These functions return, in structure lua2C,
any values eventually returned by the chunks.
They also empty the stack C2lua.


\subsection{Manipulating Lua Objects}
To read the value of any global Lua variable,
one uses the function:
\Deffunc{lua_getglobal}
\begin{verbatim}
lua_Object     lua_getglobal            (char *varname);
\end{verbatim}
As in Lua, this function may trigger a tag method.
To read the real value of any global variable,
without invoking any tag method,
this function has a {\em raw\/} version:
\Deffunc{lua_rawgetglobal}
\begin{verbatim}
lua_Object     lua_rawgetglobal         (char *varname);
\end{verbatim}

To store a value previously pushed onto C2lua in a global variable,
there is the function:
\Deffunc{lua_setglobal}
\begin{verbatim}
void           lua_setglobal            (char *varname);
\end{verbatim}
As in Lua, this function may trigger a tag method.
To set the real value of any global variable,
without invoking any tag method,
this function has a {\em raw\/} version:
\Deffunc{lua_rawgetglobal}
\begin{verbatim}
void           lua_rawsetglobal         (char *varname);
\end{verbatim}

Tables can also be manipulated via the API.
The function
\Deffunc{lua_gettable}
\begin{verbatim}
lua_Object     lua_gettable             (void);
\end{verbatim}
pops from the stack C2lua a table and an index,
and returns the contents of the table at that index.
As in Lua, this operation may trigger a tag method.
To get the real value of any table index,
without invoking any tag method,
this function has a {\em raw\/} version:
\Deffunc{lua_rawgetglobal}
\begin{verbatim}
lua_Object     lua_rawgettable          (void);
\end{verbatim}

To store a value in an index,
the program must push the table, the index,
and the value onto C2lua,
and then call the function:
\Deffunc{lua_settable}
\begin{verbatim}
void           lua_settable             (void);
\end{verbatim}
Again, the tag method for ``settable'' may be called.
To set the real value of any table index,
without invoking any tag method,
this function has a {\em raw\/} version:
\Deffunc{lua_rawsettable}
\begin{verbatim}
void           lua_rawsettable          (void);
\end{verbatim}

Finally, the function
\Deffunc{lua_createtable}
\begin{verbatim}
lua_Object     lua_createtable          (void);
\end{verbatim}
creates and returns a new, empty table.


\subsection{Calling Lua Functions}
Functions defined in Lua by a chunk executed with
\verb|dofile| or \verb|dostring| can be called from the host program.
This is done using the following protocol:
first, the arguments to the function are pushed onto C2lua
\see{pushing}, in direct order, i.e., the first argument is pushed first.

Then, the function is called using
\Deffunc{lua_callfunction}
\begin{verbatim}
int            lua_callfunction         (lua_Object function);
\end{verbatim}
This function returns an error code:
0, in case of success; non zero, in case of errors.
Finally, the results (a Lua function may return many values)
are returned in structure lua2C,
and can be retrieved with the macro \verb|lua_getresult|,
\Deffunc{lua_getresult}
which is just another name to the function \verb|lua_lua2C|.
Notice that the function \verb|lua_callfunction|
pops all elements from the C2lua stack.

The following example shows how a C program may do the
equivalent to the Lua code:
\begin{verbatim}
      a = f("how", t.x, 4)
\end{verbatim}
\begin{verbatim}
  lua_pushstring("how");                               /* 1st argument */
  lua_pushobject(lua_getglobal("t"));      /* push value of global 't' */
  lua_pushstring("x");                          /* push the string 'x' */
  lua_pushobject(lua_gettable());     /* push result of t.x (= t['x']) */
  lua_pushnumber(4);                                   /* 3th argument */
  lua_callfunction(lua_getglobal("f"));           /* call Lua function */
  lua_pushobject(lua_getresult(1));   /* push first result of the call */
  lua_setglobal("a");                      /* sets global variable 'a' */
\end{verbatim}

Some special Lua functions have exclusive interfaces.
A C function can generate a Lua error calling the function
\Deffunc{lua_error}
\begin{verbatim}
void lua_error (char *message);
\end{verbatim}
This function never returns.
If the C function has been called from Lua,
then the corresponding Lua execution terminates,
as if an error had occurred inside Lua code.
Otherwise, the whole program terminates with a call to \verb|exit(1)|.

The error handler method \see{error} can be changed with:
\Deffunc{lua_seterrormethod}
\begin{verbatim}
lua_Object     lua_seterrormethod (void);
\end{verbatim}
This function sets the object at the top of C2lua
as the new error method,
and returns the old error method value.

Tag methods can be changed with:
\Deffunc{lua_settagmethod}
\begin{verbatim}
lua_Object     lua_settagmethod (int tag, char *event);
\end{verbatim}
The first parameter is the tag,
the second is the event name \see{tag-method};
the new method is pushed from C2lua.
This function returns a \verb|lua_Object|,
which is the old tag method value.
To get just the current value of a tag method,
there is the function
\Deffunc{lua_gettagmethod}
\begin{verbatim}
lua_Object     lua_gettagmethod (int tag, char *event);
\end{verbatim}


\subsection{C Functions} \label{LuacallC}
To register a C function to Lua,
there is the following macro:
\Deffunc{lua_register}
\begin{verbatim}
#define lua_register(n,f)       (lua_pushcfunction(f), lua_setglobal(n))
/* 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 void (*lua_CFunction) (void);
\end{verbatim}
that is, a pointer to a function with no parameters and no results.

In order to communicate properly with Lua,
a C function must follow a protocol,
which defines the way parameters and results are passed.

A C function receives its arguments in structure lua2C;
to access them, it uses the macro \verb|lua_getparam|, \Deffunc{lua_getparam}
again just another name to \verb|lua_lua2C|.
To return values, a C function just pushes them onto the stack C2lua,
in direct order \see{valuesCLua}.
Like a Lua function, a C function called by Lua can also return
many results.

For some examples, see files \verb|strlib.c|,
\verb|iolib.c| and \verb|mathlib.c| in Lua distribution.

\subsection{References to Lua Objects}

As noted in Section~\ref{LuacallC}, \verb|lua_Object|s are volatile.
If the C code needs to keep a \verb|lua_Object|
outside block boundaries,
then it must create a \Def{reference} to the object.
The routines to manipulate references are the following:
\Deffunc{lua_ref}\Deffunc{lua_getref}
\Deffunc{lua_unref}
\begin{verbatim}
int            lua_ref (int lock);
lua_Object     lua_getref  (int ref);
void           lua_unref (int ref);
\end{verbatim}
The function \verb|lua_ref| creates a reference
to the object that is on the top of the stack,
and returns this reference.
If \verb|lock| is true, the object is {\em locked\/}:
this means the object will not be garbage collected.
Notice that an unlocked reference may be garbage collected.
Whenever the referenced object is needed,
a call to \verb|lua_getref|
returns a handle to it;
if the object has been collected,
\verb|lua_getref| returns \verb|LUA_NOOBJECT|.

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



\section{Predefined Functions and Libraries}

The set of \Index{predefined functions} in Lua is small but powerful.
Most of them provide features that allow some degree of
\Index{reflexivity} in the language.
Some of these features cannot be simulated with the rest of the
language nor with the standard Lua API.
Others are just convenient interfaces to common API functions.

The libraries, on the other hand, 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 there are three standard libraries:
\begin{itemize}
\item string manipulation;
\item mathematical functions (sin, log, etc);
\item input and output (plus some system facilities).
\end{itemize}
In order to have access to these libraries,
the host program must call the functions
\verb|strlib_open|, \verb|mathlib_open|, and \verb|iolib_open|,
declared in \verb|lualib.h|.


\subsection{Predefined Functions} \label{predefined}

\subsubsection*{\ff {\tt call (func, arg, [retmode])}}\Deffunc{call}
This function 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[arg.n])
\end{verbatim}
If \verb|arg.n| is not defined,
then Lua stops getting arguments at the first nil value.

If \verb|retmode| is absent,
all results from \verb|func| are just returned by the call.
If \verb|retmode| is equal to \verb|"pack"|,
the results are {\em packed\/} in a single table.\index{packed results}
That is, \verb|call| returns just one table;
at index \verb|n|, the table has the total number of results
from the call;
the first result is at index 1, etc.
For instance, the following calls produce the following results:
\begin{verbatim}
a = call(sin, {5})    --> a = 0.0871557 = sin(5)
a = call(max, {1,4,5; n=2})  --> a = 4 (only 1 and 4 are arguments)
t = {x=1}
a = call(next, {t,nil;n=2}, "pack")  --> a={"x", 1; n=2}
\end{verbatim}

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

\subsubsection*{\ff {\tt dofile (filename)}}\Deffunc{dofile}
This function receives a file name,
opens it, and executes its contents as a Lua chunk,
or as pre-compiled chunks.
When called without arguments,
it 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 {\tt dostring (string [, errmethod])}}\Deffunc{dostring}
This function executes a given string as a Lua chunk.
If there is any error executing the string, it returns \nil.
Otherwise, it returns the values returned by the chunk,
or a non \nil\ value if the chunk returns no values.
If provided, \verb|errmethod| is temporarily set as the error method,
while \verb|string| runs.
As a particular case, if \verb|errmethod| is \nil,
no error messages will be issued during the execution of the string.

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

\subsubsection*{\ff {\tt next (table, index)}}\Deffunc{next}
This function 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,
the function returns the first index
of the table (and its associated value).
When called with the last index, or with \nil\ in an empty table,
it returns \nil.

In Lua there is no declaration of fields;
semantically, there is no difference between a
field not present in a table or a field with value \nil.
Therefore, the function only considers fields with non \nil\ values.
The order in which the indices are enumerated is not specified,
{\em not even for numeric indices}
(to traverse a table in numeric order,
use a counter).
If the table is modified in any way during a traversal,
the semantics of \verb|next| is undefined.

This function cannot be written with the standard API.

\subsubsection*{\ff {\tt nextvar (name)}}\Deffunc{nextvar}
This function is similar to the function \verb|next|,
but iterates over the global variables.
Its single argument is the name of a global variable,
or \nil\ to get a first name.
Similarly to \verb|next|, it returns the name of another variable
and its value,
or \nil\ if there are no more variables.
There can be no assignments to global variables during the traversal;
otherwise the semantics of \verb|nextvar| is undefined.

This function cannot be written with the standard API.

\subsubsection*{\ff {\tt tostring (e)}}\Deffunc{tostring}
This function receives an argument of any type and
converts it to a string in a reasonable format.

\subsubsection*{\ff {\tt print (e1, e2, ...)}}\Deffunc{print}
This function receives any number of arguments,
and prints their values in a reasonable format.
Each value is printed in a new line.
This function is not intended for formatted output,
but as a quick way to show a value,
for instance for error messages or debugging.
See Section~\ref{libio} for functions for formatted output.

\subsubsection*{\ff {\tt tonumber (e)}}\Deffunc{tonumber}
This function 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 \see{coercion}, then it returns that number;
otherwise, it returns \nil.

\subsubsection*{\ff {\tt type (v)}}\Deffunc{type}\label{pdf-type}
This function allows Lua 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|.

\subsubsection*{\ff {\tt tag (v)}}\Deffunc{tag}
This function allows Lua 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 {\tt settag (t, tag)}}\Deffunc{settag}
This function sets the tag of a given table \see{TypesSec}.
\verb|tag| must be a value created with \verb|newtag|
\see{pdf-newtag}.
For security reasons,
it is impossible to change the tag of a userdata from Lua.

\subsubsection*{\ff {\tt assert (v)}}\Deffunc{assert}
This function issues an {\em ``assertion failed!''} error
when its argument is \nil.

\subsubsection*{\ff {\tt error (message)}}\Deffunc{error}\label{pdf-error}
This function issues an error message and terminates
the last called function from the library
(\verb|lua_dofile|, \verb|lua_dostring|, or \verb|lua_callfunction|).
It never returns.
\verb|error| is equivalent to the API function \verb|lua_error|.

\subsubsection*{\ff {\tt rawgettable (table, index)}}\Deffunc{rawgettable}
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 {\tt rawsettable (table, index, value)}}\Deffunc{rawsettable}
Sets the real value \verb|table[index]=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 {\tt rawsetglobal (name, value)}}\Deffunc{rawsetglobal}
This function assigns the given value to a global variable.
The string \verb|name| does not need to be a syntactically valid variable name.
Therefore, this function can set global variables with strange names like
\verb|"m v 1"| or \verb|34|.
It returns the value of its second argument.

\subsubsection*{\ff {\tt setglobal (name, value)}}\Deffunc{setglobal}
This function assigns the given value to a global variable,
or calls a tag method.
Its full semantics is explained in \See{tag-method}.

\subsubsection*{\ff {\tt rawgetglobal (name)}}\Deffunc{rawgetglobal}
This function retrieves the value of a global variable.
The string \verb|name| does not need to be a
syntactically valid variable name.

\subsubsection*{\ff {\tt getglobal (name)}}\Deffunc{getglobal}
This function retrieves the value of a global variable,
or calls a tag method.
Its full semantics is explained in \See{tag-method}.

\subsubsection*{\ff {\tt seterrormethod (newmethod)}}
\label{pdf-seterrormethod}
Sets the error handler \see{error}.
\verb|newmethod| must be a function or \nil,
in which case the error handler does nothing.
Returns the old error handler.

\subsubsection*{\ff {\tt settagmethod (tag, event, newmethod)}}
\Deffunc{settagmethod}
This function sets a new tag method to the given pair \M{<tag, event>}.
It returns the old method.
If \verb|newmethod| is \nil,
it restores the default behavior for the given event.

\subsubsection*{\ff {\tt gettagmethod (tag, event)}}
\Deffunc{gettagmethod}
This function returns the current tag method
for a given pair \M{<tag, event>}.


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

\subsubsection*{\ff {\tt strfind (str, pattern [, init [, plain]])}}
\Deffunc{strfind}
This function looks for the first {\em match\/} of
\verb|pattern| in \verb|str|.
If it finds one, then it returns the indices on \verb|str|
where this occurrence starts and ends;
otherwise, it returns \nil.
If the pattern specifies captures,
the captured strings are returned as extra results.
A third optional numerical argument specifies where to start the search;
its default value is 1.
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 {\tt strlen (s)}}\Deffunc{strlen}
Receives a string and returns its length.

\subsubsection*{\ff {\tt 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, -1 points to the last character of \verb|s|
and -2 to the previous one.
If \verb|j| is absent, it is assumed to be equal to -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 {\tt 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.

\subsubsection*{\ff {\tt 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.

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

\subsubsection*{\ff {\tt ascii (s [, i])}}\Deffunc{ascii}
Returns the ASCII code of the character \verb|s[i]|.
If \verb|i| is absent, then it is assumed to be 1.

\subsubsection*{\ff {\tt format (formatstring, e1, e2, \ldots)}}\Deffunc{format}
\label{format}
This function returns a formated 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|.
This option formats a string in a form suitable to be safely read
back by the Lua interpreter;
that is,
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}

The options \verb|c|, \verb|d|, \verb|E|, \verb|e|, \verb|f|,
\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.
Note that the \verb|*| modifier can be simulated by building
the appropriate format string.
For example, \verb|"%*g"| can be simulated with
\verb|"%"..width.."g"|.

\subsubsection*{\ff {\tt gsub (s, pat, repl [, table] [, n])}}
\Deffunc{gsub}
Returns a copy of \verb|s|,
where 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 n-th captured substring.

If \verb|repl| is a function, then this function is called every time a
match occurs, with the following arguments:
If \verb|table| is present, then the first argument is this table
and the second one is a match counter (1 for the first call).
Independently of these two optional arguments,
all captured substrings are 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.

A 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.

See some examples below:
\begin{verbatim}
  x = gsub("hello world", "(%w%w*)", "%1 %1", 1)
  --> x="hello hello world"

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

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

  function f(t, i, v) return t[v] end
  t = {name="lua", version="3.0"}
  x = gsub("$name - $version", "$(%w%w*)", f, t)
  --> x="lua - 3.0"

  t = {"apple", "orange", "lime"}
  x = gsub("x and x and x", "x", rawgettable, t)
  --> x="apple and orange and lime"

  t = {}
  dummy, t.n = gsub("first second word", "(%w%w*)", rawsettable, t)
  --> 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[{\em x}] (where {\em x} is any character not in the list \verb|()%.[*-?|)
--- represents the character {\em x} itself.
\item[{\tt .}] --- represents all characters.
\item[{\tt \%a}] --- represents all letters.
\item[{\tt \%A}] --- represents all non letter characters.
\item[{\tt \%d}] --- represents all digits.
\item[{\tt \%D}] --- represents all non digits.
\item[{\tt \%l}] --- represents all lower case letters.
\item[{\tt \%L}] --- represents all non lower case letter characters.
\item[{\tt \%s}] --- represents all space characters.
\item[{\tt \%S}] --- represents all non space characters.
\item[{\tt \%u}] --- represents all upper case letters.
\item[{\tt \%U}] --- represents all non upper case letter characters.
\item[{\tt \%w}] --- represents all alphanumeric characters.
\item[{\tt \%W}] --- represents all non alphanumeric characters.
\item[{\tt \%\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|()%.[*-?|.
\item[{\tt [char-set]}] ---
Represents the class which is the union of all
characters in char-set.
To include a \verb|]| in char-set, it must be the first character.
A range of characters may be specified by
separating the end characters of the range with a \verb|-|;
e.g., \verb|A-Z| specifies the upper case characters.
If \verb|-| appears as the first or last character of char-set,
then it represents itself.
All classes \verb|%|{\em x} described above can also be used as
components in a char-set.
All other characters in char-set represent themselves.
\item[{\tt [\^{ }char-set]}] ---
represents the complement of char-set,
where char-set is interpreted as above.
\end{description}

\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 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
{\tt \%\M{n}}, for \M{n} between 1 and 9;
such item matches a sub-string equal to the n-th captured string
(see below);
\item
{\tt \%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 {\em balanced}.
That means that, if one reads the string from left to write,
counting plus 1 for an \M{x} and minus 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.

\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 ({\em 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.

\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{random}\Deffunc{randomseed}
\begin{verbatim}
abs acos asin atan atan2 ceil cos floor log log10
max min  mod  sin  sqrt  tan  random randomseed
\end{verbatim}
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 {\em degrees}, not radians.

The function \verb|max| returns the maximum
value of its numeric arguments.
Similarly, \verb|min| computes the minimum.
Both can be used with an unlimited number of 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.
The function \verb|random| returns pseudo-random numbers in the
range \Math{[0,1)}.


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

All input and output operations in Lua are done 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 {\tt 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 with a file handle returned by a previous call,
%it simply assigns it to \verb|_INPUT|.
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.

\begin{quotation}
\noindent
{\em System dependent\/}: if \verb|filename| starts with a \verb-|-,
then a \Index{piped input} is open, 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.
\end{quotation}

\subsubsection*{\ff {\tt 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.
Notice that, if the file already exists,
then it will be {\em completely erased\/} with this operation.
%When called with a file handle returned by a previous call,
%it restores the file as the current output.
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.

\begin{quotation}
\noindent
{\em System dependent\/}: if \verb|filename| starts with a \verb-|-,
then a \Index{piped output} is open, 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.
\end{quotation}

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

This function 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 content of the file.
If this function fails, it returns \nil,
plus a string describing the error.

Notice that function \verb|writeto| is available to close an output file.

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

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

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

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

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

This function returns a string with a file name that can safely
be used for a temporary file.
The file must be explicitly removed when no longer needed.

\subsubsection*{\ff {\tt read ([readpattern])}}\Deffunc{read}

This function reads the file \verb|_INPUT|
according to a read pattern, that specifies how much to read;
characters are read from the current input file until
the read pattern fails or ends.
The function \verb|read| returns a string with the characters read,
even if the pattern succeeds only partially,
or \nil\ if the read pattern fails {\em and\/}
the result string would be empty.
When called without parameters,
it uses a default pattern that reads the next line
(see below).

A \Def{read pattern} is a sequence of read pattern items.
An item may be a single character class
or a character class followed by \verb|?| or by \verb|*|.
A single character class reads the next character from the input
if it belongs to the class, otherwise it fails.
A character class followed by \verb|?| reads the next character
from the input if it belongs to the class;
it never fails.
A character class followed by \verb|*| reads until a character that
does not belong to the class, or end of file;
since it can match a sequence of zero characters, it never fails.%
\footnote{
Notice that the behavior of read patterns is different from
the regular pattern matching behavior,
where a \verb|*| expands to the maximum length {\em such that\/}
the rest of the pattern does not fail.
With the read pattern behavior
there is no need for backtracking the reading.
}

A pattern item may contain sub-patterns enclosed in curly brackets,
that describe \Def{skips}.
Characters matching a skip are read,
but are not included in the resulting string.

Following are some examples of read patterns and their meanings:
\begin{itemize}
\item \verb|"."| returns the next character, or \nil\ on end of file.
\item \verb|".*"| reads the whole file.
\item \verb|"[^\n]*{\n}"| returns the next line
(skipping the end of line), or \nil\ on end of file.
This is the default pattern.
\item \verb|"{%s*}%S%S*"| returns the next word
(maximal sequence of non white-space characters),
skipping spaces if necessary,
or \nil\ on end of file.
\item \verb|"{%s*}[+-]?%d%d*"| returns the next integer
or \nil\ if the next characters do not conform to an integer format.
\end{itemize}

\subsubsection*{\ff {\tt write (value1, ...)}}\Deffunc{write}

This function writes the value of each of its arguments to the
file \verb|_OUTPUT|.
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.

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

This function 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.

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

This function calls the C function \verb|exit|,
with an optional \verb|code|,
to terminate the program.
The default value for \verb|code| is 1.

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

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

\subsubsection*{\ff {\tt 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 an error code, which is system-dependent.


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

Lua has no built-in debugging facilities.
Instead, it offers a special interface,
by means of functions and {\em 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 the header file \verb|luadebug.h|.

\subsection{Stack and Function Information}

The main function to get information about the interpreter stack
is
\begin{verbatim}
lua_Function lua_stackedfunction (int level);
\end{verbatim}
It returns a handle (\verb|lua_Function|) to the {\em activation record\/}
of the function executing at a given level.
Level~0 is the current running function,
while level \Math{n+1} is the function that has called level \Math{n}.
When called with a level greater than the stack depth,
\verb|lua_stackedfunction| returns \verb|LUA_NOOBJECT|.

The type \verb|lua_Function| is just another name
to \verb|lua_Object|.
Although, in this library,
a \verb|lua_Function| can be used wherever a \verb|lua_Object| is required,
when a parameter has type \verb|lua_Function|
it accepts only a handle returned by
\verb|lua_stackedfunction|.

Three other functions produce extra information about a function:
\begin{verbatim}
void lua_funcinfo (lua_Object func, char **filename, int *linedefined);
int lua_currentline (lua_Function func);
char *lua_getobjname (lua_Object o, char **name);
\end{verbatim}
\verb|lua_funcinfo| gives the file name and the line where the
given function has been defined.
If the ``function'' is in fact the main code of a chunk,
then \verb|linedefined| is 0.
If the function is a C function,
then \verb|linedefined| is -1, and \verb|filename| is \verb|"(C)"|.

The function \verb|lua_currentline| gives the current line where
a given function is executing.
It only works if the function has been compiled with debug
information \see{pragma}.
When no line information is available, it returns -1.

Function \verb|lua_getobjname| tries to find a reasonable name for
a 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.
Function \verb|lua_getobjname| first checks whether the given
function is a tag method.
If so, it returns the string \verb|"tag-method"|,
and \verb|name| is set to point to the event name.
Otherwise, if the given function is the value of a global variable,
then \verb|lua_getobjname| returns the string \verb|"global"|,
and \verb|name| points to the variable name.
If the given function is neither a tag method nor a global variable,
then \verb|lua_getobjname| returns the empty string,
and \verb|name| is set to \verb|NULL|.

\subsection{Manipulating Local Variables}

The following functions allow the manipulation of the
local variables of a given activation record.
They only work if the function has been compiled with debug
information \see{pragma}.
\begin{verbatim}
lua_Object lua_getlocal (lua_Function func, int local_number, char **name);
int lua_setlocal (lua_Function func, int local_number);
\end{verbatim}
\verb|lua_getlocal| returns the value of a local variable,
and sets \verb|name| to point to the variable name.
\verb|local_number| is an index for local variables.
The first parameter has index 1, and so on, until the
last active local variable.
When called with a \verb|local_number| greater than the
number of active local variables,
or if the activation record has no debug information,
\verb|lua_getlocal| returns \verb|LUA_NOOBJECT|.
Formal parameters are the first local variables.

The function \verb|lua_setlocal| sets the local variable
\verb|local_number| to the value previously pushed on the stack
\see{valuesCLua}.
If the function succeeds, then it returns 1.
If \verb|local_number| is greater than the number
of active local variables,
or if the activation record has no debug information,
then this function fails and returns 0.

\subsection{Hooks}

The Lua interpreter offers two hooks for debugging purposes:
\begin{verbatim}
typedef void (*lua_CHFunction) (lua_Function func, char *file, int line);
extern lua_CHFunction lua_callhook;

typedef void (*lua_LHFunction) (int line);
extern lua_LHFunction lua_linehook;
\end{verbatim}
The first one is called whenever the interpreter enters or leaves a
function.
When entering a function,
its parameters are a handle to the function activation record,
plus the file and the line where the function is defined (the same
information which is provided by \verb|lua_funcinfo|);
when leaving a function, \verb|func| is \verb|LUA_NOOBJECT|,
\verb|file| is \verb|"(return)"|, and \verb|line| is 0.

The other hook is called every time the interpreter changes
the line of code it is executing.
Its only parameter is the line number
(the same information which is provided by the call
\verb|lua_currentline(lua_stackedfunction(0))|).
This second hook is only called if the active function
has been compiled with debug information \see{pragma}.

A hook is disabled when its value is \verb|NULL|,
which is the initial value of both hooks.



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

Although Lua has been designed as an extension language,
the language can also be used as a stand-alone interpreter.
An implementation of such an interpreter,
called simply \verb|lua|,
is provided with the standard distribution.
This program can be called with any sequence of the following arguments:
\begin{description}
\item[{\tt -v}] prints version information.
\item[{\tt -}] runs interactively, accepting commands from standard input
until an \verb|EOF|.
\item[{\tt -e stat}] executes \verb|stat| as a Lua chunk.
\item[{\tt var=exp}] executes \verb|var=exp| as a Lua chunk.
\item[{\tt filename}] executes file \verb|filename| as a Lua chunk.
\end{description}
All arguments are handled in order.
For instance, an invocation like
\begin{verbatim}
$ lua - a=1 prog.lua
\end{verbatim}
will first interact with the user until an \verb|EOF|,
then will set \verb|a| to 1,
and finally will run file \verb|prog.lua|.

Please notice that the interaction with the shell may lead to
unintended results.
For instance, a call like
\begin{verbatim}
$ lua a="name" prog.lua
\end{verbatim}
will {\em not\/} set \verb|a| to the string \verb|"name"|.
Instead, the quotes will be handled by the shell,
lua will get only \verb|a=name| to run,
and \verb|a| will finish with \nil,
because the global variable \verb|name| has not been initialized.
Instead, one should write
\begin{verbatim}
$ lua 'a="name"' prog.lua
\end{verbatim}

\section*{Acknowledgments}

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



\appendix

\section*{Incompatibilities with Previous Versions}

Although great care has been taken 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 2.5}}
\begin{itemize}
\item
The whole fallback mechanism has been replaced by tag methods.
Nevertheless, the function \verb|setfallback| has been rewritten in
a way that uses tag methods to fully emulate the old behavior
of fallbacks.
\item
Tags now must be created with the function \verb|newtag|.
Nevertheless, old user defined tags are still accepted
(user defined tags must be positive;
\verb|newtag| uses negative numbers).
Tag methods cannot be set for such user defined tags,
and fallbacks do not affect tags created by \verb|newtag|.
\item
Lua 2.5 accepts mixed comparisons of strings and numbers,
like \verb|2<"12"|, giving weird results.
Now this is an error.
\item
Character \verb|"-"| (hyphen) now is ``magic'' in pattern matching.
\item
Some API functions have been rewritten as macros.
\end{itemize}

\subsection*{Incompatibilities with \Index{version 2.4}}
The whole I/O facilities have been rewritten.
We strongly encourage programmers to adapt their code
to this new version.
The incompatibilities between the new and the old libraries are:
\begin{itemize}
\item The format facility of function \verb|write| has been supersed by
function \verb|format|;
therefore this facility has been dropped.
\item Function \verb|read| now uses {\em read patterns\/} to specify
what to read;
this is incompatible with the old format options.
\item Function \verb|strfind| now accepts patterns,
so it may have a different behavior when the pattern includes
special characters.
\end{itemize}

\subsection*{Incompatibilities with \Index{version 2.2}}
\begin{itemize}
\item
Functions \verb|date| and \verb|time| (from \verb|iolib|)
have been superseded by the new, more powerful version of function \verb|date|.
\item
Function \verb|append| (from \verb|iolib|) now returns 1 whenever it succeeds,
whether the file is new or not.
\item
Function \verb|int2str| (from \verb|strlib|) has been superseded by new
function \verb|format|, with parameter \verb|"%c"|.
\item
The API lock mechanism has been superseded by the reference mechanism.
However, \verb|lua.h| provides compatibility macros,
so there is no need to change programs.
\item
The API function \verb|lua_pushliteral| now is just a macro to
\verb|lua_pushstring|.
\end{itemize}

\subsection*{Incompatibilities with \Index{version 2.1}}
\begin{itemize}
\item
The function \verb|type| now returns the string \verb|"function"|
both for C and Lua functions.
Because Lua functions and C functions are compatible,
this behavior is usually more useful.
When needed, the second result of function {\tt type} may be used
to distinguish between Lua and C functions.
\item
A function definition only assigns the function value to the
given variable at execution time.
\end{itemize}

\subsection*{Incompatibilities with \Index{version 1.1}}
\begin{itemize}
\item
The equality test operator now is denoted by \verb|==|,
instead of \verb|=|.
\item
The syntax for table construction has been greatly simplified.
The old \verb|@(size)| has been substituted by \verb|{}|.
The list constructor (formerly \verb|@[...]|) and the record
constructor (formerly \verb|@{...}|) now are both coded like
\verb|{...}|.
When the construction involves a function call,
like in \verb|@func{...}|,
the new syntax does not use the \verb|@|.
More important, {\em a construction function must now
explicitly return the constructed table}.
\item
The function \verb|lua_call| no longer has the parameter \verb|nparam|.
\item
The function \verb|lua_pop| is no longer available,
since it could lead to strange behavior.
In particular,
to access results returned from a Lua function,
the new macro \verb|lua_getresult| should be used.
\item
The old functions \verb|lua_storefield| and \verb|lua_storeindexed|
have been replaced by
\begin{verbatim}
int lua_storesubscript (void);
\end{verbatim}
with the parameters explicitly pushed on the stack.
\item
The functionality of the function \verb|lua_errorfunction| has been
replaced by the {\em fallback\/} mechanism \see{error}.
\item
When calling a function from the Lua library,
parameters passed through the stack
must be pushed just before the corresponding call,
with no intermediate calls to Lua.
Special care should be taken with macros like
\verb|lua_getindexed| and \verb|lua_getfield|.
\end{itemize}

\newcommand{\indexentry}[2]{\item {#1} #2}
%\catcode`\_=12
\begin{theindex}
\input{manual.id}
\end{theindex}


\end{document}


