Browse Source

lots of new stuff from 3.2

Roberto Ierusalimschy 26 years ago
parent
commit
8fdd06ba3c
1 changed files with 138 additions and 69 deletions
  1. 138 69
      manual.tex

+ 138 - 69
manual.tex

@@ -1,4 +1,4 @@
-% $Id: manual.tex,v 1.20 1998/11/13 16:48:48 roberto Exp roberto $
+% $Id: manual.tex,v 1.21 1998/11/20 15:41:43 roberto Exp roberto $
 
 
 \documentclass[11pt]{article}
 \documentclass[11pt]{article}
 \usepackage{fullpage,bnf}
 \usepackage{fullpage,bnf}
@@ -41,7 +41,7 @@ Waldemar Celes
 \tecgraf\ --- Computer Science Department --- PUC-Rio
 \tecgraf\ --- Computer Science Department --- PUC-Rio
 }
 }
 
 
-%\date{\small \verb$Date: 1998/11/13 16:48:48 $}
+%\date{\small \verb$Date: 1998/11/20 15:41:43 $}
 
 
 \maketitle
 \maketitle
 
 
@@ -410,11 +410,7 @@ Lua provides some automatic conversions between values at run time.
 Any arithmetic operation applied to a string tries to convert
 Any arithmetic operation applied to a string tries to convert
 that string to a number, following the usual rules.
 that string to a number, following the usual rules.
 Conversely, whenever a number is used when a string is expected,
 Conversely, whenever a number is used when a string is expected,
-that number is converted to a string, according to the following rule:
-if the number is an integer, it is written without exponent or decimal point;
-otherwise, it is formatted following the \verb|%g|
-conversion specification of the \verb|printf| function in the
-standard C library.
+that number is converted to a string, in a reasonable format.
 For complete control on how numbers are converted to strings,
 For complete control on how numbers are converted to strings,
 use the \verb|format| function \see{format}.
 use the \verb|format| function \see{format}.
 
 
@@ -523,9 +519,9 @@ only \nil\ is considered false.
 \begin{Produc}
 \begin{Produc}
 \produc{stat}{\rwd{while} exp1 \rwd{do} block \rwd{end} \OrNL
 \produc{stat}{\rwd{while} exp1 \rwd{do} block \rwd{end} \OrNL
 \rwd{repeat} block \rwd{until} exp1 \OrNL
 \rwd{repeat} block \rwd{until} exp1 \OrNL
-\rwd{if} exp1 \rwd{then} block \rep{elseif}
+\rwd{if} exp1 \rwd{then} block
+  \rep{\rwd{elseif} exp1 \rwd{then} block}
    \opt{\rwd{else} block} \rwd{end}}
    \opt{\rwd{else} block} \rwd{end}}
-\produc{elseif}{\rwd{elseif} exp1 \rwd{then} block}
 \end{Produc}
 \end{Produc}
 
 
 A \T{return} is used to return values from a function or from a chunk.
 A \T{return} is used to return values from a function or from a chunk.
@@ -688,6 +684,24 @@ All binary operators are left associative,
 except for \verb|^| (exponentiation),
 except for \verb|^| (exponentiation),
 which is right associative.
 which is right associative.
 
 
+\subsubsection{If Expressions}
+\begin{Produc}
+\produc{exp}{\rwd{if} exp1 \rwd{then} exp1
+   \rep{\rwd{elseif} exp1 \rwd{then} exp1}
+   \opt{\rwd{else} exp1} \rwd{end}}
+\end{Produc}%
+An \Index{if expression} chooses an expression to evaluate
+according to its condition.
+Its final value is the value of the chosen expression.
+An absent else-part is equivalent to \verb|else nil|.
+
+\subsubsection{Assignment Expressions}
+\begin{Produc}
+\produc{exp}{\ter{(} var \ter{=} exp1 \ter{)}}
+\end{Produc}%
+An \Index{assignment expression} executes a regular assignment,
+and results in the final value of its right hand expression.
+
 \subsubsection{Table Constructors} \label{tableconstructor}
 \subsubsection{Table Constructors} \label{tableconstructor}
 Table \Index{constructors} are expressions that create tables;
 Table \Index{constructors} are expressions that create tables;
 every time a constructor is evaluated, a new table is created.
 every time a constructor is evaluated, a new table is created.
