new example showing how to build modules.

This commit is contained in:
Roberto Ierusalimschy 1996-01-30 13:24:49 -02:00
parent b1c02c7f00
commit abfebf1e21
1 changed files with 50 additions and 5 deletions

View File

@ -1,4 +1,4 @@
% $Id: manual.tex,v 1.2 1996/01/29 17:08:23 roberto Exp roberto $
% $Id: manual.tex,v 1.3 1996/01/30 12:55:10 roberto Exp roberto $
\documentstyle[A4,11pt,bnf]{article}
@ -32,7 +32,7 @@ Waldemar Celes Filho
Departamento de Inform\'atica --- PUC-Rio
}
\date{\small \verb$Date: 1996/01/29 17:08:23 $}
\date{\small \verb$Date: 1996/01/30 12:55:10 $}
\maketitle
@ -100,7 +100,7 @@ or by WWW (World Wide Web) from
\end{verbatim}
\section{Environment and Modules}
\section{Environment and Chunks}
All statements in Lua are executed in a \Def{global environment}.
This environment, which keeps all global variables and functions,
@ -558,7 +558,7 @@ no adjustment is done.
\subsection{\Index{Function Definitions}}
Functions in Lua can be defined anywhere in the global level of a module.
Functions in Lua can be defined anywhere in the global level of a chunk.
The syntax for function definition is:
\begin{Produc}
\produc{function}{\rwd{function} var \ter{(} \opt{parlist1} \ter{)}
@ -1460,7 +1460,7 @@ over the fields of a table.
Function \Def{clone} receives any table and returns a clone of it.
\begin{verbatim}
function clone (t) -- t is a table
local new_t = {} -- creates a new table
local new_t = {} -- create a new table
local i, v = next(t, nil) -- i is an index of t, v = t[i]
while i do
new_t[i] = v
@ -1654,6 +1654,51 @@ This code must be registered with:
Notice how the string \verb'"parent"' is kept
locked in Lua for optimal performance.
\subsection{\Index{Modules}}
Here we explain one possible way to simulate modules in Lua.
The main idea is to use a table to store the module functions.
A module should be written as a separate chunk, starting with:
\begin{verbatim}
if modulename then return end -- avoid loading twice the same module
modulename = {} -- create a table to represent the module
\end{verbatim}
After that, functions can be directly defined with the syntax
\begin{verbatim}
function modulename.foo (...)
...
end
\end{verbatim}
Any code that needs this module has only to execute
\verb'dofile("filename")', where \verb'filename' is the file
where the module is written.
After this, any function can be called with \verb'modulename.foo(...)'.
If a module function is going to be used many times,
the program can give a local name to it.
Because functions are values, it is enough to write
\begin{verbatim}
localname = modulename.foo
\end{verbatim}
Finally, a module may be {\em opened},
giving direct access to all its functions,
as shown in the code in Figure~\ref{openmod}.
\begin{figure}
\Line
\begin{verbatim}
function open (mod)
local n, f = next(mod, nil)
while n do
setglobal(n, f)
n, f = next(mod, n)
end
end
\end{verbatim}
\caption{Opening a module.\label{openmod}}
\Line
\end{figure}
\subsection{A CFunction} \label{exCFunction}\index{functions in C}
A CFunction to compute the maximum of a variable number of arguments
is shown in Figure~\ref{Cmax}.