mirror of
https://github.com/lua/lua.git
synced 2025-01-28 06:03:00 +08:00
new examples showing data structures and object-oriented programming.
generic improvements and corrections.
This commit is contained in:
parent
1431b52e76
commit
15057aa0a4
183
manual.tex
183
manual.tex
@ -1,4 +1,4 @@
|
|||||||
% $Id: manual.tex,v 1.3 1996/01/30 12:55:10 roberto Exp roberto $
|
% $Id: manual.tex,v 1.4 1996/01/30 15:24:49 roberto Exp roberto $
|
||||||
|
|
||||||
\documentstyle[A4,11pt,bnf]{article}
|
\documentstyle[A4,11pt,bnf]{article}
|
||||||
|
|
||||||
@ -32,7 +32,7 @@ Waldemar Celes Filho
|
|||||||
Departamento de Inform\'atica --- PUC-Rio
|
Departamento de Inform\'atica --- PUC-Rio
|
||||||
}
|
}
|
||||||
|
|
||||||
\date{\small \verb$Date: 1996/01/30 12:55:10 $}
|
\date{\small \verb$Date: 1996/01/30 15:24:49 $}
|
||||||
|
|
||||||
\maketitle
|
\maketitle
|
||||||
|
|
||||||
@ -70,9 +70,9 @@ general procedural programming features with data description
|
|||||||
facilities.
|
facilities.
|
||||||
It is supposed to be used as a configuration language for any
|
It is supposed to be used as a configuration language for any
|
||||||
program that needs one.
|
program that needs one.
|
||||||
Its main extensions are related to object-oriented facilities,
|
%Its main extensions are related to object-oriented facilities,
|
||||||
and fallbacks,
|
%and fallbacks,
|
||||||
but it has some other minor contributions.
|
%but it has some other minor contributions.
|
||||||
Lua has been designed and implemented by
|
Lua has been designed and implemented by
|
||||||
W.~Celes~F., L.~H.~de Figueiredo and R.~Ierusalimschy.
|
W.~Celes~F., L.~H.~de Figueiredo and R.~Ierusalimschy.
|
||||||
|
|
||||||
@ -231,7 +231,7 @@ double hyphen (\verb'--') and run until the end of the line.
|
|||||||
and an optional decimal exponent.
|
and an optional decimal exponent.
|
||||||
Examples of valid numerical constants are:
|
Examples of valid numerical constants are:
|
||||||
\begin{verbatim}
|
\begin{verbatim}
|
||||||
4 4. .4 4.57e-3 .3e12
|
4 4.0 0.4 4.57e-3 0.3e12
|
||||||
\end{verbatim}
|
\end{verbatim}
|
||||||
|
|
||||||
|
|
||||||
@ -344,17 +344,14 @@ the syntax for a \Index{return statement} is:
|
|||||||
\produc{ret}{\rwd{return} explist}
|
\produc{ret}{\rwd{return} explist}
|
||||||
\end{Produc}
|
\end{Produc}
|
||||||
|
|
||||||
\subsubsection{Expressions as Statements} \label{statexp}
|
\subsubsection{Function Calls as Statements} \label{funcstat}
|
||||||
All expressions with possible side-effects can be
|
Because of possible side-effects,
|
||||||
executed as statements.
|
function calls can be executed as statements.
|
||||||
These include function calls and table constructors:
|
|
||||||
\begin{Produc}
|
\begin{Produc}
|
||||||
\produc{stat}{functioncall}
|
\produc{stat}{functioncall}
|
||||||
\produc{stat}{tableconstructor}
|
|
||||||
\end{Produc}%
|
\end{Produc}%
|
||||||
Eventual returned values are thrown away.
|
Eventual returned values are thrown away.
|
||||||
Function calls are explained in Section \ref{functioncall};
|
Function calls are explained in Section \ref{functioncall}.
|
||||||
constructors are the subject of Section \ref{tableconstructor}.
|
|
||||||
|
|
||||||
\subsubsection{Local Declarations} \label{localvar}
|
\subsubsection{Local Declarations} \label{localvar}
|
||||||
\Index{Local variables} can be declared anywhere inside a block.
|
\Index{Local variables} can be declared anywhere inside a block.
|
||||||
@ -405,7 +402,8 @@ Lua offers the following \Index{relational operators}:
|
|||||||
\begin{verbatim}
|
\begin{verbatim}
|
||||||
< > <= >= ~= ==
|
< > <= >= ~= ==
|
||||||
\end{verbatim}
|
\end{verbatim}
|
||||||
All return \nil\ as false and 1 as true.
|
All return \nil\ as false and a value different from \nil\
|
||||||
|
(actually the number 1) as true.
|
||||||
|
|
||||||
Equality first compares the types of its operands.
|
Equality first compares the types of its operands.
|
||||||
If they are different, the result is \nil.
|
If they are different, the result is \nil.
|
||||||
@ -546,7 +544,7 @@ the parameter list is a single new table.
|
|||||||
Because a function can return any number of results
|
Because a function can return any number of results
|
||||||
(\see{return}),
|
(\see{return}),
|
||||||
the number of results must be adjusted before used.
|
the number of results must be adjusted before used.
|
||||||
If the function is called as an statement (\see{statexp}),
|
If the function is called as a statement (\see{funcstat}),
|
||||||
its return list is adjusted to 0.
|
its return list is adjusted to 0.
|
||||||
If the function is called in a place that needs a single value
|
If the function is called in a place that needs a single value
|
||||||
(syntactically denoted by the non-terminal \verb'exp1'),
|
(syntactically denoted by the non-terminal \verb'exp1'),
|
||||||
@ -601,7 +599,7 @@ end
|
|||||||
\end{verbatim}
|
\end{verbatim}
|
||||||
that is, the function gets an extra formal parameter called \verb'self'.
|
that is, the function gets an extra formal parameter called \verb'self'.
|
||||||
Notice that
|
Notice that
|
||||||
the variable \verb'v' must be previously initialized with a table value.
|
the variable \verb'v' must have been previously initialized with a table value.
|
||||||
|
|
||||||
|
|
||||||
\subsection{Fallbacks} \label{fallback}
|
\subsection{Fallbacks} \label{fallback}
|
||||||
@ -704,18 +702,17 @@ and then the corresponding function from the library
|
|||||||
is terminated returning an error condition.
|
is terminated returning an error condition.
|
||||||
|
|
||||||
The only argument to the error fallback function is a string describing
|
The only argument to the error fallback function is a string describing
|
||||||
the error and some extra informations,
|
the error.
|
||||||
like current line (when the error is at compilation)
|
The standard I/O library redefines this fallback,
|
||||||
or current function (when the error is at execution).
|
using the debug API, in order to print some extra informations,
|
||||||
|
like the stack of calls.
|
||||||
For more information about an error,
|
For more information about an error,
|
||||||
the Lua program can include the compilation pragma \verb'$debug'.
|
the Lua program can include the compilation pragma \verb'$debug'.
|
||||||
\index{debug pragma}
|
\index{debug pragma}
|
||||||
This pragma must be written in a line by itself.
|
This pragma must be written in a line by itself.
|
||||||
When an error occurs in a program compiled with this option,
|
When an error occurs in a program compiled with this option,
|
||||||
the error message includes extra information showing the stack of calls.
|
the error routine is able to print also the lines where the calls
|
||||||
|
(and the error) were made.
|
||||||
The standard error routine only prints the error message
|
|
||||||
to \verb'stderr'.
|
|
||||||
If needed, it is possible to change the error fallback routine;
|
If needed, it is possible to change the error fallback routine;
|
||||||
\see{fallback}.
|
\see{fallback}.
|
||||||
|
|
||||||
@ -758,6 +755,9 @@ Because Lua has no static type system,
|
|||||||
all values passed between Lua and C have type
|
all values passed between Lua and C have type
|
||||||
\verb'lua_Object'\Deffunc{lua_Object},
|
\verb'lua_Object'\Deffunc{lua_Object},
|
||||||
which works like an abstract type in C that can hold any Lua value.
|
which works like an abstract type in C that can hold any Lua value.
|
||||||
|
Values of type \verb'lua_Object' have no meaning outside Lua;
|
||||||
|
for instance,
|
||||||
|
the comparisson of two \verb"lua_Object's" is of no significance.
|
||||||
|
|
||||||
Lua has automatic memory management, and garbage collection.
|
Lua has automatic memory management, and garbage collection.
|
||||||
Because of that, a \verb'lua_Object' has a limited scope,
|
Because of that, a \verb'lua_Object' has a limited scope,
|
||||||
@ -856,7 +856,7 @@ and leave the result on the top of the Lua stack,
|
|||||||
where it can be assigned to a Lua variable,
|
where it can be assigned to a Lua variable,
|
||||||
passed as paramenter to a Lua function, etc (see below). \label{pushing}
|
passed as paramenter to a Lua function, etc (see below). \label{pushing}
|
||||||
\verb'lua_pushliteral' is like \verb'lua_pushstring',
|
\verb'lua_pushliteral' is like \verb'lua_pushstring',
|
||||||
but also puts the string in the Lua literal table.
|
but also puts the string in the Lua literal table and merges duplications.
|
||||||
This avoids the string to be garbage collected,
|
This avoids the string to be garbage collected,
|
||||||
and therefore has a better overall performance.
|
and therefore has a better overall performance.
|
||||||
As a rule, when the string to be pushed is a literal,
|
As a rule, when the string to be pushed is a literal,
|
||||||
@ -885,6 +885,9 @@ one can use the function:
|
|||||||
\begin{verbatim}
|
\begin{verbatim}
|
||||||
lua_Object lua_getglobal (char *varname);
|
lua_Object lua_getglobal (char *varname);
|
||||||
\end{verbatim}
|
\end{verbatim}
|
||||||
|
As in Lua, if the value of the global is \nil,
|
||||||
|
the \verb'"getglobal"' fallback is called.
|
||||||
|
|
||||||
To store a value previously pushed onto the stack in a global variable,
|
To store a value previously pushed onto the stack in a global variable,
|
||||||
there is the function:
|
there is the function:
|
||||||
\Deffunc{lua_storeglobal}
|
\Deffunc{lua_storeglobal}
|
||||||
@ -904,15 +907,15 @@ As in Lua, if the first object is not a table,
|
|||||||
or the index is not present in the table,
|
or the index is not present in the table,
|
||||||
the correspondent fallback is called.
|
the correspondent fallback is called.
|
||||||
|
|
||||||
For compatibility with previous versions of the API,
|
%For compatibility with previous versions of the API,
|
||||||
the following macros are supported:
|
%the following macros are supported:
|
||||||
\Deffunc{lua_getindexed}\Deffunc{lua_getfield}
|
%\Deffunc{lua_getindexed}\Deffunc{lua_getfield}
|
||||||
\begin{verbatim}
|
%\begin{verbatim}
|
||||||
lua_Object lua_getindexed (lua_Object table, float index);
|
%lua_Object lua_getindexed (lua_Object table, float index);
|
||||||
lua_Object lua_getfield (lua_Object table, char *field);
|
%lua_Object lua_getfield (lua_Object table, char *field);
|
||||||
\end{verbatim}
|
%\end{verbatim}
|
||||||
The first one is used for numeric indices,
|
%The first one is used for numeric indices,
|
||||||
while the second can be used for any string index.
|
%while the second can be used for any string index.
|
||||||
|
|
||||||
To store a value in an index,
|
To store a value in an index,
|
||||||
the program must push onto the stack the table, the index,
|
the program must push onto the stack the table, the index,
|
||||||
@ -1009,7 +1012,7 @@ The first parameter is the fallback name,
|
|||||||
and the second a CFunction to be used as the new fallback.
|
and the second a CFunction to be used as the new fallback.
|
||||||
This function returns a \verb'lua_Object',
|
This function returns a \verb'lua_Object',
|
||||||
which is the old fallback value,
|
which is the old fallback value,
|
||||||
or nil on fail (invalid fallback name).
|
or \nil\ on fail (invalid fallback name).
|
||||||
This old value can be used for chaining fallbacks.
|
This old value can be used for chaining fallbacks.
|
||||||
|
|
||||||
An example of C code calling a Lua function is shown in
|
An example of C code calling a Lua function is shown in
|
||||||
@ -1331,8 +1334,8 @@ then a \Index{piped input} is open, via function \IndexVerb{popen}.
|
|||||||
|
|
||||||
This function opens a file named \verb'filename' and sets it as the
|
This function opens a file named \verb'filename' and sets it as the
|
||||||
{\em current} output file.
|
{\em current} output file.
|
||||||
Notice that, if the file already exists, it is completely erased with this
|
Notice that, if the file already exists,
|
||||||
operation.
|
it will be {\em completely erased} with this operation.
|
||||||
When called without parameters,
|
When called without parameters,
|
||||||
this function closes the current output file,
|
this function closes the current output file,
|
||||||
and restores \verb'stdout' as the current output file.
|
and restores \verb'stdout' as the current output file.
|
||||||
@ -1382,7 +1385,7 @@ Particularly, the format \verb'"s1"' reads a single character.
|
|||||||
\subsubsection*{{\tt readuntil (char)}}\Deffunc{readuntil}
|
\subsubsection*{{\tt readuntil (char)}}\Deffunc{readuntil}
|
||||||
|
|
||||||
Reads the current input until the first ocurrence of the given character.
|
Reads the current input until the first ocurrence of the given character.
|
||||||
When called with no parameters or with nil,
|
When called with no parameters,
|
||||||
reads until the end of the current input file.
|
reads until the end of the current input file.
|
||||||
Returns the string read.
|
Returns the string read.
|
||||||
The character itself is not read.
|
The character itself is not read.
|
||||||
@ -1453,6 +1456,49 @@ It does not intend to cover the whole language,
|
|||||||
but only to illustrate some interesting uses of the system.
|
but only to illustrate some interesting uses of the system.
|
||||||
|
|
||||||
|
|
||||||
|
\subsection{\Index{Data Structures}}
|
||||||
|
Tables are a strong unifying data constructor.
|
||||||
|
They directly implement a multitude of data types,
|
||||||
|
like ordinary arrays, records, sets, bags, and lists.
|
||||||
|
|
||||||
|
Arrays need no explanations.
|
||||||
|
In Lua, it is conventional to start indices from 1,
|
||||||
|
but this is only a convention.
|
||||||
|
Arrays can be indexed by 0, negative numbers, or any other value (but \nil).
|
||||||
|
Records are also trivially implemented by the syntactic sugar
|
||||||
|
\verb'a.x'.
|
||||||
|
|
||||||
|
The best way to implement a set is to use the indices of a table.
|
||||||
|
The statement \verb's = {}' creates an empty set \verb's'.
|
||||||
|
The statement \verb's[x] = 1' inserts the value of \verb'x' into
|
||||||
|
the set \verb's'.
|
||||||
|
The expression \verb's[x]' is true if and only if
|
||||||
|
\verb'x' belongs to \verb's'.
|
||||||
|
Finally, the statement \verb's[x] = nil' erases \verb'x' from \verb's'.
|
||||||
|
|
||||||
|
Bags can be implemented similarly to sets,
|
||||||
|
but using the value associated to an element as its counter.
|
||||||
|
So, to insert an element,
|
||||||
|
the following code is enough:
|
||||||
|
\begin{verbatim}
|
||||||
|
if s[x] then s[x] = s[x]+1
|
||||||
|
else s[x] = 1 end
|
||||||
|
\end{verbatim}
|
||||||
|
and to remove an element:
|
||||||
|
\begin{verbatim}
|
||||||
|
if s[x] then s[x] = s[x]-1 end
|
||||||
|
if s[x] == 0 then s[x] = nil end
|
||||||
|
\end{verbatim}
|
||||||
|
|
||||||
|
Lisp-like lists also have an easy implementation.
|
||||||
|
The ``cons'' of two elements \verb'x' and \verb'y' can be
|
||||||
|
created with the code \verb'l = {car=x, cdr=y}'.
|
||||||
|
The expression \verb'l.car' extracts the header,
|
||||||
|
while \verb'l.cdr' extracts the tail.
|
||||||
|
An alternative way is to create the list directly with \verb'l={x,y}',
|
||||||
|
and then to extract the header with \verb'l[1]' and
|
||||||
|
the tail with \verb'l[2]'.
|
||||||
|
|
||||||
\subsection{The Functions {\tt next} and {\tt nextvar}} \label{exnext}
|
\subsection{The Functions {\tt next} and {\tt nextvar}} \label{exnext}
|
||||||
\Deffunc{next}\Deffunc{nextvar}
|
\Deffunc{next}\Deffunc{nextvar}
|
||||||
This example shows how to use the function \verb'next' to iterate
|
This example shows how to use the function \verb'next' to iterate
|
||||||
@ -1654,6 +1700,64 @@ This code must be registered with:
|
|||||||
Notice how the string \verb'"parent"' is kept
|
Notice how the string \verb'"parent"' is kept
|
||||||
locked in Lua for optimal performance.
|
locked in Lua for optimal performance.
|
||||||
|
|
||||||
|
\subsection{\Index{Programming with Classes}}
|
||||||
|
There are many different ways to do object-oriented programming in Lua.
|
||||||
|
This section presents one possible way to
|
||||||
|
implement classes,
|
||||||
|
using the inheritance mechanism presented above.
|
||||||
|
|
||||||
|
As one could expect, a good way to represent a class is
|
||||||
|
as a table.
|
||||||
|
This table will contain all instance methods of the class,
|
||||||
|
plus eventual default values for instance variables.
|
||||||
|
An instance of a class has its \verb'parent' field pointing to
|
||||||
|
the class,
|
||||||
|
and so it ``inherits'' all methods.
|
||||||
|
|
||||||
|
For instance, a class \verb'Point' can be described as in
|
||||||
|
Figure~\ref{Point}.
|
||||||
|
Function \verb'create' helps the creation of new points,
|
||||||
|
adding the parent field.
|
||||||
|
Function \verb'move' is an example of an instance method.
|
||||||
|
\begin{figure}
|
||||||
|
\Line
|
||||||
|
\begin{verbatim}
|
||||||
|
Point = {x = 0, y = 0}
|
||||||
|
|
||||||
|
function Point:create (o)
|
||||||
|
o.parent = self
|
||||||
|
return o
|
||||||
|
end
|
||||||
|
|
||||||
|
function Point:move (p)
|
||||||
|
self.x = self.x + p.x
|
||||||
|
self.y = self.y + p.y
|
||||||
|
end
|
||||||
|
|
||||||
|
...
|
||||||
|
|
||||||
|
--
|
||||||
|
-- creating points
|
||||||
|
--
|
||||||
|
p1 = Point:create{x = 10, y = 20}
|
||||||
|
p2 = Point:create{x = 10} -- y will be inherited until it is set
|
||||||
|
|
||||||
|
--
|
||||||
|
-- example of a method invocation
|
||||||
|
--
|
||||||
|
p1:move(p2)
|
||||||
|
\end{verbatim}
|
||||||
|
\caption{A Class Point.\label{Point}}
|
||||||
|
\Line
|
||||||
|
\end{figure}
|
||||||
|
Finally, a subclass can be created as a new table,
|
||||||
|
with the \verb'parent' field pointing to its superclass.
|
||||||
|
It is interesting to notice how the use of \verb'self' in
|
||||||
|
method \verb'create' allows this method to work properly even
|
||||||
|
when inherited by a subclass.
|
||||||
|
As usual, a subclass may overwrite any inherited method with
|
||||||
|
its own version.
|
||||||
|
|
||||||
\subsection{\Index{Modules}}
|
\subsection{\Index{Modules}}
|
||||||
Here we explain one possible way to simulate modules in Lua.
|
Here we explain one possible way to simulate modules in Lua.
|
||||||
The main idea is to use a table to store the module functions.
|
The main idea is to use a table to store the module functions.
|
||||||
@ -1673,7 +1777,10 @@ end
|
|||||||
Any code that needs this module has only to execute
|
Any code that needs this module has only to execute
|
||||||
\verb'dofile("filename")', where \verb'filename' is the file
|
\verb'dofile("filename")', where \verb'filename' is the file
|
||||||
where the module is written.
|
where the module is written.
|
||||||
After this, any function can be called with \verb'modulename.foo(...)'.
|
After this, any function can be called with
|
||||||
|
\begin{verbatim}
|
||||||
|
modulename.foo(...)
|
||||||
|
\end{verbatim}
|
||||||
|
|
||||||
If a module function is going to be used many times,
|
If a module function is going to be used many times,
|
||||||
the program can give a local name to it.
|
the program can give a local name to it.
|
||||||
|
Loading…
x
Reference in New Issue
Block a user