@@ -1978,8 +1992,9 @@ field not present in a table or a field with value \nil.
 Therefore, the function only considers fields with non \nil\ values.
 Therefore, the function only considers fields with non \nil\ values.
 The order in which the indices are enumerated is not specified,
 The order in which the indices are enumerated is not specified,
 \emph{even for numeric indices}
 \emph{even for numeric indices}
-(to traverse a table in numeric order, use a counter).
-If the table is modified in any way during a traversal,
+(to traverse a table in numeric order,
+use a counter or function \verb|foreachi|).
+If the table indices are modified in any way during a traversal,
 the semantics of \verb|next| is undefined.
 the semantics of \verb|next| is undefined.
 
 
 This function cannot be written with the standard API.
 This function cannot be written with the standard API.
@@ -1992,7 +2007,7 @@ or \nil\ to get a first name.
 Similarly to \verb|next|, it returns the name of another variable
 Similarly to \verb|next|, it returns the name of another variable
 and its value,
 and its value,
 or \nil\ if there are no more variables.
 or \nil\ if there are no more variables.
-There can be no assignments to global variables during the traversal;
+There can be no creation of new global variables during the traversal;
 otherwise the semantics of \verb|nextvar| is undefined.
 otherwise the semantics of \verb|nextvar| is undefined.
 
 
 This function cannot be written with the standard API.
 This function cannot be written with the standard API.
@@ -2150,14 +2165,13 @@ value in the table.
 This function could be defined in Lua:
 This function could be defined in Lua:
 \begin{verbatim}
 \begin{verbatim}
       function getn (t)
       function getn (t)
-        if type(t.n) == 'number' then return floor(t.n) end
-        local i = next(t, nil)
+        if type(t.n) == 'number' then return t.n end
+        local i = nil
         local max = 0
         local max = 0
-        while i do
+        while (i=next(t, i)) do
           if type(i) == 'number' and i>max then max=i end
           if type(i) == 'number' and i>max then max=i end
-          i = next(t, i)
         end
         end
-        return floor(max)
+        return max
       end
       end
 \end{verbatim}
 \end{verbatim}
 
 
@@ -2198,11 +2212,10 @@ as the final value of \verb|foreachi|.
 This function could be defined in Lua:
 This function could be defined in Lua:
 \begin{verbatim}
 \begin{verbatim}
       function foreachi (t, f)
       function foreachi (t, f)
-        local i, n = 1, getn(t)
-        while i<=n do
+        local i, n = 0, getn(t)
+        while (i=i+1)<=n do
           local res = f(i, t[i])
           local res = f(i, t[i])
           if res then return res end
           if res then return res end
-          i = i+1
         end
         end
       end
       end
 \end{verbatim}
 \end{verbatim}
@@ -2227,50 +2240,80 @@ This function could be defined in Lua:
       end
       end
 \end{verbatim}
 \end{verbatim}
 
 
+\subsubsection*{\ff \T{tinsert (table [, pos] , value)}}\Deffunc{tinsert}
+
+Inserts element \verb|value| at table position \verb|pos|,
+shifting other elements to open space.
+The default value for \verb|pos| is \verb|n+1|
+(where \verb|n| is the result of \verb|getn(table)| \see{getn})
+so that a call \verb|tinsert(t,x)| inserts \verb|x| at the end
+of table \verb|t|.
+
+This function also sets or increments the field \verb|n| of the table,
+to \verb|n+1|.
+
+This function is equivalent to the following Lua function,
+except that the table accesses are all raw (that is, without tag methods):
+\begin{verbatim}
+      function tinsert (t, ...)
+        local pos, value
+        local n = getn(t)
+        if arg.n == 1 then
+          pos = n+1; value = arg[1]
+        else
+          pos = arg[1]; value = arg[2]
+        end
+        t.n = n+1; n=n+1
+        while (n=n-1)>=pos do
+          t[n+1] = t[n]
+        end
+        t[pos] = value
+      end
+\end{verbatim}
+
+\subsubsection*{\ff \T{tremove (table [, pos])}}\Deffunc{tremove}
+
+Removes from \verb|table| the element at position \verb|pos|,
+shifting other elements to close the space.
+Returns the value of the removed element.
+The default value for \verb|pos| is \verb|n|
+(where \verb|n| is the result of \verb|getn(table)| \see{getn}),
+so that a call \verb|tremove(t)| removes the last element
+of table \verb|t|.
+
+This function also sets or decrements the field \verb|n| of the table,
+to \verb|n-1|.
+
+This function is equivalent to the following Lua function,
+except that the table accesses are all raw (that is, without tag methods):
+\begin{verbatim}
+      function tremove (t, pos)
+        local n = getn(t)
+        pos = pos or n
+        local value = t[pos]
+        if n<=0 then return end
+        t.n = n-1
+        pos = pos-1
+        while (pos=pos+1)<n do
+          t[pos] = t[pos+1]
+        end
+        return value
+      end
+\end{verbatim}
+
 \subsubsection*{\ff \T{sort (table [, comp])}}\Deffunc{sort}
 \subsubsection*{\ff \T{sort (table [, comp])}}\Deffunc{sort}
