diff --git a/manual.tex b/manual.tex
new file mode 100644
index 0000000..584808e
--- /dev/null
+++ b/manual.tex
@@ -0,0 +1,1741 @@
+\documentstyle[A4,11pt,bnf]{article}
+
+\newcommand{\rw}[1]{{\bf #1}}
+\newcommand{\see}[1]{see Section~\ref{#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{{\tt #1}}}
+
+
+
+\begin{document}
+
+\title{Reference Manual of the Programming Language Lua 2.2}
+
+\author{%
+Roberto Ierusalimschy\quad
+Luiz Henrique de Figueiredo\quad
+Waldemar Celes Filho
+\vspace{1.0ex}\\
+%\small \tecgraf \ --- PUC-Rio\\
+\smallskip
+\small\tt roberto,lhf,celes@icad.puc-rio.br
+\vspace{2.0ex}\\
+%MCC 08/95 ---
+Departamento de Inform\'atica --- PUC-Rio
+}
+
+\date{November, 1995}
+
+\maketitle
+
+
+\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 2.2 of the Lua programming language and the
+API that allows interaction between Lua programs and its host C program.
+It also presents some examples of using the main features of the system.
+\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 2.2 da linguagem de programa\c{c}\~ao Lua e a
+Interface de Programa\c{c}\~ao que permite a intera\c{c}\~ao entre programas Lua
+e o programa C hospedeiro.
+O documento tamb\'em apresenta alguns exemplos de uso das principais
+ca\-racte\-r\'{\i}sticas do sistema.
+\end{quotation}
+
+
+\section{Introduction}
+
+Lua is an extension programming language designed to support
+general procedural programming features with data description
+facilities.
+It is supposed to be used as a configuration language for any
+program that needs one.
+Its main extensions are related to object-oriented facilities,
+and fallbacks,
+but it has some other minor contributions.
+Lua has been designed and implemented by
+W.~Celes~F., L.~H.~de Figueiredo and R.~Ierusalimschy.
+
+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
+rather different domains,
+thus creating customized programming languages sharing a syntactical framework.
+
+Lua is free distribution software,
+and provided as usual with no guarantees.
+The implementation described in this manual is available
+by anonymous ftp from
+\begin{verbatim}
+   ftp.icad.puc-rio.br:/pub/lua/lua-2.2.tar.gz
+\end{verbatim}
+or by WWW (World Wide Web) from
+\begin{verbatim}
+   http://www.inf.puc-rio.br/~roberto/lua.html
+\end{verbatim}
+
+
+\section{Environment and Modules}
+
+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 local declarations, Section~\ref{localvar}).
+Before the first assignment, the value of a global variable is \nil.
+
+The unit of execution of Lua is called a \Def{chunk}.
+The syntax for chunks is:%
+\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.}
+\begin{Produc}
+\produc{chunk}{\rep{statement \Or function}}
+\end{Produc}%
+A chunk may contain statements and function definitions,
+and may be in a file or in a string inside the host program.
+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}.}.
+
+
+
+\section{\Index{Types}} \label{TypesSec}
+
+Lua is a dynamically typed language.
+Variables do not have types; only values do.
+All values carry their own type.
+Therefore, there are no type definitions in the language.
+
+There are seven \Index{basic types} in Lua: \Def{nil}, \Def{number},
+\Def{string}, \Def{function}, \Def{CFunction}, \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.
+
+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; the latter have type {\em CFunction\/}.
+
+The type {\em userdata} is provided to allow
+arbitrary \Index{C pointers} to be stored in Lua variables.
+It corresponds to \verb'void*' and has no pre-defined operations in Lua,
+besides assignment and equality test.
+However, by using fallbacks, the programmer may define operations
+for {\em userdata} values; \see{fallback}.
+
+The type {\em table} implements \Index{associative arrays},
+that is, \Index{arrays} which 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.
+
+It is important to notice that tables are objects, and not values.
+Variables cannot contain tables, only 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}.
+
+
+
+\section{The Language}
+
+This section describes the lexis, syntax and 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    until     then    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 last form may run for several lines,
+may contain nested \verb'[[ ... ]]',
+and do not interpret escape sequences.
+
+\Index{Comments} start anywhere outside a string with a
+double hyphen (\verb'--') and run until the end of the line.
+
+\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.     .4     4.57e-3     .3e12
+\end{verbatim}
+
+
+\subsection{\Index{Coercion}} \label{coercion}
+
+Lua provides some automatic conversions.
+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 standard \verb'printf' C function.
+
+
+
+\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, the last values are thrown away.
+If there are more needs than values, 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}.
+The conventional commands include
+assignment, control structures and procedure calls.
+Non-conventional commands include table constructors,
+explained in Section \ref{tableconstructor},
+and local variable declarations.
+
+\subsubsection{Blocks}
+A \Index{block} is a list of statements, executed sequentially.
+Any statement can be optionally followed by a semicolon.
+\begin{Produc}
+\produc{block}{\rep{stat sc} \opt{ret sc}}
+\produc{sc}{\opt{\ter{;}}}
+\end{Produc}%
+For syntactic reasons, a \Index{return statement} can only be written
+as the last statement of a block.
+This restriction also avoids some ``statement not reached'' errors.
+
+\subsubsection{\Index{Assignment}} \label{assignment}
+The language allows \Index{multiple assignment}.
+Therefore, the syntax 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}
+Before the assignment, the list of values is {\em adjusted} to
+the length of the list of variables; \see{adjust}.
+
+\begin{Produc}
+\produc{var}{name}
+\end{Produc}%
+A single name can denote a global or a local variable,
+or a formal parameter.
+\begin{Produc}
+\produc{var}{var \ter{[} exp1 \ter{]}}
+\end{Produc}%
+Square brackets are used to index a table.
+If \verb'var' results in a table value,
+the field indexed by the expression value gets the assigned value.
+Otherwise, the fallback {\em settable} is called,
+with three parameters: the value of \verb'var',
+the value of expression, and the value being assigned to it;
+\see{fallback}.
+\begin{Produc}
+\produc{var}{var \ter{.} name}
+\end{Produc}%
+The syntax \verb'var.NAME' is just syntactic sugar for
+\verb'var["NAME"]'.
+
+\subsubsection{Control Structures}
+The \Index{condition expression} of a control structure can return any value.
+All values different from \nil\ are considered true,
+while \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. \label{return}
+Because a function may return more than one value,
+the syntax for a \Index{return statement} is:
+\begin{Produc}
+\produc{ret}{\rwd{return} explist}
+\end{Produc}
+
+\subsubsection{Expressions as Statements} \label{statexp}
+All expressions with possible side-effects can be
+executed as statements.
+These include function calls and table constructors:
+\begin{Produc}
+\produc{stat}{functioncall}
+\produc{stat}{tableconstructor}
+\end{Produc}%
+Eventual returned values are thrown away.
+Function calls are explained in Section \ref{functioncall};
+constructors are the subject of Section \ref{tableconstructor}.
+
+\subsubsection{Local Declarations} \label{localvar}
+\Index{Local variables} can 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 there is an initial assignment, it 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}.
+
+\subsubsection{Arithmetic Operators}
+Lua supports the usual \Index{arithmetic operators}.
+These operators are the binary
+\verb'+', \verb'-', \verb'*', \verb'/' and \verb'^' (exponentiation),
+and the unary \verb'-'.
+If the operands are numbers, or strings that can be converted to
+numbers, according to the rules given in Section \ref{coercion},
+all operations but exponentiation have the usual meaning.
+Otherwise, the fallback ``arith'' is called; \see{fallback}.
+An exponentiation always calls this fallback.
+The standard mathematical library redefines this fallback,
+giving the expected meaning to \Index{exponentiation};
+\see{mathlib}.
+
+\subsubsection{Relational Operators}
+Lua offers  the following \Index{relational operators}:
+\begin{verbatim}
+       <   >   <=  >=  ~=  ==
+\end{verbatim}
+All return \nil\ as false and 1 as true.
+
+Equality first compares the types of its operands.
+If they are different, the result is \nil.
+Otherwise, their values are compared.
+Numbers and strings are compared in the usual way.
+Tables, CFunctions, 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'=').
+
+The other operators work as follows.
+If both arguments are numbers, they are compared as such.
+Otherwise, if both arguments can be converted to strings,
+their values are compared using lexicographical order.
+Otherwise, the fallback ``order'' is called; \see{fallback}.
+
+\subsubsection{Logical Operators}
+All logical operators, like control structures,
+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 operators \verb'and' and \verb'or' use \Index{short-cut evaluation},
+that is,
+the second operand is evaluated only if necessary.
+
+\subsubsection{Concatenation}
+Lua offers a string \Index{concatenation} operator,
+denoted by ``\IndexVerb{..}''.
+If operands are strings or numbers, they are converted to
+strings according to the rules in Section \ref{coercion}.
+Otherwise, the fallback ``concat'' is called; \see{fallback}.
+
+\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'^',
+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 indexes,
+starting with 1.
+As an example:
+\begin{verbatim}
+   a = {"v1", "v2", 34}
+\end{verbatim}
+is equivalent to:
+\begin{verbatim}
+   temp = {}
+   temp[1] = "v1"
+   temp[2] = "v2"
+   temp[3] = 34
+   a = temp
+\end{verbatim}
+
+The next form initializes named fields in a table.
+\begin{Produc}
+\produc{ffieldlist1}{ffield \rep{\ter{,} ffield} \opt{\ter{,}}}
+\produc{ffield}{name \ter{=} exp}
+\end{Produc}%
+As an example:
+\begin{verbatim}
+   a = {x = 1, y = 3}
+\end{verbatim}
+is equivalent to:
+\begin{verbatim}
+   temp = {}
+   temp.x = 1
+   temp.y = 3
+   a = temp
+\end{verbatim}
+
+
+\subsubsection{Function Calls}  \label{functioncall}
+A \Index{function call} has the following syntax:
+\begin{Produc}
+\produc{functioncall}{var realParams}
+\end{Produc}%
+Here, \verb'var' can be any variable (global, local, indexed, etc).
+If its type is {\em function\/} or {\em CFunction\/},
+this function is called.
+Otherwise, the fallback ``function'' is called,
+having as first parameter the value of \verb'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;
+then the list of \Index{arguments} is adjusted to
+the length of the list of parameters (\see{adjust});
+finally, this list is assigned to the formal parameters.
+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 an statement (\see{statexp}),
+its return list is adjusted to 0.
+If the function is called in a place that needs a single value
+(syntactically denoted by the non-terminal \verb'exp1'),
+its return list is adjusted to 1.
+If the function is called in a place that can hold many values
+(syntactically denoted by the non-terminal \verb'exp'),
+no adjustment is done.
+
+
+\subsection{\Index{Function Definitions}}
+
+Functions in Lua can be defined anywhere in the global level of a module.
+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'.
+
+Parameters act as local variables,
+initialized with the argument values.
+\begin{Produc}
+\produc{parlist1}{'name' \rep{\ter{,} name}}
+\end{Produc}
+
+Results are returned using the \verb'return' statement (\see{return}).
+If control reaches the end of a function without a return instruction,
+the function returns with no results.
+
+There is a special syntax for definition of \Index{methods},
+that is, functions which have an extra parameter \Def{self}.
+\begin{Produc}
+\produc{function}{\rwd{function} var \ter{:} name \ter{(} \opt{parlist1}
+  \ter{)} block \rwd{end}}
+\end{Produc}%
+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 be previously initialized with a table value.
+
+
+\subsection{Fallbacks} \label{fallback}
+
+Lua provides a powerful mechanism to extend its semantics,
+called \Def{fallbacks}.
+Basically, a fallback is a programmer defined function
+which is called whenever Lua does not know how to proceed.
+
+Lua supports the following fallbacks,
+identified by the given strings:
+\begin{description}
+\item[``arith'']\index{arithmetic fallback}
+called when an arithmetic operation is applied to non numerical operands,
+or when the binary \verb'^' operation is called.
+It receives three arguments:
+the two operands (the second one is nil when the operation is unary minus)
+and one of the following strings describing the offended operator:
+\begin{verbatim}
+  add  sub  mul  div  pow  unm
+\end{verbatim}
+Its return value is the final result of the arithmetic operation.
+The default function issues an error.
+\item[``order'']\index{order fallback}
+called when an order comparison is applied to non numerical or
+non string operands.
+It receives three arguments:
+the two operands and
+one of the following strings describing the offended operator:
+\begin{verbatim}
+  lt gt le ge
+\end{verbatim}
+Its return value is the final result of the comparison operation.
+The default function issues an error.
+\item[``concat'']\index{concatenation fallback}
+called when a concatenation is applied to non string operands.
+It receives the two operands as arguments.
+Its return value is the final result of the concatenation operation.
+The default function issues an error.
+\item[``index'']\index{index fallback}
+called when Lua tries to retrieve the value of an index
+not present in a table.
+It receives as arguments the table and the index.
+Its return value is the final result of the indexing operation.
+The default function returns nil.
+\item[``gettable'']\index{gettable fallback}
+called when Lua tries to index a non table value.
+It receives as arguments the non table value and the index.
+Its return value is the final result of the indexing operation.
+The default function issues an error.
+\item[``settable'']\index{settable fallback}
+called when Lua tries to assign indexed a non table value.
+It receives as arguments the non table value,
+the index, and the assigned value.
+The default function issues an error.
+\item[``function'']\index{function falback}
+called when Lua tries to call a non function value.
+It receives as arguments the non function value and the
+arguments given in the original call.
+Its return values are the final results of the call operation.
+The default function issues an error.
+\item[``gc'']
+called during garbage collection.
+It receives as argument the table being collected.
+After each run of the collector this function is called with argument nil.
+Because this function operates during garbage collection,
+it must be used with great care,
+and programmers should avoid the creation of new objects
+(tables or strings) in this function.
+The default function does nothing.
+\item[``error'']\index{error fallback}
+called when an error occurs.
+It receives as argument a string describing the error.
+The default function prints the message on the standard error output.
+\end{description}
+
+The function \IndexVerb{setfallback} is used to change a fallback action.
+Its first argument is a string describing the fallback,
+and the second the new function to be called.
+It returns the old function for the given fallback.
+
+Section \ref{exfallback} shows an example of the use of fallbacks.
+
+
+\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,
+an error fallback function is called,
+and then the corresponding function from the library
+(\verb'lua_dofile', \verb'lua_dostring',
+\verb'lua_call', and \verb'lua_callfunction')
+is terminated returning an error condition.
+
+The only argument to the error fallback function is a string describing
+the error and some extra informations,
+like current line (when the error is at compilation)
+or current function (when the error is at execution).
+For more information about an error,
+the Lua program can include the compilation pragma \verb'$debug'.
+\index{debug pragma}
+This pragma must be written in a line by itself.
+When an error occurs in a program compiled with this option,
+the error message includes extra information showing the stack of calls.
+
+The standard error routine only prints the error message
+to \verb'stderr'.
+If needed, it is possible to change the error fallback routine;
+\see{fallback}.
+
+Lua code can generate an error by calling the function \verb'error'.
+Its optional parameter is a string,
+which is used as the error message.
+
+
+\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 library.
+The API functions can be classified in the following categories:
+\begin{enumerate}
+\item executing Lua code;
+\item converting values between C and Lua;
+\item manipulating (reading and writing) Lua objects;
+\item calling Lua functions;
+\item C functions to be called by Lua;
+\item locking Lua Objects.
+\end{enumerate}
+All API functions are declared in the file \verb'lua.h'.
+
+\subsection{Executing Lua Code}
+A host program can execute Lua programs 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.
+The function \verb'lua_dofile', if called with argument NULL (0),
+executes the ``file'' {\tt stdin}.
+
+\subsection{Converting Values between C and Lua} \label{valuesCLua}
+Because Lua has no static type system,
+all values passed between Lua and C have type \IndexVerb{lua\_Object},
+which works like an abstract type in C that can hold any Lua value.
+
+Lua has automatic memory management, and garbage collection.
+Because of that, 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.
+A good programming practice is 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.
+
+When C code calls Lua repeatedly, as in a loop,
+objects returned by these calls accumulate,
+and may create a memory problem.
+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.
+
+To check the type of a \verb'lua_Object',
+the following function is available:
+\Deffunc{lua_type}
+\begin{verbatim}
+int            lua_type                 (lua_Object object);
+\end{verbatim}
+plus the following macros:
+\Deffunc{lua_isnil}\Deffunc{lua_isnumber}\Deffunc{lua_isstring}
+\Deffunc{lua_istable}\Deffunc{lua_iscfunction}\Deffunc{lua_isuserdata}
+\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_iscfunction          (lua_Object object);
+int            lua_isuserdata           (lua_Object object);
+\end{verbatim}
+All macros return 1 if the object has the given type,
+and 0 otherwise.
+
+The function \verb'lua_type' can be used to distinguish between
+different kinds of user data; see below.
+
+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}
+double         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 float.
+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 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.
+
+\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 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 null pointer).
+
+The reverse process, that is, passing a specific C value to Lua,
+is done by using the following functions:
+\Deffunc{lua_pushnumber}\Deffunc{lua_pushstring}\Deffunc{lua_pushliteral}
+\Deffunc{lua_pushcfunction}\Deffunc{lua_pushusertag}\Deffunc{lua_pushuserdata}
+\begin{verbatim}
+void           lua_pushnumber           (double n);
+void           lua_pushstring           (char *s);
+void           lua_pushliteral          (char *s);
+void           lua_pushcfunction        (lua_CFunction f);
+void           lua_pushusertag          (void *u, int tag);
+\end{verbatim}
+plus the macro:
+\begin{verbatim}
+void           lua_pushuserdata         (void *u);
+\end{verbatim}
+All of them receive a C value,
+convert it to a correspondent \verb'lua_Object',
+and leave the result on the top of the Lua stack,
+where it can be assigned to a Lua variable,
+passed as paramenter to a Lua function, etc (see below). \label{pushing}
+\verb'lua_pushliteral' is like \verb'lua_pushstring',
+but also puts the string in the Lua literal table.
+This avoids the string to be garbage collected,
+and therefore has a better overall performance.
+As a rule, when the string to be pushed is a literal,
+\verb'lua_pushliteral' should be used.
+
+User data can have different tags,
+whose semantics are defined by the host program.
+Any positive integer can be used to tag a user data.
+When a user data is retrieved,
+the function \verb'lua_type' can be used to get its tag.
+
+To complete the set,
+the value \nil\ or a \verb'lua_Object' can also be pushed onto the stack,
+with:
+\Deffunc{lua_pushnil}\Deffunc{lua_pushobject}
+\begin{verbatim}
+void           lua_pushnil              (void);
+void           lua_pushobject           (lua_Object object);
+\end{verbatim}
+
+
+\subsection{Manipulating Lua Objects}
+To read the value of any global Lua variable,
+one can use the function:
+\Deffunc{lua_getglobal}
+\begin{verbatim}
+lua_Object     lua_getglobal            (char *varname);
+\end{verbatim}
+To store a value previously pushed onto the stack in a global variable,
+there is the function:
+\Deffunc{lua_storeglobal}
+\begin{verbatim}
+void           lua_storeglobal          (char *varname);
+\end{verbatim}
+
+Tables can also be manipulated via the API.
+The function
+\Deffunc{lua_getsubscript}
+\begin{verbatim}
+lua_Object     lua_getsubscript         (void);
+\end{verbatim}
+expects on the stack a table and an index,
+and returns the contents of the table at that index.
+As in Lua, if the first object is not a table,
+or the index is not present in the table,
+the correspondent fallback is called.
+
+For compatibility with previous versions of the API,
+the following macros are supported:
+\Deffunc{lua_getindexed}\Deffunc{lua_getfield}
+\begin{verbatim}
+lua_Object     lua_getindexed           (lua_Object table, float index);
+lua_Object     lua_getfield             (lua_Object table, char *field);
+\end{verbatim}
+The first one is used for numeric indices,
+while the second can be used for any string index.
+
+To store a value in an index,
+the program must push onto the stack the table, the index,
+and the value,
+and then call the function:
+\Deffunc{lua_storesubscript}
+\begin{verbatim}
+void lua_storesubscript (void);
+\end{verbatim}
+Again, the correspondent fallback is called if needed.
+
+Finally, the function
+\Deffunc{lua_createtable}
+\begin{verbatim}
+lua_Object     lua_createtable          (void);
+\end{verbatim}
+creates a new table.
+
+{\em Please Notice:\/}
+Most functions from the Lua library receive parameters through the stack.
+Because other functions also use the stack,
+it is important that these
+parameters be pushed just before the correspondent call,
+without intermediate calls to the Lua library.
+For instance, suppose the user wants the value of \verb'a[i]'.
+A simplistic solution would be:
+\begin{verbatim}
+  /* Warning: WRONG CODE */
+  lua_Object result;
+  lua_pushobject(lua_getglobal("a"));  /* push table */
+  lua_pushobject(lua_getglobal("i"));  /* push index */
+  result = lua_getsubscript();
+\end{verbatim}
+However, the call \verb'lua_getglobal("i")' modifies the stack,
+and invalidates the previous pushed value.
+A correct solution could be:
+\begin{verbatim}
+  lua_Object result;
+  lua_Object index = lua_getglobal("i");
+  lua_pushobject(lua_getglobal("a"));  /* push table */
+  lua_pushobject(index);               /* push index */
+  result = lua_getsubscript();
+\end{verbatim}
+
+\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 the Lua stack
+(\see{pushing}), in direct order, i.e., the first argument is pushed first.
+Again, it is important to emphasize that, during this phase,
+no other Lua function can be called.
+
+Then, the function is called using
+\Deffunc{lua_call}\Deffunc{lua_callfunction}
+\begin{verbatim}
+int            lua_call                 (char *functionname);
+\end{verbatim}
+or
+\begin{verbatim}
+int            lua_callfunction         (lua_Object function);
+\end{verbatim}
+Both functions return an error code:
+0, in case of success; non zero, in case of errors.
+Finally, the returned values (a Lua function may return many values)
+can be retrieved with the macro
+\Deffunc{lua_getresult}
+\begin{verbatim}
+lua_Object     lua_getresult             (int number);
+\end{verbatim}
+where \verb'number' is the order of the result, starting with 1.
+When called with a number larger than the actual number of results,
+this function returns \verb'LUA_NOOBJECT'.
+
+Two special Lua functions have exclusive interfaces:
+\verb'error' and \verb'setfallback'.
+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,
+the corresponding Lua execution terminates,
+as if an error had occurred inside Lua code.
+Otherwise, the whole program terminates.
+
+Fallbacks can be changed with:
+\Deffunc{lua_setfallback}
+\begin{verbatim}
+lua_Object lua_setfallback (char *name, lua_CFunction fallback);
+\end{verbatim}
+The first parameter is the fallback name,
+and the second a CFunction to be used as the new fallback.
+This function returns a \verb'lua_Object',
+which is the old fallback value,
+or nil on fail (invalid fallback name).
+This old value can be used for chaining fallbacks.
+
+An example of C code calling a Lua function is shown in
+Section~\ref{exLuacall}.
+
+
+\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_storeglobal(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.
+
+To access its arguments, a C function calls:
+\Deffunc{lua_getparam}
+\begin{verbatim}
+lua_Object     lua_getparam             (int number);
+\end{verbatim}
+where \verb'number' starts with 1 to get the first argument.
+When called with a number larger than the actual number of arguments,
+this function returns \IndexVerb{LUA\_NOOBJECT}.
+In this way, it is possible to write functions that work with
+a variable number of parameters.
+
+To return values, a C function just pushes them onto the stack,
+in direct order; \see{valuesCLua}.
+Like a Lua function, a C function called by Lua can also return
+many results.
+
+Section~\ref{exCFunction} presents an example of a CFunction.
+
+
+\subsection{Locking Lua Objects}
+
+As already noted, \verb'lua_Object's are volatile.
+If the C code needs to keep a \verb'lua_Object'
+outside block boundaries,
+it has to {\em lock} the object.
+The routines to manipulate locking are the following:
+\Deffunc{lua_lock}\Deffunc{lua_getlocked}
+\Deffunc{lua_pushlocked}\Deffunc{lua_unlock}
+\begin{verbatim}
+int        lua_lock (void);
+lua_Object lua_getlocked  (int ref);
+void       lua_pushlocked (int ref);
+void       lua_unlock (int ref);
+\end{verbatim}
+The function \verb'lua_lock' locks the object
+which is on the top of the stack,
+and returns a reference to it.
+Whenever the locked object is needed,
+a call to \verb'lua_getlocked'
+returns a handle to it,
+while \verb'lua_pushlocked' pushes the handle on the stack.
+When a locked object is no longer needed,
+it can be unlocked with a call to \verb'lua_unlock'.
+
+
+
+\section{Predefined Functions and Libraries}
+
+The set of \Index{predefined functions} in Lua is small but powerful.
+Most of them provide features that allows some degree of
+\Index{reflexivity} in the language.
+Many of these features cannot be simulated with the rest of the
+Language nor with the standard API.
+
+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 separated C modules.
+Currently there are three standard libraries:
+\begin{itemize}
+\item string manipulation;
+\item mathematical functions (sin, cos, etc);
+\item input and output.
+\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}
+
+\subsubsection*{{\tt dofile (filename)}}\Deffunc{dofile}
+This function receives a file name,
+opens it and executes its contents as a Lua chunk.
+It returns 1 if there are no errors, \nil\ otherwise.
+
+\subsubsection*{{\tt dostring (string)}}\Deffunc{dostring}
+This function executes a given string as a Lua chunk.
+It returns 1 if there are no errors, \nil\ otherwise.
+
+\subsubsection*{{\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 the indices are enumerated is not specified,
+{\em even for numeric indices}.
+
+See Section \ref{exnext} for an example of the use of this function.
+
+\subsubsection*{{\tt nextvar (name)}}\Deffunc{nextvar}
+This function is similar to the function \verb'next',
+but it 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.
+See Section \ref{exnext} for an example of the use of this function.
+
+\subsubsection*{{\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*{{\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}), it returns that number;
+otherwise, it returns \nil.
+
+\subsubsection*{{\tt type (v)}}\Deffunc{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"' (returned both for C functions and Lua functions),
+and \verb'"userdata"'.
+
+Besides this string, the function returns a second result,
+which is the \Def{tag} of the value.
+This tag can be used to distinguish between user
+data with different tags,
+and between C functions and Lua functions.
+
+\subsubsection*{{\tt error (message)}}\Deffunc{error}
+This function issues an error message and terminates
+the last called function from the library
+(\verb'lua_dofile', \verb'lua_dostring', \ldots).
+It never returns.
+
+\subsubsection*{{\tt setglobal (name, value)}}\Deffunc{setglobal}
+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'.
+
+\subsubsection*{{\tt getglobal (name)}}\Deffunc{getglobal}
+This function retrieves the value of a global variable.
+The string \verb'name' does not need to be a syntactically valid variable name.
+
+\subsubsection*{{\tt setfallback (fallbackname, newfallback)}}
+\Deffunc{setfallback}
+This function sets a new fallback function to the given fallback.
+It returns the old fallback function.
+
+\subsection{String Manipulation}
+This library provides generic functions for string manipulation,
+such as finding and extracting substrings.
+When indexing a string, the first character has position 1.
+See Section \ref{exstring} for some examples on string manipulation
+in Lua.
+
+\subsubsection*{{\tt strfind (str, substr, [init, [end]])}}
+\Deffunc{strfind}
+Receives two string arguments,
+and returns a number.
+This number indicates the first position where the second argument appears
+in the first argument.
+If the second argument is not a substring of the first one,
+then \verb'strfind' returns \nil.
+A third optional numerical argument specifies where to start the search.
+Another optional numerical argument specifies where to stop it.
+
+\subsubsection*{{\tt strlen (s)}}\Deffunc{strlen}
+Receives a string and returns its length.
+
+\subsubsection*{{\tt strsub (s, i, [j])}}\Deffunc{strsub}
+Returns another string, which is a substring of \verb's',
+starting at \verb'i'  and runing until \verb'j'.
+If \verb'j' is absent,
+it is assumed to be equal to the length of \verb's'.
+Particularly, the call \verb'strsub(s,1,j)' returns a prefix of \verb's'
+with length \verb'j',
+while the call \verb'strsub(s,i)' returns a suffix of \verb's',
+starting at \verb'i'.
+
+\subsubsection*{{\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*{{\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*{{\tt ascii (s, [i])}}\Deffunc{ascii}
+Returns the ascii code of the character \verb's[i]'.
+If \verb'i' is absent, it is assumed to be 1.
+
+\subsubsection*{{\tt int2str (\{i\})}}\Deffunc{int2str}
+Receives 0 or more numbers.
+Returns a string with length equal to the number of arguments,
+wherein each character has ascii value equal
+to its correspondent argument.
+
+\subsection{Mathematical Functions} \label{mathlib}
+
+This library is an interface to some functions of the standard C math library.
+Moreover, it registers a fallback for the binary operator \verb'^' which,
+when applied to numbers \verb'x^y', returns $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}
+\begin{verbatim}
+abs acos asin atan atan2 ceil cos floor
+log log10 max min  mod  sin  sqrt tan
+\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 degrees.
+
+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 function \verb'mod' is equivalent to the \verb'%' operator in C.
+
+
+\subsection{I/O Facilities} \label{libio}
+
+All I/O operations in Lua are done over two {\em current} files,
+one for reading and one for writing.
+Initially, the current input file is \verb'stdin',
+and the current output file is \verb'stdout'.
+
+Unless otherwise stated,
+all I/O functions return 1 on success and \nil\ on failure.
+
+\subsubsection*{{\tt readfrom (filename)}}\Deffunc{readfrom}
+
+This function opens a file named \verb'filename' and sets it as the
+{\em current} input file.
+When called without parameters,
+this function closes the current input file,
+and restores \verb'stdin' as the current input file.
+
+{\em System dependent:} if \verb'filename' starts with a \verb'|',
+then a \Index{piped input} is open, via function \IndexVerb{popen}.
+
+\subsubsection*{{\tt writeto (filename)}}\Deffunc{writeto}
+
+This function opens a file named \verb'filename' and sets it as the
+{\em current} output file.
+Notice that, if the file already exists, it is completely erased with this
+operation.
+When called without parameters,
+this function closes the current output file,
+and restores \verb'stdout' as the current output file.
+\index{closing a file}
+
+{\em System dependent:} if \verb'filename' starts with a \verb'|',
+then a \Index{piped output} is open, via function \IndexVerb{popen}.
+
+\subsubsection*{{\tt appendto (filename)}}\Deffunc{appendto}
+
+This function opens a file named \verb'filename' and sets it as the
+{\em current} output file.
+Unlike the \verb'writeto' operation,
+this function does not erase any previous content of the file.
+This function returns 2 if the file already exists,
+1 if it creates a new file, and \nil\ on failure.
+
+\subsubsection*{{\tt remove (filename)}}\Deffunc{remove}
+
+This function deletes the file with the given name.
+
+\subsubsection*{{\tt read ([format])}}\Deffunc{read}
+
+This function returns a value read from the current input.
+An optional string argument specifies the way the input is interpreted.
+
+Without a format argument, {\tt read} first skips blanks, tabs and newlines.
+Then it checks whether the current character is \verb'"' or \verb-'-.
+If so, it reads a string up to the ending quotation mark,
+and returns this string, without the quotation marks.
+Otherwise it reads up to a blank, tab or newline.
+
+The format string can have the following format:
+\begin{verbatim}
+   ?[n]
+\end{verbatim}
+where \verb'?' can be:
+\begin{description}
+\item['s' or 'S'] to read a string;
+\item['f' or 'F'] to read a real number;
+\item['i' or 'I'] to read an integer.
+\end{description}
+The optional \verb'n' is a number which specifies how many characters
+must be read to compose the input value.
+Particularly, the format \verb'"s1"' reads a single character.
+
+\subsubsection*{{\tt readuntil (char)}}\Deffunc{readuntil}
+
+Reads the current input until the first ocurrence of the given character.
+Returns the string read.
+The character itself is not read.
+
+\subsubsection*{{\tt write (value, [format])}}\Deffunc{write}
+
+This function writes the value of its first argument to the current output.
+An optional second argument specifies the format to be used.
+This format is given as a string, composed of four parts.
+The first part is the only one not optional, and must be one of the
+following characters:
+\begin{description}
+\item['s' or 'S'] to write strings;
+\item['f' or 'F'] to write floats;
+\item['i' or 'I'] to write integers.
+\end{description}
+These characters can be followed by
+\begin{verbatim}
+   [?][m][.n]
+\end{verbatim}
+where:
+\begin{description}
+\item[\verb'?'] indicates justification inside the field.
+\begin{itemize}
+\item['\verb'<''] right justification (default);
+\item['\verb'>''] left justification;
+\item['\verb'|''] center justification.
+\end{itemize}
+\item[\verb'm'] Indicates the field size in characters.
+\item[\verb'.n'] For reals, indicates the number of digital places.
+For integers, it is the minimum number of digits.
+This option has no meaning for strings.
+\end{description}
+
+When called without a format string,
+this function writes numbers using the \verb'%g' format
+and strings with \verb'%s'.
+
+% \subsubsection*{{\tt debug ()}}
+% This function, when called, repeatedly presents a prompt \verb'lua_debug> '
+% in the error output stream (\verb'stderr'),
+% reads a line from the standard input,
+% and executes (``dostring'') the line.
+% The loop ends when the user types \verb'cont' to the prompt.
+% This function then returns and the execution of the program continues.
+
+
+\section{Some Examples}
+
+This section gives examples showing some features of Lua.
+It does not intend to cover the whole language,
+but only to illustrate some interesting uses of the system.
+
+
+\subsection{The Functions {\tt next} and {\tt nextvar}} \label{exnext}
+\Deffunc{next}\Deffunc{nextvar}
+This example shows how to use the function \verb'next' to iterate
+over the fields of a table.
+Function \Def{clone} receives any table and returns a clone of it.
+\begin{verbatim}
+function clone (t)           -- t is a table
+  local new_t = {}           -- creates a new table
+  local i, v = next(t, nil)  -- i is an index of t, v = t[i]
+  while i do
+    new_t[i] = v
+    i, v = next(t, i)        -- get next index
+  end
+  return new_t
+end
+\end{verbatim}
+
+The next example prints the names of all global variables
+in the system with non nil values:
+\begin{verbatim}
+function printGlobalVariables ()
+  local i, v = nextvar(nil)
+  while i do
+    print(i)
+    i, v = nextvar(i)
+  end
+end
+\end{verbatim}
+
+
+\subsection{String Manipulation} \label{exstring}
+
+The first example is a function to trim extra blanks at the beginning
+and end of a string.
+\begin{verbatim}
+function trim(s)
+  local l = 1
+  while strsub(s,l,l) == ' ' do
+    l = l+1
+  end
+  local r = strlen(s)
+  while strsub(s,r,r) == ' ' do
+    r = r-1
+  end
+  return strsub(s,l,r)
+end
+\end{verbatim}
+
+The second example shows a function that eliminates all blanks
+of a string.
+\begin{verbatim}
+function remove_blanks (s)
+  local b = strfind(s, ' ')
+  while b do
+    s = strsub(s, 1, b-1) .. strsub(s, b+1)
+    b = strfind(s, ' ')
+  end
+  return s
+end
+\end{verbatim}
+
+
+\subsection{\Index{Persistence}}
+Because of its reflexive facilities,
+persistence in Lua can be achieved within the language.
+This section shows some ways to store and retrieve values in Lua,
+using a text file written in the language itself as the storage media.
+
+To store a single value with a name,
+the following code is enough:
+\begin{verbatim}
+function store (name, value)
+  write('\n' .. name .. '=')
+  write_value(value)
+end
+\end{verbatim}
+\begin{verbatim}
+function write_value (value)
+  local t = type(value)
+      if t == 'nil'    then write('nil')
+  elseif t == 'number' then write(value)
+  elseif t == 'string' then write('[[' .. value .. ']]')
+  end
+end
+\end{verbatim}
+In order to restore this value, a \verb'lua_dofile' suffices.
+
+Storing tables is a little more complex.
+Assuming that the table is a tree,
+and all indices are identifiers
+(that is, the tables are being used as records),
+its value can be written directly with table constructors.
+First, the function \verb'write_value' is changed to
+\begin{verbatim}
+function write_value (value)
+  local t = type(value)
+      if t == 'nil'    then write('nil')
+  elseif t == 'number' then write(value)
+  elseif t == 'string' then write('"' .. value .. '"')
+  elseif t == 'table'  then write_record(value)
+  end
+end
+\end{verbatim}
+The function \verb'write_record' is:
+\begin{verbatim}
+function write_record(t)
+  local i, v = next(t, nil)
+  write('{')  -- starts constructor
+  while i do
+    store(i, v)
+    write(', ')
+    i, v = next(t, i)
+  end
+  write('}')  -- closes constructor
+end
+\end{verbatim}
+
+
+\subsection{Inheritance} \label{exfallback}
+The fallback for absent indices can be used to implement many
+kinds of \Index{inheritance} in Lua.
+As an example,
+the following code implements single inheritance:
+\begin{verbatim}
+function Index (t,f)
+  if f == 'parent' then  -- to avoid loop
+    return OldIndex(t,f)
+  end
+  local p = t.parent
+  if type(p) == 'table' then
+    return p[f]
+  else
+    return OldIndex(t,f)
+  end
+end
+
+OldIndex = setfallback("index", Index)
+\end{verbatim}
+Whenever Lua attempts to access an absent field in a table,
+it calls the fallback function \verb'Index'.
+If the table has a field \verb'parent' with a table value,
+then Lua attempts to access the desired field in this parent object.
+This process is repeated ``upwards'' until a value
+for the field is found or the object has no parent.
+In the latter case, the previous fallback is called to supply a value
+for the field.
+
+When better performance is needed,
+the same fallback may be implemented in C,
+as illustrated in Figure~\ref{Cinher}.
+\begin{figure}
+\Line
+\begin{verbatim}
+int lockedParentName;  /* stores the lock index for the string "parent" */
+int lockedOldIndex;    /* previous fallback function */
+
+void callOldFallback (lua_Object table, lua_Object index)
+{
+  lua_Object oldIndex = lua_getlocked(lockedOldIndex);
+  lua_pushobject(table);
+  lua_pushobject(index);
+  lua_callfunction(oldIndex);
+}
+
+void Index (void)
+{
+  lua_Object table = lua_getparam(1);
+  lua_Object index = lua_getparam(2);
+  lua_Object parent;
+  if (lua_isstring(index) && strcmp(lua_getstring(index), "parent") == 0)
+  {
+    callOldFallback(table, index);
+    return;
+  }
+  lua_pushobject(table);
+  lua_pushlocked(lockedParentName);
+  parent = lua_getsubscript();
+  if (lua_istable(parent))
+  {
+    lua_pushobject(parent);
+    lua_pushobject(index);
+    /* return result from getsubscript */
+    lua_pushobject(lua_getsubscript());
+  }
+  else
+    callOldFallback(table, index);
+}
+\end{verbatim}
+\caption{Inheritance in C.\label{Cinher}}
+\Line
+\end{figure}
+This code must be registered with:
+\begin{verbatim}
+  lua_pushliteral("parent");
+  lockedParentName = lua_lock();
+  lua_pushobject(lua_setfallback("index", Index));
+  lockedOldIndex = lua_lock();
+\end{verbatim}
+Notice how the string \verb'"parent"' is kept
+locked in Lua for optimal performance.
+
+\subsection{A CFunction} \label{exCFunction}\index{functions in C}
+A CFunction to compute the maximum of a variable number of arguments
+is shown in Figure~\ref{Cmax}.
+\begin{figure}
+\Line
+\begin{verbatim}
+void math_max (void)
+{
+ int i=1;   /* number of arguments */
+ double d, dmax;
+ lua_Object o;
+ /* the function must get at least one argument */
+ if ((o = lua_getparam(i++)) == LUA_NOOBJECT)
+   lua_error ("too few arguments to function `max'");
+ /* and this argument must be a number */
+ if (!lua_isnumber(o))
+   lua_error ("incorrect argument to function `max'");
+ dmax = lua_getnumber (o);
+ /* loops until there is no more arguments */
+ while ((o = lua_getparam(i++)) != LUA_NOOBJECT)
+ {
+  if (!lua_isnumber(o))
+    lua_error ("incorrect argument to function `max'");
+  d = lua_getnumber (o);
+  if (d > dmax) dmax = d;
+ }
+ /* push the result to be returned */
+ lua_pushnumber (dmax);
+}
+\end{verbatim}
+\caption{C function {\tt math\_max}.\label{Cmax}}
+\Line
+\end{figure}
+After registered with
+\begin{verbatim}
+lua_register ("max", math_max);
+\end{verbatim}
+this function is available in Lua, as follows:
+\begin{verbatim}
+i = max(4, 5, 10, -34)  -- i receives 10
+\end{verbatim}
+
+
+\subsection{Calling Lua Functions} \label{exLuacall}
+
+This example illustrates how a C function can call the Lua function
+\verb'remove_blanks' presented in Section~\ref{exstring}.
+\begin{verbatim}
+void remove_blanks (char *s)
+{
+  lua_pushstring(s);  /* prepare parameter */
+  lua_call("remove_blanks");  /* call Lua function */
+  strcpy(s, lua_getstring(lua_getresult(1)));  /* copy result back to 's' */
+}
+\end{verbatim}
+
+
+\section*{Acknowledgments}
+
+The authors would like to thank CENPES/PETROBR\'AS 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%
+\footnote{BTW, 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 differences.
+
+\subsection*{Incompatibilities with \Index{version 2.1}}
+\begin{itemize}
+\item
+The function {\tt type} now returns the string {\tt 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 correspondent call,
+with no intermediate calls to Lua.
+Special care should be taken with macros like
+\verb'lua_getindexed' and \verb'lua_getfield'.
+\end{itemize}
+
+\end{document}
