towards 5.0 alpha...

This commit is contained in:
Roberto Ierusalimschy 2002-08-09 18:03:19 -03:00
parent 586e510577
commit 3b058177af
1 changed files with 179 additions and 136 deletions

View File

@ -1,4 +1,4 @@
% $Id: manual.tex,v 1.56 2002/06/06 12:49:28 roberto Exp roberto $
% $Id: manual.tex,v 1.57 2002/08/06 19:10:44 roberto Exp roberto $
\documentclass[11pt,twoside,draft]{article}
\usepackage{fullpage}
@ -133,7 +133,7 @@ Waldemar Celes
\tecgraf\ --- Computer Science Department --- PUC-Rio
}
%\date{{\small \tt\$Date: 2002/06/06 12:49:28 $ $}}
%\date{{\small \tt\$Date: 2002/08/06 19:10:44 $ $}}
\maketitle
@ -251,6 +251,8 @@ The evolution of an extension language: a history of Lua,
\emph{Proceedings of V Brazilian Symposium on Programming Languages} (2001) B-14--B-28.
\end{itemize}
Lua means ``moon'' in Portuguese.
%------------------------------------------------------------------------------
\section{Lua Concepts}\label{concepts}
@ -293,6 +295,10 @@ Lua automatically detects the file type and acts accordingly.
\index{pre-compilation}
\subsection{Table of Globals} \label{global-table}
????
\subsection{\Index{Values and Types}} \label{TypesSec}
Lua is a \emph{dynamically typed language}.
@ -331,7 +337,7 @@ and has no pre-defined operations in Lua,
except assignment and identity test.
However, by using \emph{metatables},
the programmer can define operations for userdata values
\see{metatables}.
\see{metatable}.
Userdata values cannot be created or modified in Lua,
only through the C~API.
This guarantees the integrity of data owned by the host program.
@ -966,7 +972,7 @@ Tables, userdata, and functions are compared \emph{by reference},
that is,
two tables are considered equal only if they are the \emph{same} table.
??eq metamethod??
%% TODO eq metamethod
Every time you create a new table (or userdata, or function),
this new value is different from any previously existing value.
@ -1358,43 +1364,18 @@ while all of them share the same \verb|x|.
\subsection{Error Handling} \label{error}
%% TODO Must be rewritten!!!
Because Lua is an extension language,
all Lua actions start from C~code in the host program
calling a function from the Lua library.
calling a function from the Lua library \see{pcall}.
Whenever an error occurs during Lua compilation or execution,
the function \verb|_ERRORMESSAGE| is called \DefLIB{_ERRORMESSAGE}
(provided it is different from \nil),
and then the corresponding function from the library
(\verb|lua_dofile|, \verb|lua_dostring|,
\verb|lua_dobuffer|, or \verb|lua_call|)
is terminated, returning an error condition.
Memory allocation errors are an exception to the previous rule.
When memory allocation fails, Lua may not be able to execute the
\verb|_ERRORMESSAGE| function.
So, for this kind of error, Lua does not call
the \verb|_ERRORMESSAGE| function;
instead, the corresponding function from the library
returns immediately with a special error code (\verb|LUA_ERRMEM|).
This and other error codes are defined in \verb|lua.h|
\see{luado}.
The only argument to \verb|_ERRORMESSAGE| is a string
describing the error.
The default definition for
this function calls \verb|_ALERT|, \DefLIB{_ALERT}
which prints the message to \verb|stderr| \see{alert}.
The standard I/O library redefines \verb|_ERRORMESSAGE|
and uses the debug interface \see{debugI}
to print some extra information,
such as a call-stack traceback.
control returns to C,
which can take appropriate measures
(such as to print an error message).
Lua code can explicitly generate an error by calling the
function \verb|error| \see{pdf-error}.
Lua code can ``catch'' an error using the function
\verb|call| \see{pdf-call}.
If you need to catch errors in Lua,
you can use the \verb|pcall| function \see{pdf-pcall}.
\subsection{Metatables} \label{metatable}
@ -2161,14 +2142,32 @@ when applied on a non-userdata value, it returns \verb|NULL|.
When Lua collects a full userdata,
it calls its \verb|gc| metamethod, if any,
and then it automatically frees its corresponding memory.
and then it frees its corresponding memory.
\subsection{Metatables}
%% TODO
The following functions allow you do manipulate the metatables
of an object:
\begin{verbatim}
int lua_getmetatable (lua_State *L, int objindex);
int lua_setmetatable (lua_State *L, int objindex);
\end{verbatim}
\DefAPI{lua_getmetatable}\DefAPI{lua_setmetatable}
Both get at \verb|objindex| a valid index for an object.
\verb|lua_getmetatable| pushes on the stack the metatable of that object;
\verb|lua_setmetatable| sets the table on the top of the stack as the
new metatable for that object (and pops the table).
If the object does not have a metatable,
\verb|lua_getmetatable| returns 0, and pushes nothing on the stack.
\verb|lua_setmetatable| returns 0 when it cannot
set the metatable of the given object
(that is, when the object is not a userdata nor a table);
even then it pops the table from the stack.
\subsection{Loading Lua Chunks}
You can load a Lua chunk with
\begin{verbatim}
typedef const char * (*lua_Chunkreader)
@ -2183,9 +2182,10 @@ Everytime it needs another piece of the chunk,
it calls the reader,
passing along its \verb|data| parameter.
The reader must return a pointer to a block of memory
with the part of the chunk,
with a new part of the chunk,
and set \verb|size| to the block size.
To signal the end of the chunk, the reader must return \verb|NULL|.
The reader function may return pieces of any size greater than zero.
In the current implementation,
the reader function cannot call any Lua function;
@ -2214,43 +2214,6 @@ for examples of how to use \verb|lua_load|,
and for some ready-to-use functions to load chunks
from files and from strings.
\subsection{Executing Lua Chunks}\label{luado}
>>>>
A host program can execute Lua chunks written in a file or in a string
by using the following functions:
\begin{verbatim}
int lua_dofile (lua_State *L, const char *filename);
int lua_dostring (lua_State *L, const char *string);
int lua_dobuffer (lua_State *L, const char *buff,
size_t size, const char *name);
\end{verbatim}
\DefAPI{lua_dofile}\DefAPI{lua_dostring}\DefAPI{lua_dobuffer}%
These functions return
0 in case of success, or one of the following error codes
(defined in \verb|lua.h|)
if they fail:
\begin{itemize}
\item \IndexAPI{LUA_ERRRUN} ---
error while running the chunk.
\item \IndexAPI{LUA_ERRSYNTAX} ---
syntax error during pre-compilation.
\item \IndexAPI{LUA_ERRMEM} ---
memory allocation error.
For such errors, Lua does not call \verb|_ERRORMESSAGE| \see{error}.
\item \IndexAPI{LUA_ERRERR} ---
error while running \verb|_ERRORMESSAGE|.
For such errors, Lua does not call \verb|_ERRORMESSAGE| again, to avoid loops.
\item \IndexAPI{LUA_ERRFILE} ---
error opening the file (only for \verb|lua_dofile|).
In this case,
you may want to
check \verb|errno|,
call \verb|strerror|,
or call \verb|perror| to tell the user what went wrong.
\end{itemize}
\subsection{Manipulating Tables}
Tables are created by calling
@ -2426,7 +2389,54 @@ to show all the details.
Usually programmers use several macros and auxiliar functions that
provide higher level access to Lua.)
%% TODO: pcall
\subsection{Protected Calls}\label{pcall}
When you call a function with \verb|lua_call|,
any error inside the called function is propagated upwards
(with a \verb|longjmp|).
If you need to handle errors,
then you should use \verb|lua_pcall|:
\begin{verbatim}
int lua_pcall (lua_State *L, int nargs, int nresults, int errfunc);
\end{verbatim}
Both \verb|nargs| and \verb|nresults| have the same meaning as
in \verb|lua_call|.
If there are no errors during the call,
\verb|lua_pcall| behaves exactly like \verb|lua_call|.
Like \verb|lua_call|,
\verb|lua_pcall| always removes the function
and its arguments from the stack.
However, if there is any error,
\verb|lua_pcall| catches it,
pushes a single value at the stack (the error message),
and returns an error code.
If \verb|errfunc| is 0,
then the error message returned is exactly the original error message.
Otherwise, \verb|errfunc| gives the stack index for an
\emph{error handler function}.
(In the current implementation, that index cannot be a pseudo-index.)
In case of runtime errors,
that function will be called with the error message,
and its return value will be the message returned by \verb|lua_pcall|.
Typically, the error handler function is used to add more debug
information to the error message, such as a stack traceback.
Such information cannot be gathered after the return of \verb|lua_pcall|,
since by then the stack has unwound.
The \verb|lua_pcall| function returns 0 in case of success,
or one of the following error codes
(defined in \verb|lua.h|):
\begin{itemize}
\item \IndexAPI{LUA_ERRRUN} --- a runtime error.
\item \IndexAPI{LUA_ERRMEM} --- memory allocation error.
For such errors, Lua does not call the error handler function.
\item \IndexAPI{LUA_ERRERR} ---
error while running the error handler function.
\end{itemize}
\medskip
@ -2494,8 +2504,10 @@ of numerical arguments and returns their average and sum:
lua_Number sum = 0;
int i;
for (i = 1; i <= n; i++) {
if (!lua_isnumber(L, i))
lua_error(L, "incorrect argument to function `average'");
if (!lua_isnumber(L, i)) {
lua_pushstring(L, "incorrect argument to function `average'");
lua_error(L);
}
sum += lua_tonumber(L, i);
}
lua_pushnumber(L, sum/n); /* first result */
@ -2565,8 +2577,8 @@ outside the life span of a C~function.
This table is always located at pseudo-index
\IndexAPI{LUA_REGISTRYINDEX}.
Any C~library can store data into this table,
as long as it chooses a key different from other libraries.
Typically, you can use as key a string containing the library name,
as long as it chooses keys different from other libraries.
Typically, you should use as key a string containing your library name,
or a light userdata with the address of a C object in your code.
The integer keys in the registry are used by the reference mechanism,
@ -2583,7 +2595,6 @@ by means of functions and \emph{hooks},
which allows the construction of different
kinds of debuggers, profilers, and other tools
that need ``inside information'' from the interpreter.
This interface is declared in \verb|luadebug.h|.
\subsection{Stack and Function Information}
@ -2683,15 +2694,10 @@ Because functions in Lua are first class values,
they do not have a fixed name:
Some functions may be the value of many global variables,
while others may be stored only in a table field.
The \verb|lua_getinfo| function checks whether the given
function is a tag method or the value of a global variable.
If the given function is a tag method,
then \verb|name| points to the event name.
%% TODO: mas qual o tag? Agora que temos tipos com nome, seria util saber
%% o tipo de TM. Em particular para mensagens de erro.
If the given function is the value of a global variable,
then \verb|name| points to the variable name.
If the given function is neither a tag method nor a global variable,
The \verb|lua_getinfo| function checks how the function was
called or whether it is the value of a global variable to
find a suitable name.
If it cannot find a name,
then \verb|name| is set to \verb|NULL|.
\item[namewhat]
@ -2727,7 +2733,6 @@ given as argument to a hook \see{sub-hooks}.
\verb|lua_getlocal| gets the index \verb|n| of a local variable,
pushes its value onto the stack,
and returns its name.
%% TODO: why return name?
\verb|lua_setlocal| assigns the value at the top of the stack
to the variable and returns its name.
Both functions return \verb|NULL| on failure,
@ -2860,33 +2865,6 @@ This function is equivalent to the following Lua function:
end
\end{verbatim}
??\subsubsection*{\ff \T{call (func, arg [, mode [, errhandler]])}}\DefLIB{call}
\label{pdf-call}
Calls function \verb|func| with
the arguments given by the table \verb|arg|.
The call is equivalent to
\begin{verbatim}
func(arg[1], arg[2], ..., arg[n])
\end{verbatim}
where \verb|n| is the result of \verb|getn(arg)| \see{getn}.
All results from \verb|func| are simply returned by \verb|call|.
By default,
if an error occurs during the call to \verb|func|,
the error is propagated.
If the string \verb|mode| contains \verb|"x"|,
then the call is \emph{protected}.\index{protected calls}
In this mode, function \verb|call| does not propagate an error,
regardless of what happens during the call.
Instead, it returns \nil{} to signal the error
(besides calling the appropriated error handler).
If \verb|errhandler| is provided,
the error function \verb|_ERRORMESSAGE| is temporarily set to \verb|errhandler|,
while \verb|func| runs.
In particular, if \verb|errhandler| is \nil,
no error messages will be issued during the execution of the called function.
\subsubsection*{\ff \T{collectgarbage ([limit])}}\DefLIB{collectgarbage}
Sets the garbage-collection threshold for the given limit
@ -2935,6 +2913,16 @@ Returns the number of Kbytes of dynamic memory Lua is using,
and (as a second result) the
current garbage collector threshold (also in Kbytes).
\subsubsection*{\ff \T{ipairs (t)}}\DefLIB{ipairs}
Returns the table \verb|t| and a generator function
so that the construction
\begin{verbatim}
for i,v in ipairs(t) do ... end
\end{verbatim}
will iterate over the pairs \verb|1, t[1]|, \verb|2, t[2]|, \ldots,
up to the first nil value of the table.
\subsubsection*{\ff \T{loadfile (filename)}}\DefLIB{loadfile}
Loads a file as a Lua chunk.
If there is no errors,
@ -2982,6 +2970,24 @@ use a numerical \rwd{for} or the function \verb|ipairs|).
The behavior of \verb|next| is \emph{undefined} if you change
the table during the traversal.
\subsubsection*{\ff \T{pairs (t)}}\DefLIB{pairs}
Returns the table \verb|t| and the function \verb|next|,
so that the construction
\begin{verbatim}
for k,v in pairs(t) do ... end
\end{verbatim}
will iterate over all pairs of key--value of table \verb|t|.
\subsubsection*{\ff \T{pcall (func, arg1, arg2, ...)}}\DefLIB{pcall}
\label{pdf-pcall}
Calls function \verb|func| with
the given arguments in protected mode.
Its first result is a boolean, true if the call succeeds without errors.
In such case, \verb|pcall| also returns all results from the call,
after this first result.
In case of any error, \verb|pcall| returns false plus the error message.
\subsubsection*{\ff \T{print (e1, e2, ...)}}\DefLIB{print}
Receives any number of arguments,
and prints their values in \verb|stdout|,
@ -3225,6 +3231,10 @@ For example, \verb|"%*g"| can be simulated with
String values to be formatted with
\verb|%s| cannot contain embedded zeros.
\subsubsection*{\ff \T{string.gfind (s, pat)}}
% TODO
\subsubsection*{\ff \T{string.gsub (s, pat, repl [, n])}}
\DefLIB{string.gsub}
Returns a copy of \verb|s|
@ -3410,7 +3420,8 @@ that value is assumed as its size.
You can call the \verb|table.setn| function to explicitly set
the size of a table.
\item implicit size ---
%% TODO
Otherwise, the size of the object is one less the first integer index
with a \nil{} value.
\end{itemize}
For more details, see the descriptions of the \verb|table.getn| and
\verb|table.setn| functions.
@ -3977,9 +3988,9 @@ The program name is stored in index 0,
the first argument after the program goes to index 1,
and so on.
The field \verb|n| gets the number of arguments after the program name.
Any argument before the program name
(that is, the options plus the interpreter name)
goes to negative indices.
Any arguments before the program name
(that is, the interpreter name plus the options)
go to negative indices.
For instance, in the call
\begin{verbatim}
$ lua -la.lua b.lua t1 t2
@ -4020,14 +4031,44 @@ then a more portable solution is \verb|#!/usr/bin/env lua|.)
%------------------------------------------------------------------------------
\section*{Acknowledgments}
%% TODO rever isso?
The authors thank CENPES/PETROBRAS which,
jointly with \tecgraf, used early versions of
this system extensively and gave valuable comments.
The authors also thank Carlos Henrique Levy,
who found the name of the game.
Lua means ``moon'' in Portuguese.
The Lua team is grateful to \tecgraf{} for its continued support to Lua.
We thank everyone at \tecgraf{},
specially the head of the group, Marcelo Gattass.
At the risk of omitting several names,
we also thank the following individuals for supporting,
contributing to, and spreading the word about Lua:
Alan Watson,
Andr\'e Clinio,
Andr\'e Costa,
Bret Mogilefsky,
Cameron Laird,
Carlos Cassino,
Carlos Henrique Levy,
Claudio Terra,
David Jeske,
Edgar Toernig,
Erik Hougaard,
Jim Mathies,
John Belmonte,
John Passaniti,
John Roll,
Jon Erickson,
Jon Kleiser,
Mark Ian Barlow,
Nick Trout,
Noemi Rodriguez,
Norman Ramsey,
Philippe Lhost,
Renata Ratton,
Renato Borges,
Renato Cerqueira,
Reuben Thomas,
Stephan Herrmann,
Steve Dekorte,
Thatcher Ulrich,
Tom\'as Gorham,
Vincent Penquerc'h.
Thank you!
\appendix
@ -4035,12 +4076,6 @@ Lua means ``moon'' in Portuguese.
\section*{Incompatibilities with Previous Versions}
\addcontentsline{toc}{section}{Incompatibilities with Previous Versions}
We took a great care to avoid incompatibilities with
the previous public versions of Lua,
but some differences had to be introduced.
Here is a list of all these incompatibilities.
\subsection*{Incompatibilities with \Index{version 4.0}}
\subsubsection*{Changes in the Language}
@ -4068,6 +4103,14 @@ this newline is ignored.
\subsubsection*{Changes in the Libraries}
\begin{itemize}
\item
Most library functions now are defined inside tables.
There is a compatibility script (\verb|compat.lua|) that
redefine most of them as global names.
\item
\verb|dofile| do not handle errors, but simply propagate them.
\item
The \verb|read| option \verb|*w| is obsolete.