Browse Source

towards 5.0 alpha...

Roberto Ierusalimschy 23 years ago
parent
commit
3b058177af
1 changed files with 179 additions and 136 deletions
  1. 179 136
      manual.tex

+ 179 - 136
manual.tex

@@ -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}
-(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
 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
-\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}
 \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))
-             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);
            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.
-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.
 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
-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|.
 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
-(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
 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 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
 \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.