commit 8fdd06ba3c92c7ca7fbf25748bfa32635e4c003a
parent 028ec00ab947e06b99c64dbd721205f1f714e5b8
Author: Roberto Ierusalimschy <roberto@inf.puc-rio.br>
Date: Fri, 5 Feb 1999 10:14:45 -0200
lots of new stuff from 3.2
Diffstat:
M | manual.tex | | | 207 | +++++++++++++++++++++++++++++++++++++++++++++++++++++--------------------------- |
1 file changed, 138 insertions(+), 69 deletions(-)
diff --git a/manual.tex b/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}
\usepackage{fullpage,bnf}
@@ -41,7 +41,7 @@ Waldemar Celes
\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
@@ -410,11 +410,7 @@ Lua provides some automatic conversions between values at run time.
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 \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,
use the \verb|format| function \see{format}.
@@ -523,9 +519,9 @@ only \nil\ is considered false.
\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}
+\rwd{if} exp1 \rwd{then} block
+ \rep{\rwd{elseif} exp1 \rwd{then} block}
\opt{\rwd{else} block} \rwd{end}}
-\produc{elseif}{\rwd{elseif} exp1 \rwd{then} block}
\end{Produc}
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),
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}
Table \Index{constructors} are expressions that create tables;
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.
The order in which the indices are enumerated is not specified,
\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.
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
and its value,
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.
This function cannot be written with the standard API.
@@ -2150,14 +2165,13 @@ value in the table.
This function could be defined in Lua:
\begin{verbatim}
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
- while i do
+ while (i=next(t, i)) do
if type(i) == 'number' and i>max then max=i end
- i = next(t, i)
end
- return floor(max)
+ return max
end
\end{verbatim}
@@ -2198,11 +2212,10 @@ as the final value of \verb|foreachi|.
This function could be defined in Lua:
\begin{verbatim}
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])
if res then return res end
- i = i+1
end
end
\end{verbatim}
@@ -2227,50 +2240,80 @@ This function could be defined in Lua:
end
\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}
-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]|,
where \verb|n| is the result of \verb|getn(table)| \see{getn}.
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
-(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,
the standard \verb|<| Lua operator is used instead.
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}
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 there is an extra option, \verb|q|.
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
are correctly escaped when written.
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
expect a number as argument,
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.
For example, \verb|"%*g"| can be simulated with
\verb|"%"..width.."g"|.
@@ -2464,17 +2506,15 @@ The following combinations are allowed in describing a character class:
--- represents the character \emph{x} itself.
\item[\T{.}] --- (a dot) represents all characters.
\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 non digits.
\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 non space characters.
\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 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) ---
represents the character \M{x}.
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,
where char-set is interpreted as above.
\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.
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)}.
When called with a number \Math{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}
@@ -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
a given function is executing.
It only works if the function has been compiled with debug
-information \see{pragma}.
+information.
When no line information is available,
\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
a given function.
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.
They only work if the function has been compiled with debug
information \see{pragma}.
+Moreover, for these functions, a local variable becomes
+visible in the line after its definition.
\begin{verbatim}
lua_Object lua_getlocal (lua_Function func, int local_number, char **name);
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:
\begin{verbatim}
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);
-extern lua_LHFunction lua_linehook;
+lua_LHFunction lua_setlinehook (lua_LHFunction func);
\end{verbatim}
The first one is called whenever the interpreter enters or leaves a
function.
When entering a function,
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|,
\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|,
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.
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}}
\begin{itemize}