1
0
mirror of https://github.com/lua/lua.git synced 2025-01-14 05:43:00 +08:00

towards 5.0 alpha...

This commit is contained in:
Roberto Ierusalimschy 2002-08-09 18:03:19 -03:00
parent 586e510577
commit 3b058177af

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} \documentclass[11pt,twoside,draft]{article}
\usepackage{fullpage} \usepackage{fullpage}
@ -133,7 +133,7 @@ Waldemar Celes
\tecgraf\ --- Computer Science Department --- PUC-Rio \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 \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. \emph{Proceedings of V Brazilian Symposium on Programming Languages} (2001) B-14--B-28.
\end{itemize} \end{itemize}
Lua means ``moon'' in Portuguese.
%------------------------------------------------------------------------------ %------------------------------------------------------------------------------
\section{Lua Concepts}\label{concepts} \section{Lua Concepts}\label{concepts}
@ -293,6 +295,10 @@ Lua automatically detects the file type and acts accordingly.
\index{pre-compilation} \index{pre-compilation}
\subsection{Table of Globals} \label{global-table}
????
\subsection{\Index{Values and Types}} \label{TypesSec} \subsection{\Index{Values and Types}} \label{TypesSec}
Lua is a \emph{dynamically typed language}. Lua is a \emph{dynamically typed language}.
@ -331,7 +337,7 @@ and has no pre-defined operations in Lua,
except assignment and identity test. except assignment and identity test.
However, by using \emph{metatables}, However, by using \emph{metatables},
the programmer can define operations for userdata values the programmer can define operations for userdata values
\see{metatables}. \see{metatable}.
Userdata values cannot be created or modified in Lua, Userdata values cannot be created or modified in Lua,
only through the C~API. only through the C~API.
This guarantees the integrity of data owned by the host program. 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, that is,
two tables are considered equal only if they are the \emph{same} table. 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), Every time you create a new table (or userdata, or function),
this new value is different from any previously existing value. 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} \subsection{Error Handling} \label{error}
%% TODO Must be rewritten!!!
Because Lua is an extension language, Because Lua is an extension language,
all Lua actions start from C~code in the host program 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, Whenever an error occurs during Lua compilation or execution,
the function \verb|_ERRORMESSAGE| is called \DefLIB{_ERRORMESSAGE} control returns to C,
(provided it is different from \nil), which can take appropriate measures
and then the corresponding function from the library (such as to print an error message).
(\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.
Lua code can explicitly generate an error by calling the Lua code can explicitly generate an error by calling the
function \verb|error| \see{pdf-error}. function \verb|error| \see{pdf-error}.
Lua code can ``catch'' an error using the function If you need to catch errors in Lua,
\verb|call| \see{pdf-call}. you can use the \verb|pcall| function \see{pdf-pcall}.
\subsection{Metatables} \label{metatable} \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, When Lua collects a full userdata,
it calls its \verb|gc| metamethod, if any, 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} \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} \subsection{Loading Lua Chunks}
You can load a Lua chunk with You can load a Lua chunk with
\begin{verbatim} \begin{verbatim}
typedef const char * (*lua_Chunkreader) typedef const char * (*lua_Chunkreader)
@ -2183,9 +2182,10 @@ Everytime it needs another piece of the chunk,
it calls the reader, it calls the reader,
passing along its \verb|data| parameter. passing along its \verb|data| parameter.
The reader must return a pointer to a block of memory 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. and set \verb|size| to the block size.
To signal the end of the chunk, the reader must return \verb|NULL|. 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, In the current implementation,
the reader function cannot call any Lua function; 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 and for some ready-to-use functions to load chunks
from files and from strings. 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} \subsection{Manipulating Tables}
Tables are created by calling Tables are created by calling
@ -2426,7 +2389,54 @@ to show all the details.
Usually programmers use several macros and auxiliar functions that Usually programmers use several macros and auxiliar functions that
provide higher level access to Lua.) 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 \medskip
@ -2494,8 +2504,10 @@ of numerical arguments and returns their average and sum:
lua_Number sum = 0; lua_Number sum = 0;
int i; int i;
for (i = 1; i <= n; i++) { for (i = 1; i <= n; i++) {
if (!lua_isnumber(L, i)) if (!lua_isnumber(L, i)) {
lua_error(L, "incorrect argument to function `average'"); lua_pushstring(L, "incorrect argument to function `average'");
lua_error(L);
}
sum += lua_tonumber(L, i); sum += lua_tonumber(L, i);
} }
lua_pushnumber(L, sum/n); /* first result */ 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 This table is always located at pseudo-index
\IndexAPI{LUA_REGISTRYINDEX}. \IndexAPI{LUA_REGISTRYINDEX}.
Any C~library can store data into this table, Any C~library can store data into this table,
as long as it chooses a key different from other libraries. as long as it chooses keys different from other libraries.
Typically, you can use as key a string containing the library name, 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. 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, 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 which allows the construction of different
kinds of debuggers, profilers, and other tools kinds of debuggers, profilers, and other tools
that need ``inside information'' from the interpreter. that need ``inside information'' from the interpreter.
This interface is declared in \verb|luadebug.h|.
\subsection{Stack and Function Information} \subsection{Stack and Function Information}
@ -2683,15 +2694,10 @@ Because functions in Lua are first class values,
they do not have a fixed name: they do not have a fixed name:
Some functions may be the value of many global variables, Some functions may be the value of many global variables,
while others may be stored only in a table field. while others may be stored only in a table field.
The \verb|lua_getinfo| function checks whether the given The \verb|lua_getinfo| function checks how the function was
function is a tag method or the value of a global variable. called or whether it is the value of a global variable to
If the given function is a tag method, find a suitable name.
then \verb|name| points to the event name. If it cannot find a 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,
then \verb|name| is set to \verb|NULL|. then \verb|name| is set to \verb|NULL|.
\item[namewhat] \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, \verb|lua_getlocal| gets the index \verb|n| of a local variable,
pushes its value onto the stack, pushes its value onto the stack,
and returns its name. and returns its name.
%% TODO: why return name?
\verb|lua_setlocal| assigns the value at the top of the stack \verb|lua_setlocal| assigns the value at the top of the stack
to the variable and returns its name. to the variable and returns its name.
Both functions return \verb|NULL| on failure, Both functions return \verb|NULL| on failure,
@ -2860,33 +2865,6 @@ This function is equivalent to the following Lua function:
end end
\end{verbatim} \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} \subsubsection*{\ff \T{collectgarbage ([limit])}}\DefLIB{collectgarbage}
Sets the garbage-collection threshold for the given limit 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 and (as a second result) the
current garbage collector threshold (also in Kbytes). 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} \subsubsection*{\ff \T{loadfile (filename)}}\DefLIB{loadfile}
Loads a file as a Lua chunk. Loads a file as a Lua chunk.
If there is no errors, 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 behavior of \verb|next| is \emph{undefined} if you change
the table during the traversal. 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} \subsubsection*{\ff \T{print (e1, e2, ...)}}\DefLIB{print}
Receives any number of arguments, Receives any number of arguments,
and prints their values in \verb|stdout|, 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 String values to be formatted with
\verb|%s| cannot contain embedded zeros. \verb|%s| cannot contain embedded zeros.
\subsubsection*{\ff \T{string.gfind (s, pat)}}
% TODO
\subsubsection*{\ff \T{string.gsub (s, pat, repl [, n])}} \subsubsection*{\ff \T{string.gsub (s, pat, repl [, n])}}
\DefLIB{string.gsub} \DefLIB{string.gsub}
Returns a copy of \verb|s| 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 You can call the \verb|table.setn| function to explicitly set
the size of a table. the size of a table.
\item implicit size --- \item implicit size ---
%% TODO Otherwise, the size of the object is one less the first integer index
with a \nil{} value.
\end{itemize} \end{itemize}
For more details, see the descriptions of the \verb|table.getn| and For more details, see the descriptions of the \verb|table.getn| and
\verb|table.setn| functions. \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, the first argument after the program goes to index 1,
and so on. and so on.
The field \verb|n| gets the number of arguments after the program name. The field \verb|n| gets the number of arguments after the program name.
Any argument before the program name Any arguments before the program name
(that is, the options plus the interpreter name) (that is, the interpreter name plus the options)
goes to negative indices. go to negative indices.
For instance, in the call For instance, in the call
\begin{verbatim} \begin{verbatim}
$ lua -la.lua b.lua t1 t2 $ lua -la.lua b.lua t1 t2
@ -4020,14 +4031,44 @@ then a more portable solution is \verb|#!/usr/bin/env lua|.)
%------------------------------------------------------------------------------ %------------------------------------------------------------------------------
\section*{Acknowledgments} \section*{Acknowledgments}
%% TODO rever isso? The Lua team is grateful to \tecgraf{} for its continued support to Lua.
We thank everyone at \tecgraf{},
The authors thank CENPES/PETROBRAS which, specially the head of the group, Marcelo Gattass.
jointly with \tecgraf, used early versions of At the risk of omitting several names,
this system extensively and gave valuable comments. we also thank the following individuals for supporting,
The authors also thank Carlos Henrique Levy, contributing to, and spreading the word about Lua:
who found the name of the game. Alan Watson,
Lua means ``moon'' in Portuguese. 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 \appendix
@ -4035,12 +4076,6 @@ Lua means ``moon'' in Portuguese.
\section*{Incompatibilities with Previous Versions} \section*{Incompatibilities with Previous Versions}
\addcontentsline{toc}{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}} \subsection*{Incompatibilities with \Index{version 4.0}}
\subsubsection*{Changes in the Language} \subsubsection*{Changes in the Language}
@ -4068,6 +4103,14 @@ this newline is ignored.
\subsubsection*{Changes in the Libraries} \subsubsection*{Changes in the Libraries}
\begin{itemize} \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 \item
The \verb|read| option \verb|*w| is obsolete. The \verb|read| option \verb|*w| is obsolete.