-Sorts table elements in ascending order, \emph{in-place},
+Sorts table elements in a given order, \emph{in-place},
 from \verb|table[1]| to \verb|table[n]|,
 from \verb|table[1]| to \verb|table[n]|,
 where \verb|n| is the result of \verb|getn(table)| \see{getn}.
 where \verb|n| is the result of \verb|getn(table)| \see{getn}.
 If \verb|comp| is given,
 If \verb|comp| is given,
-it must be a function that compares two table elements,
+it must be a function that receives two table elements,
 and returns true when the first is less than the second
 and returns true when the first is less than the second
-(that is, \verb|not comp(a[i+1], a[i])| will be true after the sort).
+(so that \verb|not comp(a[i+1], a[i])| will be true after the sort).
 If \verb|comp| is not given,
 If \verb|comp| is not given,
 the standard \verb|<| Lua operator is used instead.
 the standard \verb|<| Lua operator is used instead.
 
 
 Function \verb|sort| returns the (sorted) table.
 Function \verb|sort| returns the (sorted) table.
 
 
-This function could be defined in Lua:
-\begin{verbatim}
-      function aux_qsort (a, l, u, leq)
-        if l < u then
-          local m = floor((l+u)/2)  -- choose middle element as pivot
-          a[l], a[m] = a[m], a[l]   -- swap pivot to first position
-          local t = a[l]   -- pivot value
-          m = l
-          local i = l+1
-          while i <= u do
-            -- invariant: a[l+1..m] < t <= a[m+1..i-1]
-            if leq(a[i], t) then
-              m = m+1
-              a[m], a[i] = a[i], a[m]   -- swap
-            end
-            i = i+1
-          end
-          a[l], a[m] = a[m], a[l]   -- swap pivot to a valid place
-          -- a[l+1..m-1] < a[m] <= a[m+1..u]
-          aux_qsort(a, l, m-1, leq)
-          aux_qsort(a, m+1, u, leq)
-        end
-        return a   -- return the table
-      end
-
-      function sort (a, f)
-        f = f or function (a,b) return a<b end
-        return aux_qsort(a, 1, getn(a), f)
-      end                         
-\end{verbatim}
-
 
 
 \subsection{String Manipulation}
 \subsection{String Manipulation}
 This library provides generic functions for string manipulation,
 This library provides generic functions for string manipulation,
@@ -2364,9 +2407,8 @@ The only differences are that the options/modifiers
 and \verb|h| are not supported,
 and \verb|h| are not supported,
 and there is an extra option, \verb|q|.
 and there is an extra option, \verb|q|.
 This option formats a string in a form suitable to be safely read
 This option formats a string in a form suitable to be safely read
-back by the Lua interpreter;
-that is,
-the string is written between double quotes,
+back by the Lua interpreter:
+The string is written between double quotes,
 and all double quotes, returns and backslashes in the string
 and all double quotes, returns and backslashes in the string
 are correctly escaped when written.
 are correctly escaped when written.
 For instance, the call
 For instance, the call
@@ -2393,7 +2435,7 @@ The options \verb|c|, \verb|d|, \verb|E|, \verb|e|, \verb|f|,
 \verb|g|, \verb|G|, \verb|i|, \verb|o|, \verb|u|, \verb|X|, and \verb|x| all
 \verb|g|, \verb|G|, \verb|i|, \verb|o|, \verb|u|, \verb|X|, and \verb|x| all
 expect a number as argument,
 expect a number as argument,
 whereas \verb|q| and \verb|s| expect a string.
 whereas \verb|q| and \verb|s| expect a string.
-Note that the \verb|*| modifier can be simulated by building
+The \verb|*| modifier can be simulated by building
 the appropriate format string.
 the appropriate format string.
 For example, \verb|"%*g"| can be simulated with
 For example, \verb|"%*g"| can be simulated with
 \verb|"%"..width.."g"|.
 \verb|"%"..width.."g"|.
@@ -2464,17 +2506,15 @@ The following combinations are allowed in describing a character class:
 --- represents the character \emph{x} itself.
 --- represents the character \emph{x} itself.
 \item[\T{.}] --- (a dot) represents all characters.
 \item[\T{.}] --- (a dot) represents all characters.
 \item[\T{\%a}] --- represents all letters.
 \item[\T{\%a}] --- represents all letters.
-\item[\T{\%A}] --- represents all non letter characters.
+\item[\T{\%c}] --- represents all control characters.
 \item[\T{\%d}] --- represents all digits.
 \item[\T{\%d}] --- represents all digits.
-\item[\T{\%D}] --- represents all non digits.
 \item[\T{\%l}] --- represents all lower case letters.
 \item[\T{\%l}] --- represents all lower case letters.
-\item[\T{\%L}] --- represents all non lower case letter characters.
+\item[\T{\%p}] --- represents all punctuation characters.
 \item[\T{\%s}] --- represents all space characters.
 \item[\T{\%s}] --- represents all space characters.
-\item[\T{\%S}] --- represents all non space characters.
 \item[\T{\%u}] --- represents all upper case letters.
 \item[\T{\%u}] --- represents all upper case letters.
-\item[\T{\%U}] --- represents all non upper case letter characters.
 \item[\T{\%w}] --- represents all alphanumeric characters.
 \item[\T{\%w}] --- represents all alphanumeric characters.
-\item[\T{\%W}] --- represents all non alphanumeric characters.
+\item[\T{\%x}] --- represents all hexa-decimal digits.
+\item[\T{\%z}] --- represents the character with representation 0.
 \item[\T{\%\M{x}}] (where \M{x} is any non alphanumeric character)  ---
 \item[\T{\%\M{x}}] (where \M{x} is any non alphanumeric character)  ---
 represents the character \M{x}.
 represents the character \M{x}.
 This is the standard way to escape the magic characters \verb|()%.[*-?|.
 This is the standard way to escape the magic characters \verb|()%.[*-?|.
@@ -2495,6 +2535,9 @@ E.g., assuming an \emph{ascii} character set,
 represents the complement of char-set,
 represents the complement of char-set,
 where char-set is interpreted as above.
 where char-set is interpreted as above.
 \end{description}
 \end{description}
+For all classes represented by single letters (\verb|%a|, \verb|%c|, \ldots),
+the correspondent upper-case letter represents the complement of the class.
+For instance, \verb|%S| represents all non-space characters.
 
 
 The definitions of letter, space, etc. depend on the current locale.
 The definitions of letter, space, etc. depend on the current locale.
 In particular, the class \verb|[a-z]| may not be equivalent to \verb|%l|.
 In particular, the class \verb|[a-z]| may not be equivalent to \verb|%l|.
@@ -2591,6 +2634,8 @@ The function \verb|random|, when called without arguments,
 returns a pseudo-random real number in the range \Math{[0,1)}.
 returns a pseudo-random real number in the range \Math{[0,1)}.
 When called with a number \Math{n},
 When called with a number \Math{n},
 \verb|random| returns a pseudo-random integer in the range \Math{[1,n]}.
 \verb|random| returns a pseudo-random integer in the range \Math{[1,n]}.
+When called with two arguments, \Math{l} and \Math{u},
+\verb|random| returns a pseudo-random integer in the range \Math{[l,u]}.
 
 
 
 
 \subsection{I/O Facilities} \label{libio}
 \subsection{I/O Facilities} \label{libio}
@@ -2891,10 +2936,18 @@ then \verb|linedefined| is \Math{-1}, and \verb|filename| is \verb|"(C)"|.
 The function \verb|lua_currentline| gives the current line where
 The function \verb|lua_currentline| gives the current line where
 a given function is executing.
 a given function is executing.
 It only works if the function has been compiled with debug
 It only works if the function has been compiled with debug
-information \see{pragma}.
+information.
 When no line information is available,
 When no line information is available,
 \verb|lua_currentline| returns \Math{-1}.
 \verb|lua_currentline| returns \Math{-1}.
 
 
+The generation of debug information is controled by an internal flag,
+which can be switched with
+\begin{verbatim}
+int lua_setdebug (int debug);
+\end{verbatim}
+This function sets the flag and returns its previous value.
+This flag can also be set from Lua~\see{pragma}.
+
 Function \verb|lua_getobjname| tries to find a reasonable name for
 Function \verb|lua_getobjname| tries to find a reasonable name for
 a given function.
 a given function.
 Because functions in Lua are first class values,
 Because functions in Lua are first class values,
@@ -2918,6 +2971,8 @@ The following functions allow the manipulation of the
 local variables of a given activation record.
 local variables of a given activation record.
 They only work if the function has been compiled with debug
 They only work if the function has been compiled with debug
 information \see{pragma}.
 information \see{pragma}.
+Moreover, for these functions, a local variable becomes
+visible in the line after its definition. 
 \begin{verbatim}
 \begin{verbatim}
 lua_Object lua_getlocal (lua_Function func, int local_number, char **name);
 lua_Object lua_getlocal (lua_Function func, int local_number, char **name);
 int lua_setlocal (lua_Function func, int local_number);
 int lua_setlocal (lua_Function func, int local_number);
@@ -2947,17 +3002,17 @@ then this function fails and returns 0.
 The Lua interpreter offers two hooks for debugging purposes:
 The Lua interpreter offers two hooks for debugging purposes:
 \begin{verbatim}
 \begin{verbatim}
 typedef void (*lua_CHFunction) (lua_Function func, char *file, int line);
 typedef void (*lua_CHFunction) (lua_Function func, char *file, int line);
-extern lua_CHFunction lua_callhook;
+lua_CHFunction lua_setcallhook (lua_CHFunction func);
 
 
 typedef void (*lua_LHFunction) (int line);
 typedef void (*lua_LHFunction) (int line);
-extern lua_LHFunction lua_linehook;
+lua_LHFunction lua_setlinehook (lua_LHFunction func);
 \end{verbatim}
 \end{verbatim}
 The first one is called whenever the interpreter enters or leaves a
 The first one is called whenever the interpreter enters or leaves a
 function.
 function.
 When entering a function,
 When entering a function,
 its parameters are a handle to the function activation record,
 its parameters are a handle to the function activation record,
-plus the file and the line where the function is defined (the same
-information which is provided by \verb|lua_funcinfo|);
+plus the file and the line where the function is defined
+(the same information which is provided by \verb|lua_funcinfo|);
 when leaving a function, \verb|func| is \verb|LUA_NOOBJECT|,
 when leaving a function, \verb|func| is \verb|LUA_NOOBJECT|,
 \verb|file| is \verb|"(return)"|, and \verb|line| is 0.
 \verb|file| is \verb|"(return)"|, and \verb|line| is 0.
 
 
@@ -2971,6 +3026,8 @@ has been compiled with debug information \see{pragma}.
 
 
 A hook is disabled when its value is \verb|NULL|,
 A hook is disabled when its value is \verb|NULL|,
 which is the initial value of both hooks.
 which is the initial value of both hooks.
+Both \verb|lua_setcallhook| and \verb|lua_setlinehook|
+set their corresponding hooks and return their previous values.
 
 
 
 
 
 
@@ -3040,6 +3097,18 @@ the previous public versions of Lua,
 some differences had to be introduced.
 some differences had to be introduced.
 Here is a list of all these incompatibilities.
 Here is a list of all these incompatibilities.
 
 
+\subsection*{Incompatibilities with \Index{version 3.1}}
+\begin{itemize}
+\item
+In the debug API, the old variables \verb|lua_debug|,
+\verb|lua_callhook| and \verb|lua_linehook| now live inside \verb|lua_state|.
+Therefore, they are no more directly accessible, and must be
+manipulated through the new functions \verb|lua_setdebug|,
+\verb|lua_setcallhook| and \verb|lua_setlinehook|.
+
+\item Old pre-compiled code is obsolete, and must be re-compiled.
+\end{itemize}
+
 \subsection*{Incompatibilities with \Index{version 3.0}}
 \subsection*{Incompatibilities with \Index{version 3.0}}
 \begin{itemize}
 \begin{itemize}