mirror of https://github.com/odrling/Aegisub
4613 lines
171 KiB
HTML
4613 lines
171 KiB
HTML
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2//EN">
|
|
<html>
|
|
|
|
<head>
|
|
<TITLE>Lua: 5.0 reference manual</TITLE>
|
|
</head>
|
|
|
|
<body BGCOLOR="#FFFFFF">
|
|
|
|
<hr>
|
|
<h1>
|
|
<A HREF="http://www.lua.org/home.html"><IMG SRC="logo.gif" ALT="Lua" BORDER=0></A>
|
|
Lua 5.0 Reference Manual
|
|
</h1>
|
|
|
|
by Roberto Ierusalimschy, Luiz Henrique de Figueiredo, Waldemar Celes
|
|
<p>
|
|
<small>
|
|
<a HREF="http://www.lua.org/copyright.html">Copyright</a>
|
|
© 2003 Tecgraf, PUC-Rio. All rights reserved.
|
|
</small>
|
|
<hr>
|
|
|
|
<p>
|
|
<p>
|
|
<!-- ====================================================================== -->
|
|
|
|
|
|
|
|
<a name="1"><h1>1 - Introduction</h1></a>
|
|
|
|
<p>Lua is an extension programming language designed to support
|
|
general procedural programming with data description
|
|
facilities.
|
|
It also offers good support for object-oriented programming,
|
|
functional programming, and data-driven programming.
|
|
Lua is intended to be used as a powerful, light-weight
|
|
configuration language for any program that needs one.
|
|
Lua is implemented as a library, written in <em>clean</em> C
|
|
(that is, in the common subset of ANSI C and C++).
|
|
|
|
<p>Being an extension language, Lua has no notion of a "main" program:
|
|
it only works <em>embedded</em> in a host client,
|
|
called the <em>embedding program</em> or simply the <em>host</em>.
|
|
This host program can invoke functions to execute a piece of Lua code,
|
|
can write and read Lua variables,
|
|
and can register C functions to be called by Lua code.
|
|
Through the use of C functions, Lua can be augmented to cope with
|
|
a wide range of different domains,
|
|
thus creating customized programming languages sharing a syntactical framework.
|
|
|
|
<p>The Lua distribution includes a stand-alone embedding program,
|
|
<code>lua</code>, that uses the Lua library to offer a complete Lua interpreter.
|
|
|
|
<p>Lua is free software,
|
|
and is provided as usual with no guarantees,
|
|
as stated in its copyright notice.
|
|
The implementation described in this manual is available
|
|
at Lua's official web site, <code>www.lua.org</code>.
|
|
|
|
<p>Like any other reference manual,
|
|
this document is dry in places.
|
|
For a discussion of the decisions behind the design of Lua,
|
|
see the papers below,
|
|
which are available at Lua's web site.
|
|
<ul>
|
|
<li>
|
|
R. Ierusalimschy, L. H. de Figueiredo, and W. Celes.
|
|
Lua---an extensible extension language.
|
|
<em>Software: Practice & Experience</em> <b>26</b> #6 (1996) 635-652.
|
|
<li>
|
|
L. H. de Figueiredo, R. Ierusalimschy, and W. Celes.
|
|
The design and implementation of a language for extending applications.
|
|
<em>Proceedings of XXI Brazilian Seminar on Software and Hardware</em> (1994) 273-283.
|
|
<li>
|
|
L. H. de Figueiredo, R. Ierusalimschy, and W. Celes.
|
|
Lua: an extensible embedded language.
|
|
<em>Dr. Dobb's Journal</em> <b>21</b> #12 (Dec 1996) 26-33.
|
|
<li>
|
|
R. Ierusalimschy, L. H. de Figueiredo, and W. Celes.
|
|
The evolution of an extension language: a history of Lua,
|
|
<em>Proceedings of V Brazilian Symposium on Programming Languages</em> (2001) B-14-B-28.
|
|
</ul>
|
|
|
|
<p>Lua means "moon" in Portuguese and is pronounced LOO-ah.
|
|
|
|
<p>
|
|
<a name="language"><a name="2"><h1>2 - The Language</h1></a></a>
|
|
|
|
<p>This section describes the lexis, the syntax, and the semantics of Lua.
|
|
In other words,
|
|
this section describes
|
|
which tokens are valid,
|
|
how they can be combined,
|
|
and what their combinations mean.
|
|
|
|
<p>The language constructs will be explained using the usual extended BNF,
|
|
in which
|
|
{<em>a</em>} means 0 or more <em>a</em>'s, and
|
|
[<em>a</em>] means an optional <em>a</em>.
|
|
Non-terminals are shown in <em>italics</em>,
|
|
keywords are shown in <b>bold</b>,
|
|
and other terminal symbols are shown in <code>typewriter</code> font,
|
|
enclosed in single quotes.
|
|
|
|
<p><a name="lexical"><a name="2.1"><h2>2.1 - Lexical Conventions</h2></a></a>
|
|
|
|
<p><em>Identifiers</em> in Lua can be any string of letters,
|
|
digits, and underscores,
|
|
not beginning with a digit.
|
|
This coincides with the definition of identifiers in most languages.
|
|
(The definition of letter depends on the current locale:
|
|
any character considered alphabetic by the current locale
|
|
can be used in an identifier.)
|
|
|
|
<p>The following <em>keywords</em> are reserved
|
|
and cannot be used as identifiers:
|
|
|
|
<PRE>
|
|
and break do else elseif
|
|
end false for function if
|
|
in local nil not or
|
|
repeat return then true until while
|
|
</PRE>
|
|
|
|
<p>Lua is a case-sensitive language:
|
|
<code>and</code> is a reserved word, but <code>And</code> and <code>AND</code>
|
|
are two different, valid identifiers.
|
|
As a convention, identifiers starting with an underscore followed by
|
|
uppercase letters (such as <code>_VERSION</code>)
|
|
are reserved for internal variables used by Lua.
|
|
|
|
<p>The following strings denote other tokens:
|
|
<PRE>
|
|
+ - * / ^ =
|
|
~= <= >= < > ==
|
|
( ) { } [ ]
|
|
; : , . .. ...
|
|
</PRE>
|
|
|
|
<p><em>Literal strings</em>
|
|
can be delimited by matching single or double quotes,
|
|
and can contain the following C-like escape sequences:
|
|
<ul>
|
|
<li><b><code>\a</code></b> --- bell
|
|
<li><b><code>\b</code></b> --- backspace
|
|
<li><b><code>\f</code></b> --- form feed
|
|
<li><b><code>\n</code></b> --- newline
|
|
<li><b><code>\r</code></b> --- carriage return
|
|
<li><b><code>\t</code></b> --- horizontal tab
|
|
<li><b><code>\v</code></b> --- vertical tab
|
|
<li><b><code>\\</code></b> --- backslash
|
|
<li><b><code>\"</code></b> --- quotation mark
|
|
<li><b><code>\'</code></b> --- apostrophe
|
|
<li><b><code>\[</code></b> --- left square bracket
|
|
<li><b><code>\]</code></b> --- right square bracket
|
|
</ul>
|
|
Moreover, a `<code>\</code><em>newline</em>´
|
|
(that is, a backslash followed by a real newline)
|
|
results in a newline in the string.
|
|
A character in a string may also be specified by its numerical value
|
|
using the escape sequence `<code>\</code><em>ddd</em>´,
|
|
where <em>ddd</em> is a sequence of up to three decimal digits.
|
|
Strings in Lua may contain any 8-bit value, including embedded zeros,
|
|
which can be specified as `<code>\0</code>´.
|
|
|
|
<p>Literal strings can also be delimited by matching double square brackets
|
|
<code>[[</code> · · · <code>]]</code>.
|
|
Literals in this bracketed form may run for several lines,
|
|
may contain nested <code>[[</code> · · · <code>]]</code> pairs,
|
|
and do not interpret any escape sequences.
|
|
For convenience,
|
|
when the opening `<code>[[</code>´ is immediately followed by a newline,
|
|
the newline is not included in the string.
|
|
As an example, in a system using ASCII
|
|
(in which `<code>a</code>´ is coded as 97,
|
|
newline is coded as 10, and `<code>1</code>´ is coded as 49),
|
|
the four literals below denote the same string:
|
|
<PRE>
|
|
(1) "alo\n123\""
|
|
(2) '\97lo\10\04923"'
|
|
(3) [[alo
|
|
123"]]
|
|
(4) [[
|
|
alo
|
|
123"]]
|
|
</PRE>
|
|
|
|
<p><em>Numerical constants</em> may be written with an optional decimal part
|
|
and an optional decimal exponent.
|
|
Examples of valid numerical constants are
|
|
<PRE>
|
|
3 3.0 3.1416 314.16e-2 0.31416E1
|
|
</PRE>
|
|
|
|
<p><em>Comments</em> start anywhere outside a string with a
|
|
double hyphen (<code>--</code>).
|
|
If the text immediately after <code>--</code> is different from <code>[[</code>,
|
|
the comment is a <em>short comment</em>,
|
|
which runs until the end of the line.
|
|
Otherwise, it is a <em>long comment</em>,
|
|
which runs until the corresponding <code>]]</code>.
|
|
Long comments may run for several lines
|
|
and may contain nested <code>[[</code> · · · <code>]]</code> pairs.
|
|
|
|
<p>For convenience,
|
|
the first line of a chunk is skipped if it starts with <code>#</code>.
|
|
This facility allows the use of Lua as a script interpreter
|
|
in Unix systems (see <a href="#lua-sa">6</a>).
|
|
|
|
<p><a name="TypesSec"><a name="2.2"><h2>2.2 - Values and Types</h2></a></a>
|
|
|
|
<p>Lua is a <em>dynamically typed language</em>.
|
|
That means that
|
|
variables do not have types; only values do.
|
|
There are no type definitions in the language.
|
|
All values carry their own type.
|
|
|
|
<p>There are eight basic types in Lua:
|
|
<em>nil</em>, <em>boolean</em>, <em>number</em>,
|
|
<em>string</em>, <em>function</em>, <em>userdata</em>, <em>thread</em>, and <em>table</em>.
|
|
<em>Nil</em> is the type of the value <B>nil</B>,
|
|
whose main property is to be different from any other value;
|
|
usually it represents the absence of a useful value.
|
|
<em>Boolean</em> is the type of the values <B>false</B> and <B>true</B>.
|
|
In Lua, both <B>nil</B> and <B>false</B> make a condition false;
|
|
any other value makes it true.
|
|
<em>Number</em> represents real (double-precision floating-point) numbers.
|
|
(It is easy to build Lua interpreters that use other
|
|
internal representations for numbers,
|
|
such as single-precision float or long integers.)
|
|
<em>String</em> represents arrays of characters.
|
|
|
|
Lua is 8-bit clean:
|
|
Strings may contain any 8-bit character,
|
|
including embedded zeros (<code>'\0'</code>) (see <a href="#lexical">2.1</a>).
|
|
|
|
<p>Functions are <em>first-class values</em> in Lua.
|
|
That means that functions can be stored in variables,
|
|
passed as arguments to other functions, and returned as results.
|
|
Lua can call (and manipulate) functions written in Lua and
|
|
functions written in C
|
|
(see <a href="#functioncall">2.5.7</a>).
|
|
|
|
<p>The type <em>userdata</em> is provided to allow arbitrary C data to
|
|
be stored in Lua variables.
|
|
This type corresponds to a block of raw memory
|
|
and has no pre-defined operations in Lua,
|
|
except assignment and identity test.
|
|
However, by using <em>metatables</em>,
|
|
the programmer can define operations for userdata values
|
|
(see <a href="#metatable">2.8</a>).
|
|
Userdata values cannot be created or modified in Lua,
|
|
only through the C API.
|
|
This guarantees the integrity of data owned by the host program.
|
|
|
|
<p>The type <em>thread</em> represents independent threads of execution
|
|
and it is used to implement coroutines.
|
|
|
|
<p>The type <em>table</em> implements associative arrays,
|
|
that is, arrays that can be indexed not only with numbers,
|
|
but with any value (except <B>nil</B>).
|
|
Moreover,
|
|
tables can be <em>heterogeneous</em>,
|
|
that is, they can contain values of all types (except <B>nil</B>).
|
|
Tables are the sole data structuring mechanism in Lua;
|
|
they may be used to represent ordinary arrays,
|
|
symbol tables, sets, records, graphs, trees, etc.
|
|
To represent records, Lua uses the field name as an index.
|
|
The language supports this representation by
|
|
providing <code>a.name</code> as syntactic sugar for <code>a["name"]</code>.
|
|
There are several convenient ways to create tables in Lua
|
|
(see <a href="#tableconstructor">2.5.6</a>).
|
|
|
|
<p>Like indices,
|
|
the value of a table field can be of any type (except <B>nil</B>).
|
|
In particular,
|
|
because functions are first class values,
|
|
table fields may contain functions.
|
|
Thus tables may also carry <em>methods</em> (see <a href="#func-def">2.5.8</a>).
|
|
|
|
<p>Tables, functions, and userdata values are <em>objects</em>:
|
|
variables do not actually <em>contain</em> these values,
|
|
only <em>references</em> to them.
|
|
Assignment, parameter passing, and function returns
|
|
always manipulate references to such values;
|
|
these operations do not imply any kind of copy.
|
|
|
|
<p>The library function <code>type</code> returns a string describing the type
|
|
of a given value (see <a href="#pdf-type">5.1</a>).
|
|
|
|
<p><a name="coercion"><a name="2.2.1"><h3>2.2.1 - Coercion</h3></a></a>
|
|
|
|
<p>Lua provides automatic conversion between
|
|
string and number 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 where a string is expected,
|
|
the number is converted to a string, in a reasonable format.
|
|
For complete control of how numbers are converted to strings,
|
|
use the <code>format</code> function from the string library (see <a href="#format">5.3</a>).
|
|
|
|
<p><a name="variables"><a name="2.3"><h2>2.3 - Variables</h2></a></a>
|
|
|
|
<p>Variables are places that store values.
|
|
|
|
There are three kinds of variables in Lua:
|
|
global variables, local variables, and table fields.
|
|
|
|
<p>A single name can denote a global variable or a local variable
|
|
(or a formal parameter of a function,
|
|
which is a particular form of local variable):
|
|
<pre>
|
|
var ::= Name
|
|
</pre>
|
|
Variables are assumed to be global unless explicitly declared local
|
|
(see <a href="#localvar">2.4.7</a>).
|
|
Local variables are <em>lexically scoped</em>:
|
|
Local variables can be freely accessed by functions
|
|
defined inside their scope (see <a href="#visibility">2.6</a>).
|
|
|
|
<p>Before the first assignment to a variable, its value is <B>nil</B>.
|
|
|
|
<p>Square brackets are used to index a table:
|
|
<pre>
|
|
var ::= prefixexp `<b>[</b>´ exp `<b>]</b>´
|
|
</pre>
|
|
The first expression (<em>prefixexp</em>)should result in a table value;
|
|
the second expression (<em>exp</em>)
|
|
identifies a specific entry inside that table.
|
|
The expression denoting the table to be indexed has a restricted syntax;
|
|
see <a href="#expressions">2.5</a> for details.
|
|
|
|
<p>The syntax <code>var.NAME</code> is just syntactic sugar for
|
|
<code>var["NAME"]</code>:
|
|
<pre>
|
|
var ::= prefixexp `<b>.</b>´ Name
|
|
</pre>
|
|
|
|
<p>The meaning of accesses to global variables
|
|
and table fields can be changed via metatables.
|
|
An access to an indexed variable <code>t[i]</code> is equivalent to
|
|
a call <code>gettable_event(t,i)</code>.
|
|
(See <a href="#metatable">2.8</a> for a complete description of the
|
|
<code>gettable_event</code> function.
|
|
This function is not defined or callable in Lua.
|
|
We use it here only for explanatory purposes.)
|
|
|
|
<p>All global variables live as fields in ordinary Lua tables,
|
|
called <em>environment tables</em> or simply <em>environments</em>.
|
|
Functions written in C and exported to Lua (<em>C functions</em>)
|
|
all share a common <em>global environment</em>.
|
|
Each function written in Lua (a <em>Lua function</em>)
|
|
has its own reference to an environment,
|
|
so that all global variables in that function
|
|
will refer to that environment table.
|
|
When a function is created,
|
|
it inherits the environment from the function that created it.
|
|
To change or get the environment table of a Lua function,
|
|
you call <code>setfenv</code> or <code>getfenv</code> (see <a href="#setfenv">5.1</a>).
|
|
|
|
<p>An access to a global variable <code>x</code>
|
|
is equivalent to <code>_env.x</code>,
|
|
which in turn is equivalent to
|
|
<PRE>
|
|
gettable_event(_env, "x")
|
|
</PRE>
|
|
where <code>_env</code> is the environment of the running function.
|
|
(The <code>_env</code> variable is not defined in Lua.
|
|
We use it here only for explanatory purposes.)
|
|
|
|
<p><a name="stats"><a name="2.4"><h2>2.4 - Statements</h2></a></a>
|
|
|
|
<p>Lua supports an almost conventional set of statements,
|
|
similar to those in Pascal or C.
|
|
This set includes
|
|
assignment, control structures, procedure calls,
|
|
table constructors, and variable declarations.
|
|
|
|
<p><a name="chunks"><a name="2.4.1"><h3>2.4.1 - Chunks</h3></a></a>
|
|
|
|
<p>The unit of execution of Lua is called a <em>chunk</em>.
|
|
A chunk is simply a sequence of statements,
|
|
which are executed sequentially.
|
|
Each statement can be optionally followed by a semicolon:
|
|
<pre>
|
|
chunk ::= {stat [`<b>;</b>´]}
|
|
</pre>
|
|
|
|
<p>Lua handles a chunk as the body of an anonymous function (see <a href="#func-def">2.5.8</a>).
|
|
As such, chunks can define local variables and return values.
|
|
|
|
<p>A chunk may be stored in a file or in a string inside the host program.
|
|
When a chunk is executed, first it is pre-compiled into opcodes for
|
|
a virtual machine,
|
|
and then the compiled code is executed
|
|
by an interpreter for the virtual machine.
|
|
|
|
<p>Chunks may also be pre-compiled into binary form;
|
|
see program <code>luac</code> for details.
|
|
Programs in source and compiled forms are interchangeable;
|
|
Lua automatically detects the file type and acts accordingly.
|
|
|
|
|
|
<p><a name="2.4.2"><h3>2.4.2 - Blocks</h3></a>
|
|
A block is a list of statements;
|
|
syntactically, a block is equal to a chunk:
|
|
<pre>
|
|
block ::= chunk
|
|
</pre>
|
|
|
|
<p>A block may be explicitly delimited to produce a single statement:
|
|
<pre>
|
|
stat ::= <b>do</b> block <b>end</b>
|
|
</pre>
|
|
Explicit blocks are useful
|
|
to control the scope of variable declarations.
|
|
Explicit blocks are also sometimes used to
|
|
add a <b>return</b> or <b>break</b> statement in the middle
|
|
of another block (see <a href="#control">2.4.4</a>).
|
|
|
|
|
|
<p><a name="assignment"><a name="2.4.3"><h3>2.4.3 - Assignment</h3></a></a>
|
|
|
|
<p>Lua allows multiple assignment.
|
|
Therefore, the syntax for assignment
|
|
defines a list of variables on the left side
|
|
and a list of expressions on the right side.
|
|
The elements in both lists are separated by commas:
|
|
<pre>
|
|
stat ::= varlist1 `<b>=</b>´ explist1
|
|
varlist1 ::= var {`<b>,</b>´ var}
|
|
explist1 ::= exp {`<b>,</b>´ exp}
|
|
</pre>
|
|
Expressions are discussed in <a href="#expressions">2.5</a>.
|
|
|
|
<p>Before the assignment,
|
|
the list of values is <em>adjusted</em> to the length of
|
|
the list of variables.
|
|
If there are more values than needed,
|
|
the excess values are thrown away.
|
|
If there are fewer values than needed,
|
|
the list is extended with as many <B>nil</B>'s as needed.
|
|
If the list of expressions ends with a function call,
|
|
then all values returned by that function call enter in the list of values,
|
|
before the adjustment
|
|
(except when the call is enclosed in parentheses; see <a href="#expressions">2.5</a>).
|
|
|
|
<p>The assignment statement first evaluates all its expressions
|
|
and only then are the assignments performed.
|
|
Thus the code
|
|
<PRE>
|
|
i = 3
|
|
i, a[i] = i+1, 20
|
|
</PRE>
|
|
sets <code>a[3]</code> to 20, without affecting <code>a[4]</code>
|
|
because the <code>i</code> in <code>a[i]</code> is evaluated (to 3)
|
|
before it is assigned 4.
|
|
Similarly, the line
|
|
<PRE>
|
|
x, y = y, x
|
|
</PRE>
|
|
exchanges the values of <code>x</code> and <code>y</code>.
|
|
|
|
<p>The meaning of assignments to global variables
|
|
and table fields can be changed via metatables.
|
|
An assignment to an indexed variable <code>t[i] = val</code> is equivalent to
|
|
<code>settable_event(t,i,val)</code>.
|
|
(See <a href="#metatable">2.8</a> for a complete description of the
|
|
<code>settable_event</code> function.
|
|
This function is not defined or callable in Lua.
|
|
We use it here only for explanatory purposes.)
|
|
|
|
<p>An assignment to a global variable <code>x = val</code>
|
|
is equivalent to the assignment
|
|
<code>_env.x = val</code>,
|
|
which in turn is equivalent to
|
|
<PRE>
|
|
settable_event(_env, "x", val)
|
|
</PRE>
|
|
where <code>_env</code> is the environment of the running function.
|
|
(The <code>_env</code> variable is not defined in Lua.
|
|
We use it here only for explanatory purposes.)
|
|
|
|
<p><a name="control"><a name="2.4.4"><h3>2.4.4 - Control Structures</h3></a></a>
|
|
The control structures
|
|
<b>if</b>, <b>while</b>, and <b>repeat</b> have the usual meaning and
|
|
familiar syntax:
|
|
|
|
|
|
|
|
<pre>
|
|
stat ::= <b>while</b> exp <b>do</b> block <b>end</b>
|
|
stat ::= <b>repeat</b> block <b>until</b> exp
|
|
stat ::= <b>if</b> exp <b>then</b> block {<b>elseif</b> exp <b>then</b> block} [<b>else</b> block] <b>end</b>
|
|
</pre>
|
|
Lua also has a <b>for</b> statement, in two flavors (see <a href="#for">2.4.5</a>).
|
|
|
|
<p>The condition expression <em>exp</em> of a
|
|
control structure may return any value.
|
|
Both <B>false</B> and <B>nil</B> are considered false.
|
|
All values different from <B>nil</B> and <B>false</B> are considered true
|
|
(in particular, the number 0 and the empty string are also true).
|
|
|
|
<p>The <b>return</b> statement is used to return values
|
|
from a function or from a chunk.
|
|
|
|
Functions and chunks may return more than one value,
|
|
so the syntax for the <b>return</b> statement is
|
|
<pre>
|
|
stat ::= <b>return</b> [explist1]
|
|
</pre>
|
|
|
|
<p>The <b>break</b> statement can be used to terminate the execution of a
|
|
<b>while</b>, <b>repeat</b>, or <b>for</b> loop,
|
|
skipping to the next statement after the loop:
|
|
|
|
<pre>
|
|
stat ::= <b>break</b>
|
|
</pre>
|
|
A <b>break</b> ends the innermost enclosing loop.
|
|
|
|
<p>For syntactic reasons, <b>return</b> and <b>break</b>
|
|
statements can only be written as the <em>last</em> statement of a block.
|
|
If it is really necessary to <b>return</b> or <b>break</b> in the
|
|
middle of a block,
|
|
then an explicit inner block can be used,
|
|
as in the idioms
|
|
`<code>do return end</code>´ and
|
|
`<code>do break end</code>´,
|
|
because now <b>return</b> and <b>break</b> are the last statements in
|
|
their (inner) blocks.
|
|
In practice,
|
|
those idioms are only used during debugging.
|
|
|
|
<p><a name="for"><a name="2.4.5"><h3>2.4.5 - For Statement</h3></a></a>
|
|
|
|
<p>The <b>for</b> statement has two forms:
|
|
one numeric and one generic.
|
|
|
|
|
|
<p>The numeric <b>for</b> loop repeats a block of code while a
|
|
control variable runs through an arithmetic progression.
|
|
It has the following syntax:
|
|
<pre>
|
|
stat ::= <b>for</b> Name `<b>=</b>´ exp `<b>,</b>´ exp [`<b>,</b>´ exp] <b>do</b> block <b>end</b>
|
|
</pre>
|
|
The <em>block</em> is repeated for <em>name</em> starting at the value of
|
|
the first <em>exp</em>, until it passes the second <em>exp</em> by steps of the
|
|
third <em>exp</em>.
|
|
More precisely, a <b>for</b> statement like
|
|
<PRE>
|
|
for var = e1, e2, e3 do block end
|
|
</PRE>
|
|
is equivalent to the code:
|
|
<PRE>
|
|
do
|
|
local var, _limit, _step = tonumber(e1), tonumber(e2), tonumber(e3)
|
|
if not (var and _limit and _step) then error() end
|
|
while (_step>0 and var<=_limit) or (_step<=0 and var>=_limit) do
|
|
block
|
|
var = var + _step
|
|
end
|
|
end
|
|
</PRE>
|
|
Note the following:
|
|
<ul>
|
|
<li> All three control expressions are evaluated only once,
|
|
before the loop starts.
|
|
They must all result in numbers.
|
|
<li> <code>_limit</code> and <code>_step</code> are invisible variables.
|
|
The names are here for explanatory purposes only.
|
|
<li> The behavior is <em>undefined</em> if you assign to <code>var</code> inside
|
|
the block.
|
|
<li> If the third expression (the step) is absent, then a step of 1 is used.
|
|
<li> You can use <b>break</b> to exit a <b>for</b> loop.
|
|
<li> The loop variable <code>var</code> is local to the statement;
|
|
you cannot use its value after the <b>for</b> ends or is broken.
|
|
If you need the value of the loop variable <code>var</code>,
|
|
then assign it to another variable before breaking or exiting the loop.
|
|
</ul>
|
|
|
|
<p>The generic <b>for</b> statement works over functions,
|
|
called <em>iterators</em>.
|
|
For each iteration, it calls its iterator function to produce a new value,
|
|
stopping when the new value is <B>nil</B>.
|
|
The generic <b>for</b> loop has the following syntax:
|
|
<pre>
|
|
stat ::= <b>for</b> Name {`<b>,</b>´ Name} <b>in</b> explist1 <b>do</b> block <b>end</b>
|
|
</pre>
|
|
A <b>for</b> statement like
|
|
<PRE>
|
|
for var_1, ..., var_n in explist do block end
|
|
</PRE>
|
|
is equivalent to the code:
|
|
<PRE>
|
|
do
|
|
local _f, _s, var_1 = explist
|
|
local var_2, ... , var_n
|
|
while true do
|
|
var_1, ..., var_n = _f(_s, var_1)
|
|
if var_1 == nil then break end
|
|
block
|
|
end
|
|
end
|
|
</PRE>
|
|
Note the following:
|
|
<ul>
|
|
<li> <code>explist</code> is evaluated only once.
|
|
Its results are an <em>iterator</em> function,
|
|
a <em>state</em>, and an initial value for the first <em>iterator variable</em>.
|
|
<li> <code>_f</code> and <code>_s</code> are invisible variables.
|
|
The names are here for explanatory purposes only.
|
|
<li> The behavior is <em>undefined</em> if you assign to
|
|
<code>var_1</code> inside the block.
|
|
<li> You can use <b>break</b> to exit a <b>for</b> loop.
|
|
<li> The loop variables <code>var_i</code> are local to the statement;
|
|
you cannot use their values after the <b>for</b> ends.
|
|
If you need these values,
|
|
then assign them to other variables before breaking or exiting the loop.
|
|
</ul>
|
|
|
|
<p><a name="funcstat"><a name="2.4.6"><h3>2.4.6 - Function Calls as Statements</h3></a></a>
|
|
To allow possible side-effects,
|
|
function calls can be executed as statements:
|
|
<pre>
|
|
stat ::= functioncall
|
|
</pre>
|
|
In this case, all returned values are thrown away.
|
|
Function calls are explained in <a href="#functioncall">2.5.7</a>.
|
|
|
|
<p><a name="localvar"><a name="2.4.7"><h3>2.4.7 - Local Declarations</h3></a></a>
|
|
Local variables may be declared anywhere inside a block.
|
|
The declaration may include an initial assignment:
|
|
<pre>
|
|
stat ::= <b>local</b> namelist [`<b>=</b>´ explist1]
|
|
namelist ::= Name {`<b>,</b>´ Name}
|
|
</pre>
|
|
If present, an initial assignment has the same semantics
|
|
of a multiple assignment (see <a href="#assignment">2.4.3</a>).
|
|
Otherwise, all variables are initialized with <B>nil</B>.
|
|
|
|
<p>A chunk is also a block (see <a href="#chunks">2.4.1</a>),
|
|
so local variables can be declared in a chunk outside any explicit block.
|
|
Such local variables die when the chunk ends.
|
|
|
|
<p>The visibility rules for local variables are explained in <a href="#visibility">2.6</a>.
|
|
|
|
<p><a name="expressions"><a name="2.5"><h2>2.5 - Expressions</h2></a></a>
|
|
|
|
<p>
|
|
The basic expressions in Lua are the following:
|
|
<pre>
|
|
exp ::= prefixexp
|
|
exp ::= <b>nil</b> | <b>false</b> | <b>true</b>
|
|
exp ::= Number
|
|
exp ::= Literal
|
|
exp ::= function
|
|
exp ::= tableconstructor
|
|
prefixexp ::= var | functioncall | `<b>(</b>´ exp `<b>)</b>´
|
|
</pre>
|
|
|
|
<p>Numbers and literal strings are explained in <a href="#lexical">2.1</a>;
|
|
variables are explained in <a href="#variables">2.3</a>;
|
|
function definitions are explained in <a href="#func-def">2.5.8</a>;
|
|
function calls are explained in <a href="#functioncall">2.5.7</a>;
|
|
table constructors are explained in <a href="#tableconstructor">2.5.6</a>.
|
|
|
|
|
|
<p>An expression enclosed in parentheses always results in only one value.
|
|
Thus,
|
|
<code>(f(x,y,z))</code> is always a single value,
|
|
even if <code>f</code> returns several values.
|
|
(The value of <code>(f(x,y,z))</code> is the first value returned by <code>f</code>
|
|
or <B>nil</B> if <code>f</code> does not return any values.)
|
|
|
|
<p>Expressions can also be built with arithmetic operators, relational operators,
|
|
and logical operators, all of which are explained below.
|
|
|
|
<p><a name="2.5.1"><h3>2.5.1 - Arithmetic Operators</h3></a>
|
|
Lua supports the usual arithmetic operators:
|
|
the binary <code>+</code> (addition),
|
|
<code>-</code> (subtraction), <code>*</code> (multiplication),
|
|
<code>/</code> (division), and <code>^</code> (exponentiation);
|
|
and unary <code>-</code> (negation).
|
|
If the operands are numbers, or strings that can be converted to
|
|
numbers (see <a href="#coercion">2.2.1</a>),
|
|
then all operations except exponentiation have the usual meaning.
|
|
Exponentiation calls a global function <code>__pow</code>;
|
|
otherwise, an appropriate metamethod is called (see <a href="#metatable">2.8</a>).
|
|
The standard mathematical library defines function <code>__pow</code>,
|
|
giving the expected meaning to exponentiation
|
|
(see <a href="#mathlib">5.5</a>).
|
|
|
|
<p><a name="rel-ops"><a name="2.5.2"><h3>2.5.2 - Relational Operators</h3></a></a>
|
|
The relational operators in Lua are
|
|
<PRE>
|
|
== ~= < > <= >=
|
|
</PRE>
|
|
These operators always result in <B>false</B> or <B>true</B>.
|
|
|
|
<p>Equality (<code>==</code>) first compares the type of its operands.
|
|
If the types are different, then the result is <B>false</B>.
|
|
Otherwise, the values of the operands are compared.
|
|
Numbers and strings are compared in the usual way.
|
|
Objects (tables, userdata, threads, and functions)
|
|
are compared by <em>reference</em>:
|
|
Two objects are considered equal only if they are the <em>same</em> object.
|
|
Every time you create a new object (a table, userdata, or function),
|
|
this new object is different from any previously existing object.
|
|
|
|
<p>You can change the way that Lua compares tables and userdata
|
|
using the "eq" metamethod (see <a href="#metatable">2.8</a>).
|
|
|
|
<p>The conversion rules of <a href="#coercion">2.2.1</a>
|
|
<em>do not</em> apply to equality comparisons.
|
|
Thus, <code>"0"==0</code> evaluates to <B>false</B>,
|
|
and <code>t[0]</code> and <code>t["0"]</code> denote different
|
|
entries in a table.
|
|
|
|
|
|
<p>The operator <code>~=</code> is exactly the negation of equality (<code>==</code>).
|
|
|
|
<p>The order operators work as follows.
|
|
If both arguments are numbers, then they are compared as such.
|
|
Otherwise, if both arguments are strings,
|
|
then their values are compared according to the current locale.
|
|
Otherwise, Lua tries to call the "lt" or the "le"
|
|
metamethod (see <a href="#metatable">2.8</a>).
|
|
|
|
<p><a name="2.5.3"><h3>2.5.3 - Logical Operators</h3></a>
|
|
The logical operators in Lua are
|
|
|
|
<PRE>
|
|
and or not
|
|
</PRE>
|
|
Like the control structures (see <a href="#control">2.4.4</a>),
|
|
all logical operators consider both <B>false</B> and <B>nil</B> as false
|
|
and anything else as true.
|
|
|
|
|
|
<p>The operator <b>not</b> always return <B>false</B> or <B>true</B>.
|
|
|
|
<p>The conjunction operator <b>and</b> returns its first argument
|
|
if this value is <B>false</B> or <B>nil</B>;
|
|
otherwise, <b>and</b> returns its second argument.
|
|
The disjunction operator <b>or</b> returns its first argument
|
|
if this value is different from <B>nil</B> and <B>false</B>;
|
|
otherwise, <b>or</b> returns its second argument.
|
|
Both <b>and</b> and <b>or</b> use short-cut evaluation,
|
|
that is,
|
|
the second operand is evaluated only if necessary.
|
|
For example,
|
|
<PRE>
|
|
10 or error() -> 10
|
|
nil or "a" -> "a"
|
|
nil and 10 -> nil
|
|
false and error() -> false
|
|
false and nil -> false
|
|
false or nil -> nil
|
|
10 and 20 -> 20
|
|
</PRE>
|
|
|
|
<p><a name="concat"><a name="2.5.4"><h3>2.5.4 - Concatenation</h3></a></a>
|
|
The string concatenation operator in Lua is
|
|
denoted by two dots (`<code>..</code>´).
|
|
If both operands are strings or numbers, then they are converted to
|
|
strings according to the rules mentioned in <a href="#coercion">2.2.1</a>.
|
|
Otherwise, the "concat" metamethod is called (see <a href="#metatable">2.8</a>).
|
|
|
|
<p><a name="2.5.5"><h3>2.5.5 - Precedence</h3></a>
|
|
Operator precedence in Lua follows the table below,
|
|
from lower to higher priority:
|
|
<PRE>
|
|
or
|
|
and
|
|
< > <= >= ~= ==
|
|
..
|
|
+ -
|
|
* /
|
|
not - (unary)
|
|
^
|
|
</PRE>
|
|
You can use parentheses to change the precedences in an expression.
|
|
The concatenation (`<code>..</code>´) and exponentiation (`<code>^</code>´)
|
|
operators are right associative.
|
|
All other binary operators are left associative.
|
|
|
|
<p><a name="tableconstructor"><a name="2.5.6"><h3>2.5.6 - Table Constructors</h3></a></a>
|
|
Table constructors are expressions that create tables.
|
|
Every time a constructor is evaluated, a new table is created.
|
|
Constructors can be used to create empty tables,
|
|
or to create a table and initialize some of its fields.
|
|
The general syntax for constructors is
|
|
<pre>
|
|
tableconstructor ::= `<b>{</b>´ [fieldlist] `<b>}</b>´
|
|
fieldlist ::= field {fieldsep field} [fieldsep]
|
|
field ::= `<b>[</b>´ exp `<b>]</b>´ `<b>=</b>´ exp | Name `<b>=</b>´ exp | exp
|
|
fieldsep ::= `<b>,</b>´ | `<b>;</b>´
|
|
</pre>
|
|
|
|
<p>Each field of the form <code>[exp1] = exp2</code> adds to the new table an entry
|
|
with key <code>exp1</code> and value <code>exp2</code>.
|
|
A field of the form <code>name = exp</code> is equivalent to
|
|
<code>["name"] = exp</code>.
|
|
Finally, fields of the form <code>exp</code> are equivalent to
|
|
<code>[i] = exp</code>, where <code>i</code> are consecutive numerical integers,
|
|
starting with 1.
|
|
Fields in the other formats do not affect this counting.
|
|
For example,
|
|
<PRE>
|
|
a = {[f(1)] = g; "x", "y"; x = 1, f(x), [30] = 23; 45}
|
|
</PRE>
|
|
is equivalent to
|
|
<PRE>
|
|
do
|
|
local temp = {}
|
|
temp[f(1)] = g
|
|
temp[1] = "x" -- 1st exp
|
|
temp[2] = "y" -- 2nd exp
|
|
temp.x = 1 -- temp["x"] = 1
|
|
temp[3] = f(x) -- 3rd exp
|
|
temp[30] = 23
|
|
temp[4] = 45 -- 4th exp
|
|
a = temp
|
|
end
|
|
</PRE>
|
|
|
|
<p>If the last field in the list has the form <code>exp</code>
|
|
and the expression is a function call,
|
|
then all values returned by the call enter the list consecutively
|
|
(see <a href="#functioncall">2.5.7</a>).
|
|
To avoid this,
|
|
enclose the function call in parentheses (see <a href="#expressions">2.5</a>).
|
|
|
|
<p>The field list may have an optional trailing separator,
|
|
as a convenience for machine-generated code.
|
|
|
|
<p><a name="functioncall"><a name="2.5.7"><h3>2.5.7 - Function Calls</h3></a></a>
|
|
A function call in Lua has the following syntax:
|
|
<pre>
|
|
functioncall ::= prefixexp args
|
|
</pre>
|
|
In a function call,
|
|
first <em>prefixexp</em> and <em>args</em> are evaluated.
|
|
If the value of <em>prefixexp</em> has type <em>function</em>,
|
|
then that function is called
|
|
with the given arguments.
|
|
Otherwise, its "call" metamethod is called,
|
|
having as first parameter the value of <em>prefixexp</em>,
|
|
followed by the original call arguments
|
|
(see <a href="#metatable">2.8</a>).
|
|
|
|
<p>The form
|
|
<pre>
|
|
functioncall ::= prefixexp `<b>:</b>´ Name args
|
|
</pre>
|
|
can be used to call "methods".
|
|
A call <code>v:name(...)</code>
|
|
is syntactic sugar for <code>v.name(v,...)</code>,
|
|
except that <code>v</code> is evaluated only once.
|
|
|
|
<p>Arguments have the following syntax:
|
|
<pre>
|
|
args ::= `<b>(</b>´ [explist1] `<b>)</b>´
|
|
args ::= tableconstructor
|
|
args ::= Literal
|
|
</pre>
|
|
All argument expressions are evaluated before the call.
|
|
A call of the form <code>f{...}</code> is syntactic sugar for
|
|
<code>f({...})</code>, that is,
|
|
the argument list is a single new table.
|
|
A call of the form <code>f'...'</code>
|
|
(or <code>f"..."</code> or <code>f[[...]]</code>) is syntactic sugar for
|
|
<code>f('...')</code>, that is,
|
|
the argument list is a single literal string.
|
|
|
|
<p>Because a function can return any number of results
|
|
(see <a href="#control">2.4.4</a>),
|
|
the number of results must be adjusted before they are used.
|
|
If the function is called as a statement (see <a href="#funcstat">2.4.6</a>),
|
|
then its return list is adjusted to zero elements,
|
|
thus discarding all returned values.
|
|
If the function is called inside another expression
|
|
or in the middle of a list of expressions,
|
|
then its return list is adjusted to one element,
|
|
thus discarding all returned values except the first one.
|
|
If the function is called as the last element of a list of expressions,
|
|
then no adjustment is made
|
|
(unless the call is enclosed in parentheses).
|
|
|
|
<p>Here are some examples:
|
|
<PRE>
|
|
f() -- adjusted to 0 results
|
|
g(f(), x) -- f() is adjusted to 1 result
|
|
g(x, f()) -- g gets x plus all values returned by f()
|
|
a,b,c = f(), x -- f() is adjusted to 1 result (and c gets nil)
|
|
a,b,c = x, f() -- f() is adjusted to 2 results
|
|
a,b,c = f() -- f() is adjusted to 3 results
|
|
return f() -- returns all values returned by f()
|
|
return x,y,f() -- returns x, y, and all values returned by f()
|
|
{f()} -- creates a list with all values returned by f()
|
|
{f(), nil} -- f() is adjusted to 1 result
|
|
</PRE>
|
|
|
|
<p>If you enclose a function call in parentheses,
|
|
then it is adjusted to return exactly one value:
|
|
<PRE>
|
|
return x,y,(f()) -- returns x, y, and the first value from f()
|
|
{(f())} -- creates a table with exactly one element
|
|
</PRE>
|
|
|
|
<p>As an exception to the free-format syntax of Lua,
|
|
you cannot put a line break before the `<code>(</code>´ in a function call.
|
|
That restriction avoids some ambiguities in the language.
|
|
If you write
|
|
<PRE>
|
|
a = f
|
|
(g).x(a)
|
|
</PRE>
|
|
Lua would read that as <code>a = f(g).x(a)</code>.
|
|
So, if you want two statements, you must add a semi-colon between them.
|
|
If you actually want to call <code>f</code>,
|
|
you must remove the line break before <code>(g)</code>.
|
|
|
|
<p>A call of the form <code>return</code> <em>functioncall</em> is called
|
|
a <em>tail call</em>.
|
|
Lua implements <em>proper tail calls</em>
|
|
(or <em>proper tail recursion</em>):
|
|
In a tail call,
|
|
the called function reuses the stack entry of the calling function.
|
|
Therefore, there is no limit on the number of nested tail calls that
|
|
a program can execute.
|
|
However, a tail call erases any debug information about the
|
|
calling function.
|
|
Note that a tail call only happens with a particular syntax,
|
|
where the <b>return</b> has one single function call as argument;
|
|
this syntax makes the calling function returns exactly
|
|
the returns of the called function.
|
|
So, all the following examples are not tails calls:
|
|
<PRE>
|
|
return (f(x)) -- results adjusted to 1
|
|
return 2 * f(x)
|
|
return x, f(x) -- additional results
|
|
f(x); return -- results discarded
|
|
return x or f(x) -- results adjusted to 1
|
|
</PRE>
|
|
|
|
<p><a name="func-def"><a name="2.5.8"><h3>2.5.8 - Function Definitions</h3></a></a>
|
|
|
|
<p>The syntax for function definition is
|
|
<pre>
|
|
function ::= <b>function</b> funcbody
|
|
funcbody ::= `<b>(</b>´ [parlist1] `<b>)</b>´ block <b>end</b>
|
|
</pre>
|
|
|
|
<p>The following syntactic sugar simplifies function definitions:
|
|
<pre>
|
|
stat ::= <b>function</b> funcname funcbody
|
|
stat ::= <b>local</b> <b>function</b> Name funcbody
|
|
funcname ::= Name {`<b>.</b>´ Name} [`<b>:</b>´ Name]
|
|
</pre>
|
|
The statement
|
|
<PRE>
|
|
function f () ... end
|
|
</PRE>
|
|
translates to
|
|
<PRE>
|
|
f = function () ... end
|
|
</PRE>
|
|
The statement
|
|
<PRE>
|
|
function t.a.b.c.f () ... end
|
|
</PRE>
|
|
translates to
|
|
<PRE>
|
|
t.a.b.c.f = function () ... end
|
|
</PRE>
|
|
The statement
|
|
<PRE>
|
|
local function f () ... end
|
|
</PRE>
|
|
translates to
|
|
<PRE>
|
|
local f; f = function () ... end
|
|
</PRE>
|
|
|
|
<p>A function definition is an executable expression,
|
|
whose value has type <em>function</em>.
|
|
When Lua pre-compiles a chunk,
|
|
all its function bodies are pre-compiled too.
|
|
Then, whenever Lua executes the function definition,
|
|
the function is <em>instantiated</em> (or <em>closed</em>).
|
|
This function instance (or <em>closure</em>)
|
|
is the final value of the expression.
|
|
Different instances of the same function
|
|
may refer to different external local variables
|
|
and may have different environment tables.
|
|
|
|
<p>Parameters act as local variables that are
|
|
initialized with the argument values:
|
|
<pre>
|
|
parlist1 ::= namelist [`<b>,</b>´ `<b>...</b>´]
|
|
parlist1 ::= `<b>...</b>´
|
|
</pre>
|
|
When a function is called,
|
|
the list of arguments is adjusted to
|
|
the length of the list of parameters,
|
|
unless the function is a variadic or <em>vararg function</em>,
|
|
which is
|
|
indicated by three dots (`<code>...</code>´) at the end of its parameter list.
|
|
A vararg function does not adjust its argument list;
|
|
instead, it collects all extra arguments into an implicit parameter,
|
|
called <code>arg</code>.
|
|
The value of <a name="vararg"><code>arg</code></a> is a table,
|
|
with a field <code>n</code> that holds the number of extra arguments
|
|
and with the extra arguments at positions 1, 2, ..., <code>n</code>.
|
|
|
|
<p>As an example, consider the following definitions:
|
|
<PRE>
|
|
function f(a, b) end
|
|
function g(a, b, ...) end
|
|
function r() return 1,2,3 end
|
|
</PRE>
|
|
Then, we have the following mapping from arguments to parameters:
|
|
<PRE>
|
|
CALL PARAMETERS
|
|
|
|
f(3) a=3, b=nil
|
|
f(3, 4) a=3, b=4
|
|
f(3, 4, 5) a=3, b=4
|
|
f(r(), 10) a=1, b=10
|
|
f(r()) a=1, b=2
|
|
|
|
g(3) a=3, b=nil, arg={n=0}
|
|
g(3, 4) a=3, b=4, arg={n=0}
|
|
g(3, 4, 5, 8) a=3, b=4, arg={5, 8; n=2}
|
|
g(5, r()) a=5, b=1, arg={2, 3; n=2}
|
|
</PRE>
|
|
|
|
<p>Results are returned using the <b>return</b> statement (see <a href="#control">2.4.4</a>).
|
|
If control reaches the end of a function
|
|
without encountering a <b>return</b> statement,
|
|
then the function returns with no results.
|
|
|
|
<p>The <em>colon</em> syntax
|
|
is used for defining <em>methods</em>,
|
|
that is, functions that have an implicit extra parameter <code>self</code>.
|
|
Thus, the statement
|
|
<PRE>
|
|
function t.a.b.c:f (...) ... end
|
|
</PRE>
|
|
is syntactic sugar for
|
|
<PRE>
|
|
t.a.b.c.f = function (self, ...) ... end
|
|
</PRE>
|
|
|
|
<p><a name="visibility"><a name="2.6"><h2>2.6 - Visibility Rules</h2></a></a>
|
|
|
|
|
|
<p>Lua is a lexically scoped language.
|
|
The scope of variables begins at the first statement <em>after</em>
|
|
their declaration and lasts until the end of the innermost block that
|
|
includes the declaration.
|
|
For instance:
|
|
<PRE>
|
|
x = 10 -- global variable
|
|
do -- new block
|
|
local x = x -- new `x', with value 10
|
|
print(x) --> 10
|
|
x = x+1
|
|
do -- another block
|
|
local x = x+1 -- another `x'
|
|
print(x) --> 12
|
|
end
|
|
print(x) --> 11
|
|
end
|
|
print(x) --> 10 (the global one)
|
|
</PRE>
|
|
Notice that, in a declaration like <code>local x = x</code>,
|
|
the new <code>x</code> being declared is not in scope yet,
|
|
and so the second <code>x</code> refers to the outside variable.
|
|
|
|
<p>Because of the lexical scoping rules,
|
|
local variables can be freely accessed by functions
|
|
defined inside their scope.
|
|
For instance:
|
|
<PRE>
|
|
local counter = 0
|
|
function inc (x)
|
|
counter = counter + x
|
|
return counter
|
|
end
|
|
</PRE>
|
|
A local variable used by an inner function is called
|
|
an <em>upvalue</em>, or <em>external local variable</em>,
|
|
inside the inner function.
|
|
|
|
<p>Notice that each execution of a <b>local</b> statement
|
|
defines new local variables.
|
|
Consider the following example:
|
|
<PRE>
|
|
a = {}
|
|
local x = 20
|
|
for i=1,10 do
|
|
local y = 0
|
|
a[i] = function () y=y+1; return x+y end
|
|
end
|
|
</PRE>
|
|
The loop creates ten closures
|
|
(that is, ten instances of the anonymous function).
|
|
Each of these closures uses a different <code>y</code> variable,
|
|
while all of them share the same <code>x</code>.
|
|
|
|
<p><a name="error"><a name="2.7"><h2>2.7 - Error Handling</h2></a></a>
|
|
|
|
<p>Because Lua is an extension language,
|
|
all Lua actions start from C code in the host program
|
|
calling a function from the Lua library (see <a href="#lua_pcall">3.15</a>).
|
|
Whenever an error occurs during Lua compilation or execution,
|
|
control returns to C,
|
|
which can take appropriate measures
|
|
(such as print an error message).
|
|
|
|
<p>Lua code can explicitly generate an error by calling the
|
|
<code>error</code> function (see <a href="#pdf-error">5.1</a>).
|
|
If you need to catch errors in Lua,
|
|
you can use the <code>pcall</code> function (see <a href="#pdf-pcall">5.1</a>).
|
|
|
|
<p><a name="metatable"><a name="2.8"><h2>2.8 - Metatables</h2></a></a>
|
|
|
|
<p>Every table and userdata object in Lua may have a <em>metatable</em>.
|
|
This <em>metatable</em> is an ordinary Lua table
|
|
that defines the behavior of the original table and userdata
|
|
under certain special operations.
|
|
You can change several aspects of the behavior
|
|
of an object by setting specific fields in its metatable.
|
|
For instance, when an object is the operand of an addition,
|
|
Lua checks for a function in the field <code>"__add"</code> in its metatable.
|
|
If it finds one,
|
|
Lua calls that function to perform the addition.
|
|
|
|
<p>We call the keys in a metatable <em>events</em>
|
|
and the values <em>metamethods</em>.
|
|
In the previous example, the event is <code>"add"</code>
|
|
and the metamethod is the function that performs the addition.
|
|
|
|
<p>You can query and change the metatable of an object
|
|
through the <code>set/getmetatable</code>
|
|
functions (see <a href="#pdf-getmetatable">5.1</a>).
|
|
|
|
<p>A metatable may control how an object behaves in arithmetic operations,
|
|
order comparisons, concatenation, and indexing.
|
|
A metatable can also define a function to be called when a userdata
|
|
is garbage collected.
|
|
For each of those operations Lua associates a specific key
|
|
called an <em>event</em>.
|
|
When Lua performs one of those operations over a table or a userdata,
|
|
it checks whether that object has a metatable with the corresponding event.
|
|
If so, the value associated with that key (the <em>metamethod</em>)
|
|
controls how Lua will perform the operation.
|
|
|
|
<p>Metatables control the operations listed next.
|
|
Each operation is identified by its corresponding name.
|
|
The key for each operation is a string with its name prefixed by
|
|
two underscores;
|
|
for instance, the key for operation "add" is the
|
|
string <code>"__add"</code>.
|
|
The semantics of these operations is better explained by a Lua function
|
|
describing how the interpreter executes that operation.
|
|
|
|
<p>The code shown here in Lua is only illustrative;
|
|
the real behavior is hard coded in the interpreter
|
|
and it is much more efficient than this simulation.
|
|
All functions used in these descriptions
|
|
(<code>rawget</code>, <code>tonumber</code>, etc.)
|
|
are described in <a href="#predefined">5.1</a>.
|
|
In particular, to retrieve the metamethod of a given object,
|
|
we use the expression
|
|
<PRE>
|
|
metatable(obj)[event]
|
|
</PRE>
|
|
This should be read as
|
|
<PRE>
|
|
rawget(metatable(obj) or {}, event)
|
|
</PRE>
|
|
That is, the access to a metamethod does not invoke other metamethods,
|
|
and the access to objects with no metatables does not fail
|
|
(it simply results in <B>nil</B>).
|
|
|
|
<p><ul>
|
|
|
|
<p><li><b>"add":</b>
|
|
the <code>+</code> operation.
|
|
|
|
<p>The function <code>getbinhandler</code> below defines how Lua chooses a handler
|
|
for a binary operation.
|
|
First, Lua tries the first operand.
|
|
If its type does not define a handler for the operation,
|
|
then Lua tries the second operand.
|
|
<PRE>
|
|
function getbinhandler (op1, op2, event)
|
|
return metatable(op1)[event] or metatable(op2)[event]
|
|
end
|
|
</PRE>
|
|
Using that function,
|
|
the behavior of the <code>op1 + op2</code> is
|
|
<PRE>
|
|
function add_event (op1, op2)
|
|
local o1, o2 = tonumber(op1), tonumber(op2)
|
|
if o1 and o2 then -- both operands are numeric?
|
|
return o1 + o2 -- `+' here is the primitive `add'
|
|
else -- at least one of the operands is not numeric
|
|
local h = getbinhandler(op1, op2, "__add")
|
|
if h then
|
|
-- call the handler with both operands
|
|
return h(op1, op2)
|
|
else -- no handler available: default behavior
|
|
error("...")
|
|
end
|
|
end
|
|
end
|
|
</PRE>
|
|
|
|
<p><li><b>"sub":</b>
|
|
the <code>-</code> operation.
|
|
Behavior similar to the "add" operation.
|
|
|
|
<p><li><b>"mul":</b>
|
|
the <code>*</code> operation.
|
|
Behavior similar to the "add" operation.
|
|
|
|
<p><li><b>"div":</b>
|
|
the <code>/</code> operation.
|
|
Behavior similar to the "add" operation.
|
|
|
|
<p><li><b>"pow":</b>
|
|
the <code>^</code> (exponentiation) operation.
|
|
<PRE>
|
|
function pow_event (op1, op2)
|
|
local o1, o2 = tonumber(op1), tonumber(op2)
|
|
if o1 and o2 then -- both operands are numeric?
|
|
return __pow(o1, o2) -- call global `__pow'
|
|
else -- at least one of the operands is not numeric
|
|
local h = getbinhandler(op1, op2, "__pow")
|
|
if h then
|
|
-- call the handler with both operands
|
|
return h(op1, op2)
|
|
else -- no handler available: default behavior
|
|
error("...")
|
|
end
|
|
end
|
|
end
|
|
</PRE>
|
|
|
|
<p><li><b>"unm":</b>
|
|
the unary <code>-</code> operation.
|
|
<PRE>
|
|
function unm_event (op)
|
|
local o = tonumber(op)
|
|
if o then -- operand is numeric?
|
|
return -o -- `-' here is the primitive `unm'
|
|
else -- the operand is not numeric.
|
|
-- Try to get a handler from the operand
|
|
local h = metatable(op).__unm
|
|
if h then
|
|
-- call the handler with the operand and nil
|
|
return h(op, nil)
|
|
else -- no handler available: default behavior
|
|
error("...")
|
|
end
|
|
end
|
|
end
|
|
</PRE>
|
|
|
|
<p><li><b>"concat":</b>
|
|
the <code>..</code> (concatenation) operation.
|
|
<PRE>
|
|
function concat_event (op1, op2)
|
|
if (type(op1) == "string" or type(op1) == "number") and
|
|
(type(op2) == "string" or type(op2) == "number") then
|
|
return op1 .. op2 -- primitive string concatenation
|
|
else
|
|
local h = getbinhandler(op1, op2, "__concat")
|
|
if h then
|
|
return h(op1, op2)
|
|
else
|
|
error("...")
|
|
end
|
|
end
|
|
end
|
|
</PRE>
|
|
|
|
<p><li><b>"eq":</b>
|
|
the <code>==</code> operation.
|
|
The function <code>getcomphandler</code> defines how Lua chooses a metamethod
|
|
for comparison operators.
|
|
A metamethod only is selected when both objects
|
|
being compared have the same type
|
|
and the same metamethod for the selected operation.
|
|
<PRE>
|
|
function getcomphandler (op1, op2, event)
|
|
if type(op1) ~= type(op2) then return nil end
|
|
local mm1 = metatable(op1)[event]
|
|
local mm2 = metatable(op2)[event]
|
|
if mm1 == mm2 then return mm1 else return nil end
|
|
end
|
|
</PRE>
|
|
The "eq" event is defined as follows:
|
|
<PRE>
|
|
function eq_event (op1, op2)
|
|
if type(op1) ~= type(op2) then -- different types?
|
|
return false -- different objects
|
|
end
|
|
if op1 == op2 then -- primitive equal?
|
|
return true -- objects are equal
|
|
end
|
|
-- try metamethod
|
|
local h = getcomphandler(op1, op2, "__eq")
|
|
if h then
|
|
return h(op1, op2)
|
|
else
|
|
return false
|
|
end
|
|
end
|
|
</PRE>
|
|
<code>a ~= b</code> is equivalent to <code>not (a == b)</code>.
|
|
|
|
<p><li><b>"lt":</b>
|
|
the <code><</code> operation.
|
|
<PRE>
|
|
function lt_event (op1, op2)
|
|
if type(op1) == "number" and type(op2) == "number" then
|
|
return op1 < op2 -- numeric comparison
|
|
elseif type(op1) == "string" and type(op2) == "string" then
|
|
return op1 < op2 -- lexicographic comparison
|
|
else
|
|
local h = getcomphandler(op1, op2, "__lt")
|
|
if h then
|
|
return h(op1, op2)
|
|
else
|
|
error("...");
|
|
end
|
|
end
|
|
end
|
|
</PRE>
|
|
<code>a > b</code> is equivalent to <code>b < a</code>.
|
|
|
|
<p><li><b>"le":</b>
|
|
the <code><=</code> operation.
|
|
<PRE>
|
|
function le_event (op1, op2)
|
|
if type(op1) == "number" and type(op2) == "number" then
|
|
return op1 <= op2 -- numeric comparison
|
|
elseif type(op1) == "string" and type(op2) == "string" then
|
|
return op1 <= op2 -- lexicographic comparison
|
|
else
|
|
local h = getcomphandler(op1, op2, "__le")
|
|
if h then
|
|
return h(op1, op2)
|
|
else
|
|
h = getcomphandler(op1, op2, "__lt")
|
|
if h then
|
|
return not h(op2, op1)
|
|
else
|
|
error("...");
|
|
end
|
|
end
|
|
end
|
|
end
|
|
</PRE>
|
|
<code>a >= b</code> is equivalent to <code>b <= a</code>.
|
|
Note that, in the absence of a "le" metamethod,
|
|
Lua tries the "lt", assuming that <code>a <= b</code> is
|
|
equivalent to <code>not (b < a)</code>.
|
|
|
|
<p><li><b>"index":</b>
|
|
The indexing access <code>table[key]</code>.
|
|
<PRE>
|
|
function gettable_event (table, key)
|
|
local h
|
|
if type(table) == "table" then
|
|
local v = rawget(table, key)
|
|
if v ~= nil then return v end
|
|
h = metatable(table).__index
|
|
if h == nil then return nil end
|
|
else
|
|
h = metatable(table).__index
|
|
if h == nil then
|
|
error("...");
|
|
end
|
|
end
|
|
if type(h) == "function" then
|
|
return h(table, key) -- call the handler
|
|
else return h[key] -- or repeat operation on it
|
|
end
|
|
</PRE>
|
|
|
|
<p><li><b>"newindex":</b>
|
|
The indexing assignment <code>table[key] = value</code>.
|
|
<PRE>
|
|
function settable_event (table, key, value)
|
|
local h
|
|
if type(table) == "table" then
|
|
local v = rawget(table, key)
|
|
if v ~= nil then rawset(table, key, value); return end
|
|
h = metatable(table).__newindex
|
|
if h == nil then rawset(table, key, value); return end
|
|
else
|
|
h = metatable(table).__newindex
|
|
if h == nil then
|
|
error("...");
|
|
end
|
|
end
|
|
if type(h) == "function" then
|
|
return h(table, key,value) -- call the handler
|
|
else h[key] = value -- or repeat operation on it
|
|
end
|
|
</PRE>
|
|
|
|
<p><li><b>"call":</b>
|
|
called when Lua calls a value.
|
|
<PRE>
|
|
function function_event (func, ...)
|
|
if type(func) == "function" then
|
|
return func(unpack(arg)) -- primitive call
|
|
else
|
|
local h = metatable(func).__call
|
|
if h then
|
|
return h(func, unpack(arg))
|
|
else
|
|
error("...")
|
|
end
|
|
end
|
|
end
|
|
</PRE>
|
|
|
|
<p></ul>
|
|
|
|
<p><a name="GC"><a name="2.9"><h2>2.9 - Garbage Collection</h2></a></a>
|
|
|
|
<p>Lua does automatic memory management.
|
|
That means that
|
|
you do not have to worry about allocating memory for new objects
|
|
and freeing it when the objects are no longer needed.
|
|
Lua manages memory automatically by running
|
|
a <em>garbage collector</em> from time to time
|
|
to collect all <em>dead objects</em>
|
|
(that is, those objects that are no longer accessible from Lua).
|
|
All objects in Lua are subject to automatic management:
|
|
tables, userdata, functions, threads, and strings.
|
|
|
|
<p>Lua uses two numbers to control its garbage-collection cycles.
|
|
One number counts how many bytes of dynamic memory Lua is using;
|
|
the other is a threshold.
|
|
When the number of bytes crosses the threshold,
|
|
Lua runs the garbage collector,
|
|
which reclaims the memory of all dead objects.
|
|
The byte counter is adjusted,
|
|
and then the threshold is reset to twice the new value of the byte counter.
|
|
|
|
<p>Through the C API, you can query those numbers
|
|
and change the threshold (see <a href="#GC-API">3.7</a>).
|
|
Setting the threshold to zero actually forces an immediate
|
|
garbage-collection cycle,
|
|
while setting it to a huge number effectively stops the garbage collector.
|
|
Using Lua code you have a more limited control over garbage-collection cycles,
|
|
through the <code>gcinfo</code> and <code>collectgarbage</code> functions
|
|
(see <a href="#predefined">5.1</a>).
|
|
|
|
<p><a name="2.9.1"><h3>2.9.1 - Garbage-Collection Metamethods</h3></a>
|
|
|
|
<p>Using the C API,
|
|
you can set garbage-collector metamethods for userdata (see <a href="#metatable">2.8</a>).
|
|
These metamethods are also called <em>finalizers</em>.
|
|
Finalizers allow you to coordinate Lua's garbage collection
|
|
with external resource management
|
|
(such as closing files, network or database connections,
|
|
or freeing your own memory).
|
|
|
|
<p>Free userdata with a field <code>__gc</code> in their metatables are not
|
|
collected immediately by the garbage collector.
|
|
Instead, Lua puts them in a list.
|
|
After the collection,
|
|
Lua does the equivalent of the following function
|
|
for each userdata in that list:
|
|
<PRE>
|
|
function gc_event (udata)
|
|
local h = metatable(udata).__gc
|
|
if h then
|
|
h(udata)
|
|
end
|
|
end
|
|
</PRE>
|
|
|
|
<p>At the end of each garbage-collection cycle,
|
|
the finalizers for userdata are called in <em>reverse</em>
|
|
order of their creation,
|
|
among those collected in that cycle.
|
|
That is, the first finalizer to be called is the one associated
|
|
with the userdata created last in the program.
|
|
|
|
<p><a name="weak-table"><a name="2.9.2"><h3>2.9.2 - Weak Tables</h3></a></a>
|
|
|
|
<p>A <em>weak table</em> is a table whose elements are
|
|
<em>weak references</em>.
|
|
A weak reference is ignored by the garbage collector.
|
|
In other words,
|
|
if the only references to an object are weak references,
|
|
then the garbage collector will collect that object.
|
|
|
|
<p>A weak table can have weak keys, weak values, or both.
|
|
A table with weak keys allows the collection of its keys,
|
|
but prevents the collection of its values.
|
|
A table with both weak keys and weak values allows the collection of
|
|
both keys and values.
|
|
In any case, if either the key or the value is collected,
|
|
the whole pair is removed from the table.
|
|
The weakness of a table is controlled by the value of the
|
|
<code>__mode</code> field of its metatable.
|
|
If the <code>__mode</code> field is a string containing the character `<code>k</code>´,
|
|
the keys in the table are weak.
|
|
If <code>__mode</code> contains `<code>v</code>´,
|
|
the values in the table are weak.
|
|
|
|
<p>After you use a table as a metatable,
|
|
you should not change the value of its field <code>__mode</code>.
|
|
Otherwise, the weak behavior of the tables controlled by this
|
|
metatable is undefined.
|
|
|
|
<p><a name="coroutine"><a name="2.10"><h2>2.10 - Coroutines</h2></a></a>
|
|
|
|
<p>Lua supports coroutines,
|
|
also called <em>semi-coroutines</em>
|
|
or <em>collaborative multithreading</em>.
|
|
A coroutine in Lua represents an independent thread of execution.
|
|
Unlike threads in multithread systems, however,
|
|
a coroutine only suspends its execution by explicitly calling
|
|
a yield function.
|
|
|
|
<p>You create a coroutine with a call to <code>coroutine.create</code>.
|
|
Its sole argument is a function
|
|
that is the main function of the coroutine.
|
|
The <code>create</code> function only creates a new coroutine and
|
|
returns a handle to it (an object of type <em>thread</em>);
|
|
it does not start the coroutine execution.
|
|
|
|
<p>When you first call <code>coroutine.resume</code>,
|
|
passing as its first argument the thread returned by <code>coroutine.create</code>,
|
|
the coroutine starts its execution,
|
|
at the first line of its main function.
|
|
Extra arguments passed to <code>coroutine.resume</code> are given as
|
|
parameters for the coroutine main function.
|
|
After the coroutine starts running,
|
|
it runs until it terminates or <em>yields</em>.
|
|
|
|
<p>A coroutine can terminate its execution in two ways:
|
|
Normally, when its main function returns
|
|
(explicitly or implicitly, after the last instruction);
|
|
and abnormally, if there is an unprotected error.
|
|
In the first case, <code>coroutine.resume</code> returns <B>true</B>,
|
|
plus any values returned by the coroutine main function.
|
|
In case of errors, <code>coroutine.resume</code> returns <B>false</B>
|
|
plus an error message.
|
|
|
|
<p>A coroutine yields by calling <code>coroutine.yield</code>.
|
|
When a coroutine yields,
|
|
the corresponding <code>coroutine.resume</code> returns immediately,
|
|
even if the yield happens inside nested function calls
|
|
(that is, not in the main function,
|
|
but in a function directly or indirectly called by the main function).
|
|
In the case of a yield, <code>coroutine.resume</code> also returns <B>true</B>,
|
|
plus any values passed to <code>coroutine.yield</code>.
|
|
The next time you resume the same coroutine,
|
|
it continues its execution from the point where it yielded,
|
|
with the call to <code>coroutine.yield</code> returning any extra
|
|
arguments passed to <code>coroutine.resume</code>.
|
|
|
|
<p>The <code>coroutine.wrap</code> function creates a coroutine
|
|
like <code>coroutine.create</code>,
|
|
but instead of returning the coroutine itself,
|
|
it returns a function that, when called, resumes the coroutine.
|
|
Any arguments passed to that function
|
|
go as extra arguments to resume.
|
|
The function returns all the values returned by resume,
|
|
except the first one (the boolean error code).
|
|
Unlike <code>coroutine.resume</code>,
|
|
this function does not catch errors;
|
|
any error is propagated to the caller.
|
|
|
|
<p>As an example,
|
|
consider the next code:
|
|
<PRE>
|
|
function foo1 (a)
|
|
print("foo", a)
|
|
return coroutine.yield(2*a)
|
|
end
|
|
|
|
co = coroutine.create(function (a,b)
|
|
print("co-body", a, b)
|
|
local r = foo1(a+1)
|
|
print("co-body", r)
|
|
local r, s = coroutine.yield(a+b, a-b)
|
|
print("co-body", r, s)
|
|
return b, "end"
|
|
end)
|
|
|
|
a, b = coroutine.resume(co, 1, 10)
|
|
print("main", a, b)
|
|
a, b, c = coroutine.resume(co, "r")
|
|
print("main", a, b, c)
|
|
a, b, c = coroutine.resume(co, "x", "y")
|
|
print("main", a, b, c)
|
|
a, b = coroutine.resume(co, "x", "y")
|
|
print("main", a, b)
|
|
</PRE>
|
|
When you run it, it produces the following output:
|
|
<PRE>
|
|
co-body 1 10
|
|
foo 2
|
|
main true 4
|
|
co-body r
|
|
main true 11 -9
|
|
co-body x y
|
|
main true 10 end
|
|
main false cannot resume dead coroutine
|
|
</PRE>
|
|
|
|
<p>
|
|
<a name="API"><a name="3"><h1>3 - The Application Program Interface</h1></a></a>
|
|
|
|
|
|
<p>This section describes the C API for Lua, that is,
|
|
the set of C functions available to the host program to communicate
|
|
with Lua.
|
|
All API functions and related types and constants
|
|
are declared in the header file <code>lua.h</code>.
|
|
|
|
<p>Even when we use the term "function",
|
|
any facility in the API may be provided as a <em>macro</em> instead.
|
|
All such macros use each of its arguments exactly once
|
|
(except for the first argument, which is always a Lua state),
|
|
and so do not generate hidden side-effects.
|
|
|
|
<p><a name="mangstate"><a name="3.1"><h2>3.1 - States</h2></a></a>
|
|
|
|
<p>The Lua library is fully reentrant:
|
|
it has no global variables.
|
|
|
|
The whole state of the Lua interpreter
|
|
(global variables, stack, etc.)
|
|
is stored in a dynamically allocated structure of type <code>lua_State</code>.
|
|
|
|
A pointer to this state must be passed as the first argument to
|
|
every function in the library, except to <code>lua_open</code>,
|
|
which creates a Lua state from scratch.
|
|
|
|
<p>Before calling any API function,
|
|
you must create a state by calling <code>lua_open</code>:
|
|
<PRE>
|
|
lua_State *lua_open (void);
|
|
</PRE>
|
|
|
|
|
|
<p>To release a state created with <code>lua_open</code>, call <code>lua_close</code>:
|
|
<PRE>
|
|
void lua_close (lua_State *L);
|
|
</PRE>
|
|
|
|
This function destroys all objects in the given Lua state
|
|
(calling the corresponding garbage-collection metamethods, if any)
|
|
and frees all dynamic memory used by that state.
|
|
On several platforms, you may not need to call this function,
|
|
because all resources are naturally released when the host program ends.
|
|
On the other hand,
|
|
long-running programs,
|
|
such as a daemon or a web server,
|
|
might need to release states as soon as they are not needed,
|
|
to avoid growing too large.
|
|
|
|
<p><a name="3.2"><h2>3.2 - The Stack and Indices</h2></a>
|
|
|
|
<p>Lua uses a <em>virtual stack</em> to pass values to and from C.
|
|
Each element in this stack represents a Lua value
|
|
(<B>nil</B>, number, string, etc.).
|
|
|
|
<p>Whenever Lua calls C, the called function gets a new stack,
|
|
which is independent of previous stacks and of stacks of
|
|
C functions that are still active.
|
|
That stack initially contains any arguments to the C function,
|
|
and it is where the C function pushes its results to be returned to the caller (see <a href="#LuacallC">3.16</a>)
|
|
to be returned to the caller.
|
|
|
|
<p>For convenience,
|
|
most query operations in the API do not follow a strict stack discipline.
|
|
Instead, they can refer to any element in the stack by using an <em>index</em>:
|
|
A positive index represents an <em>absolute</em> stack position
|
|
(starting at 1);
|
|
a negative index represents an <em>offset</em> from the top of the stack.
|
|
More specifically, if the stack has <em>n</em> elements,
|
|
then index 1 represents the first element
|
|
(that is, the element that was pushed onto the stack first)
|
|
and
|
|
index <em>n</em> represents the last element;
|
|
index <em>-1</em> also represents the last element
|
|
(that is, the element at the top)
|
|
and index <em>-n</em> represents the first element.
|
|
We say that an index is <em>valid</em>
|
|
if it lies between 1 and the stack top
|
|
(that is, if <code>1 <= abs(index) <= top</code>).
|
|
|
|
|
|
<p>At any time, you can get the index of the top element by calling
|
|
<code>lua_gettop</code>:
|
|
<PRE>
|
|
int lua_gettop (lua_State *L);
|
|
</PRE>
|
|
Because indices start at 1,
|
|
the result of <code>lua_gettop</code> is equal to the number of elements in the stack
|
|
(and so 0 means an empty stack).
|
|
|
|
<p>When you interact with Lua API,
|
|
<em>you are responsible for controlling stack overflow</em>.
|
|
The function
|
|
<PRE>
|
|
int lua_checkstack (lua_State *L, int extra);
|
|
</PRE>
|
|
|
|
grows the stack size to <code>top + extra</code> elements;
|
|
it returns false if it cannot grow the stack to that size.
|
|
This function never shrinks the stack;
|
|
if the stack is already larger than the new size,
|
|
it is left unchanged.
|
|
|
|
<p>Whenever Lua calls C,
|
|
it ensures that at least <code>LUA_MINSTACK</code> stack positions are available.
|
|
<code>LUA_MINSTACK</code> is defined in <code>lua.h</code> as 20,
|
|
so that usually you do not have to worry about stack space
|
|
unless your code has loops pushing elements onto the stack.
|
|
|
|
<p>Most query functions accept as indices any value inside the
|
|
available stack space, that is, indices up to the maximum stack size
|
|
you have set through <code>lua_checkstack</code>.
|
|
Such indices are called <em>acceptable indices</em>.
|
|
More formally, we define an <em>acceptable index</em>
|
|
as follows:
|
|
<PRE>
|
|
(index < 0 && abs(index) <= top) || (index > 0 && index <= stackspace)
|
|
</PRE>
|
|
Note that 0 is never an acceptable index.
|
|
|
|
<p>Unless otherwise noted,
|
|
any function that accepts valid indices can also be called with
|
|
<em>pseudo-indices</em>,
|
|
which represent some Lua values that are accessible to the C code
|
|
but are not in the stack.
|
|
Pseudo-indices are used to access the global environment,
|
|
the registry, and the upvalues of a C function (see <a href="#c-closure">3.17</a>).
|
|
|
|
<p><a name="3.3"><h2>3.3 - Stack Manipulation</h2></a>
|
|
The API offers the following functions for basic stack manipulation:
|
|
<PRE>
|
|
void lua_settop (lua_State *L, int index);
|
|
void lua_pushvalue (lua_State *L, int index);
|
|
void lua_remove (lua_State *L, int index);
|
|
void lua_insert (lua_State *L, int index);
|
|
void lua_replace (lua_State *L, int index);
|
|
</PRE>
|
|
|
|
|
|
|
|
<p><code>lua_settop</code> accepts any acceptable index,
|
|
or 0,
|
|
and sets the stack top to that index.
|
|
If the new top is larger than the old one,
|
|
then the new elements are filled with <B>nil</B>.
|
|
If <code>index</code> is 0, then all stack elements are removed.
|
|
A useful macro defined in the <code>lua.h</code> is
|
|
<PRE>
|
|
#define lua_pop(L,n) lua_settop(L, -(n)-1)
|
|
</PRE>
|
|
|
|
which pops <code>n</code> elements from the stack.
|
|
|
|
<p><code>lua_pushvalue</code> pushes onto the stack a copy of the element
|
|
at the given index.
|
|
<code>lua_remove</code> removes the element at the given position,
|
|
shifting down the elements above that position to fill the gap.
|
|
<code>lua_insert</code> moves the top element into the given position,
|
|
shifting up the elements above that position to open space.
|
|
<code>lua_replace</code> moves the top element into the given position,
|
|
without shifting any element (therefore replacing the value at
|
|
the given position).
|
|
All these functions accept only valid indices.
|
|
(You cannot call <code>lua_remove</code> or <code>lua_insert</code> with
|
|
pseudo-indices, as they do not represent a stack position.)
|
|
|
|
<p>As an example, if the stack starts as <code>10 20 30 40 50*</code>
|
|
(from bottom to top; the `<code>*</code>´ marks the top),
|
|
then
|
|
<PRE>
|
|
lua_pushvalue(L, 3) --> 10 20 30 40 50 30*
|
|
lua_pushvalue(L, -1) --> 10 20 30 40 50 30 30*
|
|
lua_remove(L, -3) --> 10 20 30 40 30 30*
|
|
lua_remove(L, 6) --> 10 20 30 40 30*
|
|
lua_insert(L, 1) --> 30 10 20 30 40*
|
|
lua_insert(L, -1) --> 30 10 20 30 40* (no effect)
|
|
lua_replace(L, 2) --> 30 40 20 30*
|
|
lua_settop(L, -3) --> 30 40*
|
|
lua_settop(L, 6) --> 30 40 nil nil nil nil*
|
|
</PRE>
|
|
|
|
<p><a name="3.4"><h2>3.4 - Querying the Stack</h2></a>
|
|
|
|
<p>To check the type of a stack element,
|
|
the following functions are available:
|
|
<PRE>
|
|
int lua_type (lua_State *L, int index);
|
|
int lua_isnil (lua_State *L, int index);
|
|
int lua_isboolean (lua_State *L, int index);
|
|
int lua_isnumber (lua_State *L, int index);
|
|
int lua_isstring (lua_State *L, int index);
|
|
int lua_istable (lua_State *L, int index);
|
|
int lua_isfunction (lua_State *L, int index);
|
|
int lua_iscfunction (lua_State *L, int index);
|
|
int lua_isuserdata (lua_State *L, int index);
|
|
int lua_islightuserdata (lua_State *L, int index);
|
|
</PRE>
|
|
|
|
|
|
|
|
|
|
|
|
These functions can be called with any acceptable index.
|
|
|
|
<p><code>lua_type</code> returns the type of a value in the stack,
|
|
or <code>LUA_TNONE</code> for a non-valid index
|
|
(that is, if that stack position is "empty").
|
|
The types returned by <code>lua_type</code> are coded by the following constants
|
|
defined in <code>lua.h</code>:
|
|
<code>LUA_TNIL</code>,
|
|
<code>LUA_TNUMBER</code>,
|
|
<code>LUA_TBOOLEAN</code>,
|
|
<code>LUA_TSTRING</code>,
|
|
<code>LUA_TTABLE</code>,
|
|
<code>LUA_TFUNCTION</code>,
|
|
<code>LUA_TUSERDATA</code>,
|
|
<code>LUA_TTHREAD</code>,
|
|
<code>LUA_TLIGHTUSERDATA</code>.
|
|
The following function translates these constants to strings:
|
|
<PRE>
|
|
const char *lua_typename (lua_State *L, int type);
|
|
</PRE>
|
|
|
|
|
|
<p>The <code>lua_is*</code> functions return 1 if the object is compatible
|
|
with the given type, and 0 otherwise.
|
|
<code>lua_isboolean</code> is an exception to this rule:
|
|
It succeeds only for boolean values
|
|
(otherwise it would be useless,
|
|
as any value has a boolean value).
|
|
They always return 0 for a non-valid index.
|
|
<code>lua_isnumber</code> accepts numbers and numerical strings;
|
|
<code>lua_isstring</code> accepts strings and numbers (see <a href="#coercion">2.2.1</a>);
|
|
<code>lua_isfunction</code> accepts both Lua functions and C functions;
|
|
and <code>lua_isuserdata</code> accepts both full and light userdata.
|
|
To distinguish between Lua functions and C functions,
|
|
you can use <code>lua_iscfunction</code>.
|
|
To distinguish between full and light userdata,
|
|
you can use <code>lua_islightuserdata</code>.
|
|
To distinguish between numbers and numerical strings,
|
|
you can use <code>lua_type</code>.
|
|
|
|
<p>The API also contains functions to compare two values in the stack:
|
|
<PRE>
|
|
int lua_equal (lua_State *L, int index1, int index2);
|
|
int lua_rawequal (lua_State *L, int index1, int index2);
|
|
int lua_lessthan (lua_State *L, int index1, int index2);
|
|
</PRE>
|
|
|
|
<code>lua_equal</code> and <code>lua_lessthan</code>
|
|
are equivalent to their counterparts in Lua (see <a href="#rel-ops">2.5.2</a>).
|
|
<code>lua_rawequal</code> compares the values for primitive equality,
|
|
without metamethods.
|
|
These functions return 0 (false) if any of the indices are non-valid.
|
|
|
|
<p><a name="lua-to"><a name="3.5"><h2>3.5 - Getting Values from the Stack</h2></a></a>
|
|
|
|
<p>To translate a value in the stack to a specific C type,
|
|
you can use the following conversion functions:
|
|
<PRE>
|
|
int lua_toboolean (lua_State *L, int index);
|
|
lua_Number lua_tonumber (lua_State *L, int index);
|
|
const char *lua_tostring (lua_State *L, int index);
|
|
size_t lua_strlen (lua_State *L, int index);
|
|
lua_CFunction lua_tocfunction (lua_State *L, int index);
|
|
void *lua_touserdata (lua_State *L, int index);
|
|
lua_State *lua_tothread (lua_State *L, int index);
|
|
void *lua_topointer (lua_State *L, int index);
|
|
</PRE>
|
|
|
|
|
|
|
|
These functions can be called with any acceptable index.
|
|
When called with a non-valid index,
|
|
they act as if the given value had an incorrect type.
|
|
|
|
<p><code>lua_toboolean</code> converts the Lua value at the given index
|
|
to a C "boolean" value (0 or 1).
|
|
Like all tests in Lua, <code>lua_toboolean</code> returns 1 for any Lua value
|
|
different from <B>false</B> and <B>nil</B>;
|
|
otherwise it returns 0.
|
|
It also returns 0 when called with a non-valid index.
|
|
(If you want to accept only real boolean values,
|
|
use <code>lua_isboolean</code> to test the type of the value.)
|
|
|
|
<p><code>lua_tonumber</code> converts the Lua value at the given index
|
|
to a number (by default, <code>lua_Number</code> is <code>double</code>).
|
|
|
|
The Lua value must be a number or a string convertible to number
|
|
(see <a href="#coercion">2.2.1</a>); otherwise, <code>lua_tonumber</code> returns 0.
|
|
|
|
<p><code>lua_tostring</code> converts the Lua value at the given index to a string
|
|
(<code>const char*</code>).
|
|
The Lua value must be a string or a number;
|
|
otherwise, the function returns <code>NULL</code>.
|
|
If the value is a number,
|
|
then <code>lua_tostring</code> also
|
|
<em>changes the actual value in the stack to a string</em>.
|
|
(This change confuses <code>lua_next</code>
|
|
when <code>lua_tostring</code> is applied to keys.)
|
|
<code>lua_tostring</code> returns a fully aligned pointer
|
|
to a string inside the Lua state.
|
|
This string always has a zero (<code>'\0'</code>)
|
|
after its last character (as in C),
|
|
but may contain other zeros in its body.
|
|
If you do not know whether a string may contain zeros,
|
|
you can use <code>lua_strlen</code> to get its actual length.
|
|
Because Lua has garbage collection,
|
|
there is no guarantee that the pointer returned by <code>lua_tostring</code>
|
|
will be valid after the corresponding value is removed from the stack.
|
|
If you need the string after the current function returns,
|
|
then you should duplicate it or put it into the registry (see <a href="#registry">3.18</a>).
|
|
|
|
<p><code>lua_tocfunction</code> converts a value in the stack to a C function.
|
|
This value must be a C function;
|
|
otherwise, <code>lua_tocfunction</code> returns <code>NULL</code>.
|
|
The type <code>lua_CFunction</code> is explained in <a href="#LuacallC">3.16</a>.
|
|
|
|
<p><code>lua_tothread</code> converts a value in the stack to a Lua thread
|
|
(represented as <code>lua_State *</code>).
|
|
This value must be a thread;
|
|
otherwise, <code>lua_tothread</code> returns <code>NULL</code>.
|
|
|
|
<p><code>lua_topointer</code> converts a value in the stack to a generic
|
|
C pointer (<code>void *</code>).
|
|
The value may be a userdata, a table, a thread, or a function;
|
|
otherwise, <code>lua_topointer</code> returns <code>NULL</code>.
|
|
Lua ensures that different objects of the
|
|
same type return different pointers.
|
|
There is no direct way to convert the pointer back to its original value.
|
|
Typically this function is used for debug information.
|
|
|
|
<p><code>lua_touserdata</code> is explained in <a href="#userdata">3.8</a>.
|
|
|
|
<p><a name="pushing"><a name="3.6"><h2>3.6 - Pushing Values onto the Stack</h2></a></a>
|
|
|
|
<p>The API has the following functions to
|
|
push C values onto the stack:
|
|
<PRE>
|
|
void lua_pushboolean (lua_State *L, int b);
|
|
void lua_pushnumber (lua_State *L, lua_Number n);
|
|
void lua_pushlstring (lua_State *L, const char *s, size_t len);
|
|
void lua_pushstring (lua_State *L, const char *s);
|
|
void lua_pushnil (lua_State *L);
|
|
void lua_pushcfunction (lua_State *L, lua_CFunction f);
|
|
void lua_pushlightuserdata (lua_State *L, void *p);
|
|
</PRE>
|
|
|
|
<p>
|
|
|
|
|
|
These functions receive a C value,
|
|
convert it to a corresponding Lua value,
|
|
and push the result onto the stack.
|
|
In particular, <code>lua_pushlstring</code> and <code>lua_pushstring</code>
|
|
make an internal copy of the given string.
|
|
<code>lua_pushstring</code> can only be used to push proper C strings
|
|
(that is, strings that end with a zero and do not contain embedded zeros);
|
|
otherwise, you should use the more general <code>lua_pushlstring</code>,
|
|
which accepts an explicit size.
|
|
|
|
<p>You can also push "formatted" strings:
|
|
<PRE>
|
|
const char *lua_pushfstring (lua_State *L, const char *fmt, ...);
|
|
const char *lua_pushvfstring (lua_State *L, const char *fmt, va_list argp);
|
|
</PRE>
|
|
|
|
These functions push onto the stack a formatted string
|
|
and return a pointer to that string.
|
|
They are similar to <code>sprintf</code> and <code>vsprintf</code>,
|
|
but with some important differences:
|
|
<ul>
|
|
<li> You do not have to allocate the space for the result:
|
|
The result is a Lua string and Lua takes care of memory allocation
|
|
(and deallocation, through garbage collection).
|
|
<li> The conversion specifiers are quite restricted.
|
|
There are no flags, widths, or precisions.
|
|
The conversion specifiers can be simply
|
|
`<code>%%</code>´ (inserts a `<code>%</code>´ in the string),
|
|
`<code>%s</code>´ (inserts a zero-terminated string, with no size restrictions),
|
|
`<code>%f</code>´ (inserts a <code>lua_Number</code>),
|
|
`<code>%d</code>´ (inserts an <code>int</code>), and
|
|
`<code>%c</code>´ (inserts an <code>int</code> as a character).
|
|
</ul>
|
|
|
|
<p>The function
|
|
<PRE>
|
|
void lua_concat (lua_State *L, int n);
|
|
</PRE>
|
|
|
|
concatenates the <code>n</code> values at the top of the stack,
|
|
pops them, and leaves the result at the top.
|
|
If <code>n</code> is 1, the result is that single string
|
|
(that is, the function does nothing);
|
|
if <code>n</code> is 0, the result is the empty string.
|
|
Concatenation is done following the usual semantics of Lua
|
|
(see <a href="#concat">2.5.4</a>).
|
|
|
|
<p><a name="GC-API"><a name="3.7"><h2>3.7 - Controlling Garbage Collection</h2></a></a>
|
|
|
|
<p>Lua uses two numbers to control its garbage collection:
|
|
the <em>count</em> and the <em>threshold</em> (see <a href="#GC">2.9</a>).
|
|
The first counts the amount of memory in use by Lua;
|
|
when the count reaches the threshold,
|
|
Lua runs its garbage collector.
|
|
After the collection, the count is updated
|
|
and the threshold is set to twice the count value.
|
|
|
|
<p>You can access the current values of these two numbers through the
|
|
following functions:
|
|
<PRE>
|
|
int lua_getgccount (lua_State *L);
|
|
int lua_getgcthreshold (lua_State *L);
|
|
</PRE>
|
|
|
|
Both return their respective values in Kbytes.
|
|
You can change the threshold value with
|
|
<PRE>
|
|
void lua_setgcthreshold (lua_State *L, int newthreshold);
|
|
</PRE>
|
|
|
|
Again, the <code>newthreshold</code> value is given in Kbytes.
|
|
When you call this function,
|
|
Lua sets the new threshold and checks it against the byte counter.
|
|
If the new threshold is less than the byte counter,
|
|
then Lua immediately runs the garbage collector.
|
|
In particular
|
|
<code>lua_setgcthreshold(L,0)</code> forces a garbage collection.
|
|
After the collection,
|
|
a new threshold is set according to the previous rule.
|
|
|
|
<p><a name="userdata"><a name="3.8"><h2>3.8 - Userdata</h2></a></a>
|
|
|
|
<p>Userdata represents C values in Lua.
|
|
Lua supports two types of userdata:
|
|
<em>full userdata</em> and <em>light userdata</em>.
|
|
|
|
<p>A full userdata represents a block of memory.
|
|
It is an object (like a table):
|
|
You must create it, it can have its own metatable,
|
|
and you can detect when it is being collected.
|
|
A full userdata is only equal to itself (under raw equality).
|
|
|
|
<p>A light userdata represents a pointer.
|
|
It is a value (like a number):
|
|
You do not create it, it has no metatables,
|
|
it is not collected (as it was never created).
|
|
A light userdata is equal to "any"
|
|
light userdata with the same C address.
|
|
|
|
<p>In Lua code, there is no way to test whether a userdata is full or light;
|
|
both have type <code>userdata</code>.
|
|
In C code, <code>lua_type</code> returns <code>LUA_TUSERDATA</code> for full userdata,
|
|
and <code>LUA_TLIGHTUSERDATA</code> for light userdata.
|
|
|
|
<p>You can create a new full userdata with the following function:
|
|
<PRE>
|
|
void *lua_newuserdata (lua_State *L, size_t size);
|
|
</PRE>
|
|
|
|
This function allocates a new block of memory with the given size,
|
|
pushes on the stack a new userdata with the block address,
|
|
and returns this address.
|
|
|
|
<p>To push a light userdata into the stack you use
|
|
<code>lua_pushlightuserdata</code> (see <a href="#pushing">3.6</a>).
|
|
|
|
<p><code>lua_touserdata</code> (see <a href="#lua-to">3.5</a>) retrieves the value of a userdata.
|
|
When applied on a full userdata, it returns the address of its block;
|
|
when applied on a light userdata, it returns its pointer;
|
|
when applied on a non-userdata value, it returns <code>NULL</code>.
|
|
|
|
<p>When Lua collects a full userdata,
|
|
it calls the userdata's <code>gc</code> metamethod, if any,
|
|
and then it frees the userdata's corresponding memory.
|
|
|
|
<p><a name="3.9"><h2>3.9 - Metatables</h2></a>
|
|
|
|
<p>The following functions allow you to manipulate the metatables
|
|
of an object:
|
|
<PRE>
|
|
int lua_getmetatable (lua_State *L, int index);
|
|
int lua_setmetatable (lua_State *L, int index);
|
|
</PRE>
|
|
|
|
<code>lua_getmetatable</code> pushes on the stack the metatable of a given object.
|
|
If the index is not valid,
|
|
or if the object does not have a metatable,
|
|
<code>lua_getmetatable</code> returns 0 and pushes nothing on the stack.
|
|
|
|
<p><code>lua_setmetatable</code> pops a table from the stack and
|
|
sets it as the new metatable for the given object.
|
|
<code>lua_setmetatable</code> returns 0 when it cannot
|
|
set the metatable of the given object
|
|
(that is, when the object is neither a userdata nor a table);
|
|
even then it pops the table from the stack.
|
|
|
|
<p><a name="3.10"><h2>3.10 - Loading Lua Chunks</h2></a>
|
|
|
|
<p>You can load a Lua chunk with <code>lua_load</code>:
|
|
<PRE>
|
|
typedef const char * (*lua_Chunkreader)
|
|
(lua_State *L, void *data, size_t *size);
|
|
|
|
int lua_load (lua_State *L, lua_Chunkreader reader, void *data,
|
|
const char *chunkname);
|
|
</PRE>
|
|
|
|
The return values of <code>lua_load</code> are:
|
|
<ul>
|
|
<li> 0 --- no errors;
|
|
<li> <code>LUA_ERRSYNTAX</code> ---
|
|
syntax error during pre-compilation.
|
|
<li> <code>LUA_ERRMEM</code> ---
|
|
memory allocation error.
|
|
</ul>
|
|
If there are no errors,
|
|
<code>lua_load</code> pushes the compiled chunk as a Lua
|
|
function on top of the stack.
|
|
Otherwise, it pushes an error message.
|
|
|
|
<p><code>lua_load</code> automatically detects whether the chunk is text or binary,
|
|
and loads it accordingly (see program <code>luac</code>).
|
|
|
|
<p><code>lua_load</code> uses a user-supplied <em>reader</em> function to read the chunk.
|
|
Everytime it needs another piece of the chunk,
|
|
<code>lua_load</code> calls the reader,
|
|
passing along its <code>data</code> parameter.
|
|
The reader must return a pointer to a block of memory
|
|
with a new piece of the chunk
|
|
and set <code>size</code> to the block size.
|
|
To signal the end of the chunk, the reader returns <code>NULL</code>.
|
|
The reader function may return pieces of any size greater than zero.
|
|
|
|
<p>In the current implementation,
|
|
the reader function cannot call any Lua function;
|
|
to ensure that, it always receives <code>NULL</code> as the Lua state.
|
|
|
|
<p>The <em>chunkname</em> is used for error messages
|
|
and debug information (see <a href="#debugI">4</a>).
|
|
|
|
<p>See the auxiliary library (<code>lauxlib.c</code>)
|
|
for examples of how to use <code>lua_load</code>
|
|
and for some ready-to-use functions to load chunks
|
|
from files and strings.
|
|
|
|
<p><a name="3.11"><h2>3.11 - Manipulating Tables</h2></a>
|
|
|
|
<p>Tables are created by calling
|
|
the function
|
|
<PRE>
|
|
void lua_newtable (lua_State *L);
|
|
</PRE>
|
|
|
|
This function creates a new, empty table and pushes it onto the stack.
|
|
|
|
<p>To read a value from a table that resides somewhere in the stack,
|
|
call
|
|
<PRE>
|
|
void lua_gettable (lua_State *L, int index);
|
|
</PRE>
|
|
|
|
where <code>index</code> points to the table.
|
|
<code>lua_gettable</code> pops a key from the stack
|
|
and returns (on the stack) the contents of the table at that key.
|
|
The table is left where it was in the stack.
|
|
As in Lua, this function may trigger a metamethod
|
|
for the "index" event (see <a href="#metatable">2.8</a>).
|
|
To get the real value of any table key,
|
|
without invoking any metamethod,
|
|
use the <em>raw</em> version:
|
|
<PRE>
|
|
void lua_rawget (lua_State *L, int index);
|
|
</PRE>
|
|
|
|
|
|
<p>To store a value into a table that resides somewhere in the stack,
|
|
you push the key and then the value onto the stack,
|
|
and call
|
|
<PRE>
|
|
void lua_settable (lua_State *L, int index);
|
|
</PRE>
|
|
|
|
where <code>index</code> points to the table.
|
|
<code>lua_settable</code> pops from the stack both the key and the value.
|
|
The table is left where it was in the stack.
|
|
As in Lua, this operation may trigger a metamethod
|
|
for the "settable" or "newindex" events.
|
|
To set the real value of any table index,
|
|
without invoking any metamethod,
|
|
use the <em>raw</em> version:
|
|
<PRE>
|
|
void lua_rawset (lua_State *L, int index);
|
|
</PRE>
|
|
|
|
|
|
<p>You can traverse a table with the function
|
|
<PRE>
|
|
int lua_next (lua_State *L, int index);
|
|
</PRE>
|
|
|
|
where <code>index</code> points to the table to be traversed.
|
|
The function pops a key from the stack,
|
|
and pushes a key-value pair from the table
|
|
(the "next" pair after the given key).
|
|
If there are no more elements, then <code>lua_next</code> returns 0
|
|
(and pushes nothing).
|
|
Use a <B>nil</B> key to signal the start of a traversal.
|
|
|
|
<p>A typical traversal looks like this:
|
|
<PRE>
|
|
/* table is in the stack at index `t' */
|
|
lua_pushnil(L); /* first key */
|
|
while (lua_next(L, t) != 0) {
|
|
/* `key' is at index -2 and `value' at index -1 */
|
|
printf("%s - %s\n",
|
|
lua_typename(L, lua_type(L, -2)), lua_typename(L, lua_type(L, -1)));
|
|
lua_pop(L, 1); /* removes `value'; keeps `key' for next iteration */
|
|
}
|
|
</PRE>
|
|
|
|
<p>While traversing a table,
|
|
do not call <code>lua_tostring</code> directly on a key,
|
|
unless you know that the key is actually a string.
|
|
Recall that <code>lua_tostring</code> <em>changes</em> the value at the given index;
|
|
this confuses the next call to <code>lua_next</code>.
|
|
|
|
<p><a name="globals"><a name="3.12"><h2>3.12 - Manipulating Environments</h2></a></a>
|
|
|
|
<p>All global variables are kept in ordinary Lua tables,
|
|
called environments.
|
|
The initial environment is called the global environment.
|
|
This table is always at pseudo-index <code>LUA_GLOBALSINDEX</code>.
|
|
|
|
<p>To access and change the value of global variables,
|
|
you can use regular table operations over an environment table.
|
|
For instance, to access the value of a global variable, do
|
|
<PRE>
|
|
lua_pushstring(L, varname);
|
|
lua_gettable(L, LUA_GLOBALSINDEX);
|
|
</PRE>
|
|
|
|
<p>You can change the global environment of a Lua thread using <code>lua_replace</code>.
|
|
|
|
<p>The following functions get and set the environment of Lua functions:
|
|
<PRE>
|
|
void lua_getfenv (lua_State *L, int index);
|
|
int lua_setfenv (lua_State *L, int index);
|
|
</PRE>
|
|
|
|
<code>lua_getfenv</code> pushes on the stack the environment table of
|
|
the function at index <code>index</code> in the stack.
|
|
If the function is a C function,
|
|
<code>lua_getfenv</code> pushes the global environment.
|
|
<code>lua_setfenv</code> pops a table from the stack and sets it as
|
|
the new environment for the function at index <code>index</code> in the stack.
|
|
If the object at the given index is not a Lua function,
|
|
<code>lua_setfenv</code> returns 0.
|
|
|
|
<p><a name="3.13"><h2>3.13 - Using Tables as Arrays</h2></a>
|
|
The API has functions that help to use Lua tables as arrays,
|
|
that is,
|
|
tables indexed by numbers only:
|
|
<PRE>
|
|
void lua_rawgeti (lua_State *L, int index, int n);
|
|
void lua_rawseti (lua_State *L, int index, int n);
|
|
</PRE>
|
|
|
|
|
|
|
|
<p><code>lua_rawgeti</code> pushes the value of the <em>n</em>-th element of the table
|
|
at stack position <code>index</code>.
|
|
<code>lua_rawseti</code> sets the value of the <em>n</em>-th element of the table
|
|
at stack position <code>index</code> to the value at the top of the stack,
|
|
removing this value from the stack.
|
|
|
|
<p><a name="3.14"><h2>3.14 - Calling Functions</h2></a>
|
|
|
|
<p>Functions defined in Lua
|
|
and C functions registered in Lua
|
|
can be called from the host program.
|
|
This is done using the following protocol:
|
|
First, the function to be called is pushed onto the stack;
|
|
then, the arguments to the function are pushed
|
|
in <em>direct order</em>, that is, the first argument is pushed first.
|
|
Finally, the function is called using
|
|
<PRE>
|
|
void lua_call (lua_State *L, int nargs, int nresults);
|
|
</PRE>
|
|
|
|
<code>nargs</code> is the number of arguments that you pushed onto the stack.
|
|
All arguments and the function value are popped from the stack,
|
|
and the function results are pushed.
|
|
The number of results are adjusted to <code>nresults</code>,
|
|
unless <code>nresults</code> is <code>LUA_MULTRET</code>.
|
|
In that case, <em>all</em> results from the function are pushed.
|
|
Lua takes care that the returned values fit into the stack space.
|
|
The function results are pushed onto the stack in direct order
|
|
(the first result is pushed first),
|
|
so that after the call the last result is on the top.
|
|
|
|
<p>The following example shows how the host program may do the
|
|
equivalent to this Lua code:
|
|
<PRE>
|
|
a = f("how", t.x, 14)
|
|
</PRE>
|
|
Here it is in C:
|
|
<PRE>
|
|
lua_pushstring(L, "t");
|
|
lua_gettable(L, LUA_GLOBALSINDEX); /* global `t' (for later use) */
|
|
lua_pushstring(L, "a"); /* var name */
|
|
lua_pushstring(L, "f"); /* function name */
|
|
lua_gettable(L, LUA_GLOBALSINDEX); /* function to be called */
|
|
lua_pushstring(L, "how"); /* 1st argument */
|
|
lua_pushstring(L, "x"); /* push the string "x" */
|
|
lua_gettable(L, -5); /* push result of t.x (2nd arg) */
|
|
lua_pushnumber(L, 14); /* 3rd argument */
|
|
lua_call(L, 3, 1); /* call function with 3 arguments and 1 result */
|
|
lua_settable(L, LUA_GLOBALSINDEX); /* set global variable `a' */
|
|
lua_pop(L, 1); /* remove `t' from the stack */
|
|
</PRE>
|
|
Note that the code above is "balanced":
|
|
at its end, the stack is back to its original configuration.
|
|
This is considered good programming practice.
|
|
|
|
<p>(We did this example using only the raw functions provided by Lua's API,
|
|
to show all the details.
|
|
Usually programmers define and use several macros and auxiliary functions
|
|
that provide higher level access to Lua.
|
|
See the source code of the standard libraries for examples.)
|
|
|
|
<p><a name="lua_pcall"><a name="3.15"><h2>3.15 - Protected Calls</h2></a></a>
|
|
|
|
<p>When you call a function with <code>lua_call</code>,
|
|
any error inside the called function is propagated upwards
|
|
(with a <code>longjmp</code>).
|
|
If you need to handle errors,
|
|
then you should use <code>lua_pcall</code>:
|
|
<PRE>
|
|
int lua_pcall (lua_State *L, int nargs, int nresults, int errfunc);
|
|
</PRE>
|
|
Both <code>nargs</code> and <code>nresults</code> have the same meaning as
|
|
in <code>lua_call</code>.
|
|
If there are no errors during the call,
|
|
<code>lua_pcall</code> behaves exactly like <code>lua_call</code>.
|
|
However, if there is any error,
|
|
<code>lua_pcall</code> catches it,
|
|
pushes a single value at the stack (the error message),
|
|
and returns an error code.
|
|
Like <code>lua_call</code>,
|
|
<code>lua_pcall</code> always removes the function
|
|
and its arguments from the stack.
|
|
|
|
<p>If <code>errfunc</code> is 0,
|
|
then the error message returned is exactly the original error message.
|
|
Otherwise, <code>errfunc</code> gives the stack index for an
|
|
<em>error handler function</em>.
|
|
(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 <code>lua_pcall</code>.
|
|
|
|
<p>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 <code>lua_pcall</code>,
|
|
since by then the stack has unwound.
|
|
|
|
<p>The <code>lua_pcall</code> function returns 0 in case of success
|
|
or one of the following error codes
|
|
(defined in <code>lua.h</code>):
|
|
<ul>
|
|
<li> <code>LUA_ERRRUN</code> --- a runtime error.
|
|
<li> <code>LUA_ERRMEM</code> --- memory allocation error.
|
|
For such errors, Lua does not call the error handler function.
|
|
<li> <code>LUA_ERRERR</code> ---
|
|
error while running the error handler function.
|
|
</ul>
|
|
|
|
<p><a name="LuacallC"><a name="3.16"><h2>3.16 - Defining C Functions</h2></a></a>
|
|
|
|
<p>Lua can be extended with functions written in C.
|
|
These functions must be of type <code>lua_CFunction</code>,
|
|
which is defined as
|
|
<PRE>
|
|
typedef int (*lua_CFunction) (lua_State *L);
|
|
</PRE>
|
|
|
|
A C function receives a Lua state and returns an integer,
|
|
the number of values it wants to return to Lua.
|
|
|
|
<p>In order to communicate properly with Lua,
|
|
a C function must follow the following protocol,
|
|
which defines the way parameters and results are passed:
|
|
A C function receives its arguments from Lua in its stack
|
|
in direct order (the first argument is pushed first).
|
|
So, when the function starts,
|
|
its first argument (if any) is at index 1.
|
|
To return values to Lua, a C function just pushes them onto the stack,
|
|
in direct order (the first result is pushed first),
|
|
and returns the number of results.
|
|
Any other value in the stack below the results will be properly
|
|
discharged by Lua.
|
|
Like a Lua function, a C function called by Lua can also return
|
|
many results.
|
|
|
|
<p>As an example, the following function receives a variable number
|
|
of numerical arguments and returns their average and sum:
|
|
<PRE>
|
|
static int foo (lua_State *L) {
|
|
int n = lua_gettop(L); /* number of arguments */
|
|
lua_Number sum = 0;
|
|
int i;
|
|
for (i = 1; i <= n; i++) {
|
|
if (!lua_isnumber(L, i)) {
|
|
lua_pushstring(L, "incorrect argument to function `average'");
|
|
lua_error(L);
|
|
}
|
|
sum += lua_tonumber(L, i);
|
|
}
|
|
lua_pushnumber(L, sum/n); /* first result */
|
|
lua_pushnumber(L, sum); /* second result */
|
|
return 2; /* number of results */
|
|
}
|
|
</PRE>
|
|
|
|
<p>To register a C function to Lua,
|
|
there is the following convenience macro:
|
|
<PRE>
|
|
#define lua_register(L,n,f) \
|
|
(lua_pushstring(L, n), \
|
|
lua_pushcfunction(L, f), \
|
|
lua_settable(L, LUA_GLOBALSINDEX))
|
|
/* lua_State *L; */
|
|
/* const char *n; */
|
|
/* lua_CFunction f; */
|
|
</PRE>
|
|
|
|
which receives the name the function will have in Lua
|
|
and a pointer to the function.
|
|
Thus,
|
|
the C function <code>foo</code> above may be registered in Lua as
|
|
<code>average</code> by calling
|
|
<PRE>
|
|
lua_register(L, "average", foo);
|
|
</PRE>
|
|
|
|
<p><a name="c-closure"><a name="3.17"><h2>3.17 - Defining C Closures</h2></a></a>
|
|
|
|
<p>When a C function is created,
|
|
it is possible to associate some values with it,
|
|
thus creating a <em>C closure</em>;
|
|
these values are then accessible to the function whenever it is called.
|
|
To associate values with a C function,
|
|
first these values should be pushed onto the stack
|
|
(when there are multiple values, the first value is pushed first).
|
|
Then the function
|
|
<PRE>
|
|
void lua_pushcclosure (lua_State *L, lua_CFunction fn, int n);
|
|
</PRE>
|
|
|
|
is used to push the C function onto the stack,
|
|
with the argument <code>n</code> telling how many values should be
|
|
associated with the function
|
|
(<code>lua_pushcclosure</code> also pops these values from the stack);
|
|
in fact, the macro <code>lua_pushcfunction</code> is defined as
|
|
<code>lua_pushcclosure</code> with <code>n</code> set to 0.
|
|
|
|
<p>Then, whenever the C function is called,
|
|
those values are located at specific pseudo-indices.
|
|
Those pseudo-indices are produced by a macro <code>lua_upvalueindex</code>.
|
|
The first value associated with a function is at position
|
|
<code>lua_upvalueindex(1)</code>, and so on.
|
|
Any access to <code>lua_upvalueindex(<em>n</em>)</code>,
|
|
where <em>n</em> is greater than the number of upvalues of the
|
|
current function,
|
|
produces an acceptable (but invalid) index.
|
|
|
|
<p>For examples of C functions and closures,
|
|
see the standard libraries in the official Lua distribution
|
|
(<code>src/lib/*.c</code>).
|
|
|
|
<p><a name="registry"><a name="3.18"><h2>3.18 - Registry</h2></a></a>
|
|
|
|
<p>Lua provides a registry,
|
|
a pre-defined table that can be used by any C code to
|
|
store whatever Lua value it needs to store,
|
|
specially if the C code needs to keep that Lua value
|
|
outside the life span of a C function.
|
|
This table is always located at pseudo-index
|
|
<code>LUA_REGISTRYINDEX</code>.
|
|
Any C library can store data into this table,
|
|
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.
|
|
|
|
<p>The integer keys in the registry are used by the reference mechanism,
|
|
implemented by the auxiliary library,
|
|
and therefore should not be used by other purposes.
|
|
|
|
<p><a name="3.19"><h2>3.19 - Error Handling in C</h2></a>
|
|
|
|
<p>Internally, Lua uses the C <code>longjmp</code> facility to handle errors.
|
|
When Lua faces any error
|
|
(such as memory allocation errors, type errors, syntax errors)
|
|
it <em>raises</em> an error, that is, it does a long jump.
|
|
A <em>protected environment</em> uses <code>setjmp</code>
|
|
to set a recover point;
|
|
any error jumps to the most recent active recover point.
|
|
|
|
<p>If an error happens outside any protected environment,
|
|
Lua calls a <em>panic function</em>
|
|
and then calls <code>exit(EXIT_FAILURE)</code>.
|
|
You can change the panic function with
|
|
<PRE>
|
|
lua_CFunction lua_atpanic (lua_State *L, lua_CFunction panicf);
|
|
</PRE>
|
|
Your new panic function may avoid the application exit by
|
|
never returning (e.g., by doing a long jump).
|
|
Nevertheless, the corresponding Lua state will not be consistent;
|
|
the only safe operation with it is to close it.
|
|
|
|
<p>Almost any function in the API may raise an error,
|
|
for instance due to a memory allocation error.
|
|
The following functions run in protected mode
|
|
(that is, they create a protected environment to run),
|
|
so they never raise an error:
|
|
<code>lua_open</code>, <code>lua_close</code>, <code>lua_load</code>,
|
|
and <code>lua_pcall</code>.
|
|
|
|
<p>There is yet another function that runs a given C function in protected mode:
|
|
<PRE>
|
|
int lua_cpcall (lua_State *L, lua_CFunction func, void *ud);
|
|
</PRE>
|
|
|
|
<code>lua_cpcall</code> calls <code>func</code> in protected mode.
|
|
<code>func</code> starts with only one element in its stack,
|
|
a light userdata containing <code>ud</code>.
|
|
In case of errors,
|
|
<code>lua_cpcall</code> returns the same error codes as <code>lua_pcall</code>
|
|
(see <a href="#lua_pcall">3.15</a>),
|
|
plus the error object on the top of the stack;
|
|
otherwise, it returns zero, and does not change the stack.
|
|
Any value returned by <code>func</code> is discarded.
|
|
|
|
<p>C code can generate a Lua error calling the function
|
|
<PRE>
|
|
void lua_error (lua_State *L);
|
|
</PRE>
|
|
|
|
The error message (which actually can be any type of object)
|
|
must be on the stack top.
|
|
This function does a long jump,
|
|
and therefore never returns.
|
|
|
|
<p><a name="3.20"><h2>3.20 - Threads</h2></a>
|
|
|
|
<p>Lua offers partial support for multiple threads of execution.
|
|
If you have a C library that offers multi-threading,
|
|
then Lua can cooperate with it to implement the equivalent facility in Lua.
|
|
Also, Lua implements its own coroutine system on top of threads.
|
|
The following function creates a new thread in Lua:
|
|
<PRE>
|
|
lua_State *lua_newthread (lua_State *L);
|
|
</PRE>
|
|
|
|
This function pushes the thread on the stack and returns a pointer to
|
|
a <code>lua_State</code> that represents this new thread.
|
|
The new state returned by this function shares with the original state
|
|
all global objects (such as tables),
|
|
but has an independent run-time stack.
|
|
|
|
<p>Each thread has an independent global environment table.
|
|
When you create a thread, this table is the same as that of the given state,
|
|
but you can change each one independently.
|
|
|
|
<p>There is no explicit function to close or to destroy a thread.
|
|
Threads are subject to garbage collection,
|
|
like any Lua object.
|
|
|
|
<p>To manipulate threads as coroutines,
|
|
Lua offers the following functions:
|
|
<PRE>
|
|
int lua_resume (lua_State *L, int narg);
|
|
int lua_yield (lua_State *L, int nresults);
|
|
</PRE>
|
|
|
|
To start a coroutine, you first create a new thread;
|
|
then you push on its stack the body function plus any eventual arguments;
|
|
then you call <code>lua_resume</code>,
|
|
with <code>narg</code> being the number of arguments.
|
|
This call returns when the coroutine suspends or finishes its execution.
|
|
When it returns, the stack contains all values passed to <code>lua_yield</code>,
|
|
or all values returned by the body function.
|
|
<code>lua_resume</code> returns 0 if there are no errors running the coroutine,
|
|
or an error code (see <a href="#lua_pcall">3.15</a>).
|
|
In case of errors,
|
|
the stack contains only the error message.
|
|
To restart a coroutine, you put on its stack only the values to
|
|
be passed as results from <code>yield</code>,
|
|
and then call <code>lua_resume</code>.
|
|
|
|
<p>The <code>lua_yield</code> function can only be called as the
|
|
return expression of a C function, as follows:
|
|
<PRE>
|
|
return lua_yield (L, nresults);
|
|
</PRE>
|
|
When a C function calls <code>lua_yield</code> in that way,
|
|
the running coroutine suspends its execution,
|
|
and the call to <code>lua_resume</code> that started this coroutine returns.
|
|
The parameter <code>nresults</code> is the number of values from the stack
|
|
that are passed as results to <code>lua_resume</code>.
|
|
|
|
<p>To exchange values between different threads,
|
|
you may use <code>lua_xmove</code>:
|
|
<PRE>
|
|
void lua_xmove (lua_State *from, lua_State *to, int n);
|
|
</PRE>
|
|
It pops <code>n</code> values from the stack <code>from</code>,
|
|
and puhses them into the stack <code>to</code>.
|
|
|
|
<p>
|
|
<a name="debugI"><a name="4"><h1>4 - The Debug Interface</h1></a></a>
|
|
|
|
<p>Lua has no built-in debugging facilities.
|
|
Instead, it offers a special interface
|
|
by means of functions and <em>hooks</em>.
|
|
This interface allows the construction of different
|
|
kinds of debuggers, profilers, and other tools
|
|
that need "inside information" from the interpreter.
|
|
|
|
<p><a name="4.1"><h2>4.1 - Stack and Function Information</h2></a>
|
|
|
|
<p>The main function to get information about the interpreter runtime stack is
|
|
<PRE>
|
|
int lua_getstack (lua_State *L, int level, lua_Debug *ar);
|
|
</PRE>
|
|
|
|
This function fills parts of a <code>lua_Debug</code> structure with
|
|
an identification of the <em>activation record</em>
|
|
of the function executing at a given level.
|
|
Level 0 is the current running function,
|
|
whereas level <em>n+1</em> is the function that has called level <em>n</em>.
|
|
When there are no errors, <code>lua_getstack</code> returns 1;
|
|
when called with a level greater than the stack depth,
|
|
it returns 0.
|
|
|
|
<p>The structure <code>lua_Debug</code> is used to carry different pieces of
|
|
information about an active function:
|
|
<PRE>
|
|
typedef struct lua_Debug {
|
|
int event;
|
|
const char *name; /* (n) */
|
|
const char *namewhat; /* (n) `global', `local', `field', `method' */
|
|
const char *what; /* (S) `Lua' function, `C' function, Lua `main' */
|
|
const char *source; /* (S) */
|
|
int currentline; /* (l) */
|
|
int nups; /* (u) number of upvalues */
|
|
int linedefined; /* (S) */
|
|
char short_src[LUA_IDSIZE]; /* (S) */
|
|
|
|
/* private part */
|
|
...
|
|
} lua_Debug;
|
|
</PRE>
|
|
|
|
<code>lua_getstack</code> fills only the private part
|
|
of this structure, for later use.
|
|
To fill the other fields of <code>lua_Debug</code> with useful information,
|
|
call
|
|
<PRE>
|
|
int lua_getinfo (lua_State *L, const char *what, lua_Debug *ar);
|
|
</PRE>
|
|
|
|
This function returns 0 on error
|
|
(for instance, an invalid option in <code>what</code>).
|
|
Each character in the string <code>what</code>
|
|
selects some fields of the structure <code>ar</code> to be filled,
|
|
as indicated by the letter in parentheses in the definition of <code>lua_Debug</code>
|
|
above:
|
|
`<code>S</code>´ fills in the fields <code>source</code>, <code>linedefined</code>,
|
|
and <code>what</code>;
|
|
`<code>l</code>´ fills in the field <code>currentline</code>, etc.
|
|
Moreover, `<code>f</code>´ pushes onto the stack the function that is
|
|
running at the given level.
|
|
|
|
<p>To get information about a function that is not active
|
|
(that is, not in the stack),
|
|
you push it onto the stack
|
|
and start the <code>what</code> string with the character `<code>></code>´.
|
|
For instance, to know in which line a function <code>f</code> was defined,
|
|
you can write
|
|
<PRE>
|
|
lua_Debug ar;
|
|
lua_pushstring(L, "f");
|
|
lua_gettable(L, LUA_GLOBALSINDEX); /* get global `f' */
|
|
lua_getinfo(L, ">S", &ar);
|
|
printf("%d\n", ar.linedefined);
|
|
</PRE>
|
|
The fields of <code>lua_Debug</code> have the following meaning:
|
|
<ul>
|
|
|
|
<p><li><b><code>source</code></b>
|
|
If the function was defined in a string,
|
|
then <code>source</code> is that string.
|
|
If the function was defined in a file,
|
|
then <code>source</code> starts with a `<code>@</code>´ followed by the file name.
|
|
|
|
<p><li><b><code>short_src</code></b>
|
|
A "printable" version of <code>source</code>, to be used in error messages.
|
|
|
|
<p><li><b><code>linedefined</code></b>
|
|
the line number where the definition of the function starts.
|
|
|
|
<p><li><b><code>what</code></b> the string <code>"Lua"</code> if this is a Lua function,
|
|
<code>"C"</code> if this is a C function,
|
|
<code>"main"</code> if this is the main part of a chunk,
|
|
and <code>"tail"</code> if this was a function that did a tail call.
|
|
In the latter case,
|
|
Lua has no other information about this function.
|
|
|
|
<p><li><b><code>currentline</code></b>
|
|
the current line where the given function is executing.
|
|
When no line information is available,
|
|
<code>currentline</code> is set to <em>-1</em>.
|
|
|
|
<p><li><b><code>name</code></b>
|
|
a reasonable name for the given function.
|
|
Because functions in Lua are first class values,
|
|
they do not have a fixed name:
|
|
Some functions may be the value of multiple global variables,
|
|
while others may be stored only in a table field.
|
|
The <code>lua_getinfo</code> 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 <code>name</code> is set to <code>NULL</code>.
|
|
|
|
<p><li><b><code>namewhat</code></b>
|
|
Explains the <code>name</code> field.
|
|
The value of <code>namewhat</code> can be
|
|
<code>"global"</code>, <code>"local"</code>, <code>"method"</code>,
|
|
<code>"field"</code>, or <code>""</code> (the empty string),
|
|
according to how the function was called.
|
|
(Lua uses the empty string when no other option seems to apply.)
|
|
|
|
<p><li><b><code>nups</code></b>
|
|
The number of upvalues of the function.
|
|
|
|
<p></ul>
|
|
|
|
<p><a name="4.2"><h2>4.2 - Manipulating Local Variables and Upvalues</h2></a>
|
|
|
|
<p>For the manipulation of local variables and upvalues,
|
|
the debug interface uses indices:
|
|
The first parameter or local variable has index 1, and so on,
|
|
until the last active local variable.
|
|
Upvalues have no particular order,
|
|
as they are active through the whole function.
|
|
|
|
<p>The following functions allow the manipulation of the
|
|
local variables of a given activation record:
|
|
<PRE>
|
|
const char *lua_getlocal (lua_State *L, const lua_Debug *ar, int n);
|
|
const char *lua_setlocal (lua_State *L, const lua_Debug *ar, int n);
|
|
</PRE>
|
|
|
|
The parameter <code>ar</code> must be a valid activation record that was
|
|
filled by a previous call to <code>lua_getstack</code> or
|
|
given as argument to a hook (see <a href="#sub-hooks">4.3</a>).
|
|
<code>lua_getlocal</code> gets the index <code>n</code> of a local variable,
|
|
pushes the variable's value onto the stack,
|
|
and returns its name.
|
|
<code>lua_setlocal</code> assigns the value at the top of the stack
|
|
to the variable and returns its name.
|
|
Both functions return <code>NULL</code>
|
|
when the index is greater than
|
|
the number of active local variables.
|
|
|
|
<p>The following functions allow the manipulation of the
|
|
upvalues of a given function
|
|
(unlike local variables,
|
|
the upvalues of a function are accessible even when the
|
|
function is not active):
|
|
<PRE>
|
|
const char *lua_getupvalue (lua_State *L, int funcindex, int n);
|
|
const char *lua_setupvalue (lua_State *L, int funcindex, int n);
|
|
</PRE>
|
|
|
|
These functions operate both on Lua functions and on C functions.
|
|
(For Lua functions,
|
|
upvalues are the external local variables that the function uses,
|
|
and that consequently are included in its closure.)
|
|
<code>funcindex</code> points to a function in the stack.
|
|
<code>lua_getpuvalue</code> gets the index <code>n</code> of an upvalue,
|
|
pushes the upvalue's value onto the stack,
|
|
and returns its name.
|
|
<code>lua_setupvalue</code> assigns the value at the top of the stack
|
|
to the upvalue and returns its name.
|
|
Both functions return <code>NULL</code>
|
|
when the index is greater than the number of upvalues.
|
|
For C functions, these functions use the empty string <code>""</code>
|
|
as a name for all upvalues.
|
|
|
|
<p>As an example, the following function lists the names of all
|
|
local variables and upvalues for a function at a given level of the stack:
|
|
<PRE>
|
|
int listvars (lua_State *L, int level) {
|
|
lua_Debug ar;
|
|
int i;
|
|
const char *name;
|
|
if (lua_getstack(L, level, &ar) == 0)
|
|
return 0; /* failure: no such level in the stack */
|
|
i = 1;
|
|
while ((name = lua_getlocal(L, &ar, i++)) != NULL) {
|
|
printf("local %d %s\n", i-1, name);
|
|
lua_pop(L, 1); /* remove variable value */
|
|
}
|
|
lua_getinfo(L, "f", &ar); /* retrieves function */
|
|
i = 1;
|
|
while ((name = lua_getpuvalue(L, -1, i++)) != NULL) {
|
|
printf("upvalue %d %s\n", i-1, name);
|
|
lua_pop(L, 1); /* remove upvalue value */
|
|
}
|
|
return 1;
|
|
}
|
|
</PRE>
|
|
|
|
<p><a name="sub-hooks"><a name="4.3"><h2>4.3 - Hooks</h2></a></a>
|
|
|
|
<p>Lua offers a mechanism of hooks, which are
|
|
user-defined C functions that are called during the program execution.
|
|
A hook may be called in four different events:
|
|
a <em>call</em> event, when Lua calls a function;
|
|
a <em>return</em> event, when Lua returns from a function;
|
|
a <em>line</em> event, when Lua starts executing a new line of code;
|
|
and a <em>count</em> event, which happens every "count" instructions.
|
|
Lua identifies these events with the following constants:
|
|
<code>LUA_HOOKCALL</code>,
|
|
<code>LUA_HOOKRET</code> (or <code>LUA_HOOKTAILRET</code>, see below),
|
|
<code>LUA_HOOKLINE</code>,
|
|
and <code>LUA_HOOKCOUNT</code>.
|
|
|
|
<p>A hook has type <code>lua_Hook</code>, defined as follows:
|
|
<PRE>
|
|
typedef void (*lua_Hook) (lua_State *L, lua_Debug *ar);
|
|
</PRE>
|
|
|
|
You can set the hook with the following function:
|
|
<PRE>
|
|
int lua_sethook (lua_State *L, lua_Hook func, int mask, int count);
|
|
</PRE>
|
|
|
|
<code>func</code> is the hook.
|
|
<code>mask</code> specifies on which events the hook will be called:
|
|
It is formed by a disjunction of the constants
|
|
<code>LUA_MASKCALL</code>,
|
|
<code>LUA_MASKRET</code>,
|
|
<code>LUA_MASKLINE</code>,
|
|
and <code>LUA_MASKCOUNT</code>.
|
|
The <code>count</code> argument is only meaningful when the mask
|
|
includes <code>LUA_MASKCOUNT</code>.
|
|
For each event, the hook is called as explained below:
|
|
<ul>
|
|
<li><b>The call hook</b> is called when the interpreter calls a function.
|
|
The hook is called just after Lua enters the new function.
|
|
<li><b>The return hook</b> is called when the interpreter returns from a function.
|
|
The hook is called just before Lua leaves the function.
|
|
<li><b>The line hook</b> is called when the interpreter is about to
|
|
start the execution of a new line of code,
|
|
or when it jumps back in the code (even to the same line).
|
|
(This event only happens while Lua is executing a Lua function.)
|
|
<li><b>The count hook</b> is called after the interpreter executes every
|
|
<code>count</code> instructions.
|
|
(This event only happens while Lua is executing a Lua function.)
|
|
</ul>
|
|
|
|
<p>A hook is disabled by setting <code>mask</code> to zero.
|
|
|
|
<p>You can get the current hook, the current mask,
|
|
and the current count with the next functions:
|
|
<PRE>
|
|
lua_Hook lua_gethook (lua_State *L);
|
|
int lua_gethookmask (lua_State *L);
|
|
int lua_gethookcount (lua_State *L);
|
|
</PRE>
|
|
|
|
|
|
<p>Whenever a hook is called, its <code>ar</code> argument has its field
|
|
<code>event</code> set to the specific event that triggered the hook.
|
|
Moreover, for line events, the field <code>currentline</code> is also set.
|
|
To get the value of any other field in <code>ar</code>,
|
|
the hook must call <code>lua_getinfo</code>.
|
|
For return events, <code>event</code> may be <code>LUA_HOOKRET</code>,
|
|
the normal value, or <code>LUA_HOOKTAILRET</code>.
|
|
In the latter case, Lua is simulating a return from
|
|
a function that did a tail call;
|
|
in this case, it is useless to call <code>lua_getinfo</code>.
|
|
|
|
<p>While Lua is running a hook, it disables other calls to hooks.
|
|
Therefore, if a hook calls back Lua to execute a function or a chunk,
|
|
that execution occurs without any calls to hooks.
|
|
|
|
<p>
|
|
<a name="libraries"><a name="5"><h1>5 - Standard Libraries</h1></a></a>
|
|
|
|
<p>The standard libraries provide useful functions
|
|
that are implemented directly through the C API.
|
|
Some of these functions provide essential services to the language
|
|
(e.g., <code>type</code> and <code>getmetatable</code>);
|
|
others provide access to "outside" services (e.g., I/O);
|
|
and others could be implemented in Lua itself,
|
|
but are quite useful or have critical performance to
|
|
deserve an implementation in C (e.g., <code>sort</code>).
|
|
|
|
<p>All libraries are implemented through the official C API
|
|
and are provided as separate C modules.
|
|
Currently, Lua has the following standard libraries:
|
|
<ul>
|
|
<li> basic library;
|
|
<li> string manipulation;
|
|
<li> table manipulation;
|
|
<li> mathematical functions (sin, log, etc.);
|
|
<li> input and output;
|
|
<li> operating system facilities;
|
|
<li> debug facilities.
|
|
</ul>
|
|
Except for the basic library,
|
|
each library provides all its functions as fields of a global table
|
|
or as methods of its objects.
|
|
|
|
<p>To have access to these libraries,
|
|
the C host program must first call the functions
|
|
<code>luaopen_base</code> (for the basic library),
|
|
<code>luaopen_string</code> (for the string library),
|
|
<code>luaopen_table</code> (for the table library),
|
|
<code>luaopen_math</code> (for the mathematical library),
|
|
<code>luaopen_io</code> (for the I/O and the Operating System libraries),
|
|
and <code>luaopen_debug</code> (for the debug library).
|
|
These functions are declared in <code>lualib.h</code>.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<p><a name="predefined"><a name="5.1"><h2>5.1 - Basic Functions</h2></a></a>
|
|
|
|
<p>The basic library provides some core functions to Lua.
|
|
If you do not include this library in your application,
|
|
you should check carefully whether you need to provide some alternative
|
|
implementation for some of its facilities.
|
|
|
|
<p><h3><code>assert (v [, message])</code></h3>
|
|
Issues an error when
|
|
the value of its argument <code>v</code> is <B>nil</B> or <B>false</B>;
|
|
otherwise, returns this value.
|
|
<code>message</code> is an error message;
|
|
when absent, it defaults to "assertion failed!"
|
|
|
|
<p><h3><code>collectgarbage ([limit])</code></h3>
|
|
|
|
<p>Sets the garbage-collection threshold to the given limit
|
|
(in Kbytes) and checks it against the byte counter.
|
|
If the new threshold is smaller than the byte counter,
|
|
then Lua immediately runs the garbage collector (see <a href="#GC">2.9</a>).
|
|
If <code>limit</code> is absent, it defaults to zero
|
|
(thus forcing a garbage-collection cycle).
|
|
|
|
<p><h3><code>dofile (filename)</code></h3>
|
|
Opens the named file and executes its contents as a Lua chunk.
|
|
When called without arguments,
|
|
<code>dofile</code> executes the contents of the standard input (<code>stdin</code>).
|
|
Returns any value returned by the chunk.
|
|
In case of errors, <code>dofile</code> propagates the error
|
|
to its caller (that is, it does not run in protected mode).
|
|
|
|
<p><a name="pdf-error"><h3><code>error (message [, level])</code></h3></a>
|
|
|
|
Terminates the last protected function called
|
|
and returns <code>message</code> as the error message.
|
|
Function <code>error</code> never returns.
|
|
|
|
<p>The <code>level</code> argument specifies where the error
|
|
message points the error.
|
|
With level 1 (the default), the error position is where the
|
|
<code>error</code> function was called.
|
|
Level 2 points the error to where the function
|
|
that called <code>error</code> was called; and so on.
|
|
|
|
<p><h3><code>_G</code></h3>
|
|
A global variable (not a function) that
|
|
holds the global environment (that is, <code>_G._G = _G</code>).
|
|
Lua itself does not use this variable;
|
|
changing its value does not affect any environment.
|
|
(Use <code>setfenv</code> to change environments.)
|
|
|
|
<p><h3><code>getfenv (f)</code></h3>
|
|
Returns the current environment in use by the function.
|
|
<code>f</code> can be a Lua function or a number,
|
|
which specifies the function at that stack level:
|
|
Level 1 is the function calling <code>getfenv</code>.
|
|
If the given function is not a Lua function,
|
|
or if <code>f</code> is 0,
|
|
<code>getfenv</code> returns the global environment.
|
|
The default for <code>f</code> is 1.
|
|
|
|
<p>If the environment has a <code>"__fenv"</code> field,
|
|
returns the associated value, instead of the environment.
|
|
|
|
<p><a name="pdf-getmetatable"><h3><code>getmetatable (object)</code></h3></a>
|
|
|
|
|
|
<p>If the object does not have a metatable, returns <B>nil</B>.
|
|
Otherwise,
|
|
if the object's metatable has a <code>"__metatable"</code> field,
|
|
returns the associated value.
|
|
Otherwise, returns the metatable of the given object.
|
|
|
|
<p><h3><code>gcinfo ()</code></h3>
|
|
|
|
<p>Returns two results:
|
|
the number of Kbytes of dynamic memory that Lua is using
|
|
and the current garbage collector threshold (also in Kbytes).
|
|
|
|
<p><h3><code>ipairs (t)</code></h3>
|
|
|
|
<p>Returns an iterator function, the table <code>t</code>, and 0,
|
|
so that the construction
|
|
<PRE>
|
|
for i,v in ipairs(t) do ... end
|
|
</PRE>
|
|
will iterate over the pairs (<code>1,t[1]</code>), (<code>2,t[2]</code>), ...,
|
|
up to the first integer key with a nil value in the table.
|
|
|
|
<p><h3><code>loadfile (filename)</code></h3>
|
|
|
|
<p>Loads a file as a Lua chunk (without running it).
|
|
If there are no errors,
|
|
returns the compiled chunk as a function;
|
|
otherwise, returns <B>nil</B> plus the error message.
|
|
The environment of the returned function is the global environment.
|
|
|
|
<p><h3><code>loadlib (libname, funcname)</code></h3>
|
|
|
|
<p>Links the program with the dynamic C library <code>libname</code>.
|
|
Inside this library, looks for a function <code>funcname</code>
|
|
and returns this function as a C function.
|
|
|
|
<p><code>libname</code> must be the complete file name of the C library,
|
|
including any eventual path and extension.
|
|
|
|
<p>This function is not supported by ANSI C.
|
|
As such, it is only available on some platforms
|
|
(Windows, Linux, Solaris, BSD, plus other Unix systems that
|
|
support the <code>dlfcn</code> standard).
|
|
|
|
<p><h3><code>loadstring (string [, chunkname])</code></h3>
|
|
Loads a string as a Lua chunk (without running it).
|
|
If there are no errors,
|
|
returns the compiled chunk as a function;
|
|
otherwise, returns <B>nil</B> plus the error message.
|
|
The environment of the returned function is the global environment.
|
|
|
|
<p>The optional parameter <code>chunkname</code>
|
|
is the name to be used in error messages and debug information.
|
|
|
|
<p>To load and run a given string, use the idiom
|
|
<PRE>
|
|
assert(loadstring(s))()
|
|
</PRE>
|
|
|
|
<p><h3><code>next (table [, index])</code></h3>
|
|
Allows a program to traverse all fields of a table.
|
|
Its first argument is a table and its second argument
|
|
is an index in this table.
|
|
<code>next</code> returns the next index of the table and the
|
|
value associated with the index.
|
|
When called with <B>nil</B> as its second argument,
|
|
<code>next</code> returns the first index
|
|
of the table and its associated value.
|
|
When called with the last index,
|
|
or with <B>nil</B> in an empty table,
|
|
<code>next</code> returns <B>nil</B>.
|
|
If the second argument is absent, then it is interpreted as <B>nil</B>.
|
|
|
|
<p>Lua has no declaration of fields;
|
|
There is no difference between a
|
|
field not present in a table or a field with value <B>nil</B>.
|
|
Therefore, <code>next</code> only considers fields with non-<B>nil</B> values.
|
|
The order in which the indices are enumerated is not specified,
|
|
<em>even for numeric indices</em>.
|
|
(To traverse a table in numeric order,
|
|
use a numerical <b>for</b> or the <code>ipairs</code> function.)
|
|
|
|
<p>The behavior of <code>next</code> is <em>undefined</em> if,
|
|
during the traversal,
|
|
you assign any value to a non-existent field in the table.
|
|
|
|
<p><h3><code>pairs (t)</code></h3>
|
|
|
|
<p>Returns the <code>next</code> function and the table <code>t</code> (plus a <B>nil</B>),
|
|
so that the construction
|
|
<PRE>
|
|
for k,v in pairs(t) do ... end
|
|
</PRE>
|
|
will iterate over all key-value pairs of table <code>t</code>.
|
|
|
|
<p><a name="pdf-pcall"><h3><code>pcall (f, arg1, arg2, ...)</code></h3></a>
|
|
|
|
<p>Calls function <code>f</code> with
|
|
the given arguments in protected mode.
|
|
That means that any error inside <code>f</code> is not propagated;
|
|
instead, <code>pcall</code> catches the error
|
|
and returns a status code.
|
|
Its first result is the status code (a boolean),
|
|
which is <B>true</B> if the call succeeds without errors.
|
|
In such case, <code>pcall</code> also returns all results from the call,
|
|
after this first result.
|
|
In case of any error, <code>pcall</code> returns <B>false</B> plus the error message.
|
|
|
|
<p><h3><code>print (e1, e2, ...)</code></h3>
|
|
Receives any number of arguments,
|
|
and prints their values in <code>stdout</code>,
|
|
using the <code>tostring</code> function to convert them to strings.
|
|
This function is not intended for formatted output,
|
|
but only as a quick way to show a value,
|
|
typically for debugging.
|
|
For formatted output, use <code>format</code> (see <a href="#format">5.3</a>).
|
|
|
|
<p><h3><code>rawequal (v1, v2)</code></h3>
|
|
Checks whether <code>v1</code> is equal to <code>v2</code>,
|
|
without invoking any metamethod.
|
|
Returns a boolean.
|
|
|
|
<p><h3><code>rawget (table, index)</code></h3>
|
|
Gets the real value of <code>table[index]</code>,
|
|
without invoking any metamethod.
|
|
<code>table</code> must be a table;
|
|
<code>index</code> is any value different from <B>nil</B>.
|
|
|
|
<p><h3><code>rawset (table, index, value)</code></h3>
|
|
Sets the real value of <code>table[index]</code> to <code>value</code>,
|
|
without invoking any metamethod.
|
|
<code>table</code> must be a table,
|
|
<code>index</code> is any value different from <B>nil</B>,
|
|
and <code>value</code> is any Lua value.
|
|
|
|
<p><h3><code>require (packagename)</code></h3>
|
|
|
|
<p>Loads the given package.
|
|
The function starts by looking into the table <code>_LOADED</code>
|
|
to determine whether <code>packagename</code> is already loaded.
|
|
If it is, then <code>require</code> returns the value that the package
|
|
returned when it was first loaded.
|
|
Otherwise, it searches a path looking for a file to load.
|
|
|
|
<p>If the global variable <code>LUA_PATH</code> is a string,
|
|
this string is the path.
|
|
Otherwise, <code>require</code> tries the environment variable <code>LUA_PATH</code>.
|
|
As a last resort, it uses the predefined path <code>"?;?.lua"</code>.
|
|
|
|
<p>The path is a sequence of <em>templates</em> separated by semicolons.
|
|
For each template, <code>require</code> will change each interrogation
|
|
mark in the template to <code>packagename</code>,
|
|
and then will try to load the resulting file name.
|
|
So, for instance, if the path is
|
|
<PRE>
|
|
"./?.lua;./?.lc;/usr/local/?/?.lua;/lasttry"
|
|
</PRE>
|
|
a <code>require "mod"</code> will try to load the files
|
|
<code>./mod.lua</code>,
|
|
<code>./mod.lc</code>,
|
|
<code>/usr/local/mod/mod.lua</code>,
|
|
and <code>/lasttry</code>, in that order.
|
|
|
|
<p>The function stops the search as soon as it can load a file,
|
|
and then it runs the file.
|
|
After that, it associates, in table <code>_LOADED</code>,
|
|
the package name with the value that the package returned,
|
|
and returns that value.
|
|
If the package returns <B>nil</B> (or no value),
|
|
<code>require</code> converts this value to <B>true</B>.
|
|
If the package returns <B>false</B>,
|
|
<code>require</code> also returns <B>false</B>.
|
|
However, as the mark in table <code>_LOADED</code> is <B>false</B>,
|
|
any new attempt to reload the file
|
|
will happen as if the package was not loaded
|
|
(that is, the package will be loaded again).
|
|
|
|
<p>If there is any error loading or running the file,
|
|
or if it cannot find any file in the path,
|
|
then <code>require</code> signals an error.
|
|
|
|
<p>While running a file,
|
|
<code>require</code> defines the global variable <code>_REQUIREDNAME</code>
|
|
with the package name.
|
|
The package being loaded always runs within the global environment.
|
|
|
|
<p><a name="setfenv"><h3><code>setfenv (f, table)</code></h3></a>
|
|
|
|
<p>Sets the current environment to be used by the given function.
|
|
<code>f</code> can be a Lua function or a number,
|
|
which specifies the function at that stack level:
|
|
Level 1 is the function calling <code>setfenv</code>.
|
|
|
|
<p>As a special case, when <code>f</code> is 0 <code>setfenv</code> changes
|
|
the global environment of the running thread.
|
|
|
|
<p>If the original environment has a <code>"__fenv"</code> field,
|
|
<code>setfenv</code> raises an error.
|
|
|
|
<p><h3><code>setmetatable (table, metatable)</code></h3>
|
|
|
|
<p>Sets the metatable for the given table.
|
|
(You cannot change the metatable of a userdata from Lua.)
|
|
If <code>metatable</code> is <B>nil</B>, removes the metatable of the given table.
|
|
If the original metatable has a <code>"__metatable"</code> field,
|
|
raises an error.
|
|
|
|
<p><h3><code>tonumber (e [, base])</code></h3>
|
|
Tries to convert its argument to a number.
|
|
If the argument is already a number or a string convertible
|
|
to a number, then <code>tonumber</code> returns that number;
|
|
otherwise, it returns <B>nil</B>.
|
|
|
|
<p>An optional argument specifies the base to interpret the numeral.
|
|
The base may be any integer between 2 and 36, inclusive.
|
|
In bases above 10, the letter `<code>A</code>´ (in either upper or lower case)
|
|
represents 10, `<code>B</code>´ represents 11, and so forth,
|
|
with `<code>Z</code>´ representing 35.
|
|
In base 10 (the default), the number may have a decimal part,
|
|
as well as an optional exponent part (see <a href="#coercion">2.2.1</a>).
|
|
In other bases, only unsigned integers are accepted.
|
|
|
|
<p><h3><code>tostring (e)</code></h3>
|
|
Receives an argument of any type and
|
|
converts it to a string in a reasonable format.
|
|
For complete control of how numbers are converted,
|
|
use <code>format</code> (see <a href="#format">5.3</a>).
|
|
|
|
<p>If the metatable of <code>e</code> has a <code>"__tostring"</code> field,
|
|
<code>tostring</code> calls the corresponding value
|
|
with <code>e</code> as argument,
|
|
and uses the result of the call as its result.
|
|
|
|
<p><a name="pdf-type"><h3><code>type (v)</code></h3></a>
|
|
Returns the type of its only argument, coded as a string.
|
|
The possible results of this function are
|
|
<code>"nil"</code> (a string, not the value <B>nil</B>),
|
|
<code>"number"</code>,
|
|
<code>"string"</code>,
|
|
<code>"boolean</code>,
|
|
<code>"table"</code>,
|
|
<code>"function"</code>,
|
|
<code>"thread"</code>,
|
|
and <code>"userdata"</code>.
|
|
|
|
<p><h3><code>unpack (list)</code></h3>
|
|
Returns all elements from the given list.
|
|
This function is equivalent to
|
|
<PRE>
|
|
return list[1], list[2], ..., list[n]
|
|
</PRE>
|
|
except that the above code can be written only for a fixed <em>n</em>.
|
|
The number <em>n</em> is the size of the list,
|
|
as defined for the <code>table.getn</code> function.
|
|
|
|
<p><h3><code>_VERSION</code></h3>
|
|
A global variable (not a function) that
|
|
holds a string containing the current interpreter version.
|
|
The current content of this string is <code>"Lua 5.0"</code>.
|
|
|
|
<p><h3><code>xpcall (f, err)</code></h3>
|
|
|
|
<p>This function is similar to <code>pcall</code>,
|
|
except that you can set a new error handler.
|
|
|
|
<p><code>xpcall</code> calls function <code>f</code> in protected mode,
|
|
using <code>err</code> as the error handler.
|
|
Any error inside <code>f</code> is not propagated;
|
|
instead, <code>xpcall</code> catches the error,
|
|
calls the <code>err</code> function with the original error object,
|
|
and returns a status code.
|
|
Its first result is the status code (a boolean),
|
|
which is true if the call succeeds without errors.
|
|
In such case, <code>xpcall</code> also returns all results from the call,
|
|
after this first result.
|
|
In case of any error,
|
|
<code>xpcall</code> returns false plus the result from <code>err</code>.
|
|
|
|
<p><a name="5.2"><h2>5.2 - Coroutine Manipulation</h2></a>
|
|
|
|
<p>The operations related to coroutines comprise a sub-library of
|
|
the basic library and come inside the table <code>coroutine</code>.
|
|
See <a href="#coroutine">2.10</a> for a general description of coroutines.
|
|
|
|
<p><h3><code>coroutine.create (f)</code></h3>
|
|
|
|
<p>Creates a new coroutine, with body <code>f</code>.
|
|
<code>f</code> must be a Lua function.
|
|
Returns this new coroutine,
|
|
an object with type <code>"thread"</code>.
|
|
|
|
<p><h3><code>coroutine.resume (co, val1, ...)</code></h3>
|
|
|
|
<p>Starts or continues the execution of coroutine <code>co</code>.
|
|
The first time you resume a coroutine,
|
|
it starts running its body.
|
|
The arguments <code>val1</code>, ... go as the arguments to the body function.
|
|
If the coroutine has yielded,
|
|
<code>resume</code> restarts it;
|
|
the arguments <code>val1</code>, ... go as the results from the yield.
|
|
|
|
<p>If the coroutine runs without any errors,
|
|
<code>resume</code> returns <B>true</B> plus any values passed to <code>yield</code>
|
|
(if the coroutine yields) or any values returned by the body function
|
|
(if the coroutine terminates).
|
|
If there is any error,
|
|
<code>resume</code> returns <B>false</B> plus the error message.
|
|
|
|
<p><h3><code>coroutine.status (co)</code></h3>
|
|
|
|
<p>Returns the status of coroutine <code>co</code>, as a string:
|
|
<code>"running"</code>,
|
|
if the coroutine is running (that is, it called <code>status</code>);
|
|
<code>"suspended"</code>, if the coroutine is suspended in a call to <code>yield</code>,
|
|
or if it has not started running yet;
|
|
and <code>"dead"</code> if the coroutine has finished its body function,
|
|
or if it has stopped with an error.
|
|
|
|
<p><h3><code>coroutine.wrap (f)</code></h3>
|
|
|
|
<p>Creates a new coroutine, with body <code>f</code>.
|
|
<code>f</code> must be a Lua function.
|
|
Returns a function that resumes the coroutine each time it is called.
|
|
Any arguments passed to the function behave as the
|
|
extra arguments to <code>resume</code>.
|
|
Returns the same values returned by <code>resume</code>,
|
|
except the first boolean.
|
|
In case of error, propagates the error.
|
|
|
|
<p><h3><code>coroutine.yield (val1, ...)</code></h3>
|
|
|
|
<p>Suspends the execution of the calling coroutine.
|
|
The coroutine cannot be running neither a C function,
|
|
nor a metamethod, nor an iterator.
|
|
Any arguments to <code>yield</code> go as extra results to <code>resume</code>.
|
|
|
|
<p><a name="5.3"><h2>5.3 - String Manipulation</h2></a>
|
|
This library provides generic functions for string manipulation,
|
|
such as finding and extracting substrings, and pattern matching.
|
|
When indexing a string in Lua, the first character is at position 1
|
|
(not at 0, as in C).
|
|
Indices are allowed to be negative and are interpreted as indexing backwards,
|
|
from the end of the string.
|
|
Thus, the last character is at position <em>-1</em>, and so on.
|
|
|
|
<p>The string library provides all its functions inside the table
|
|
<code>string</code>.
|
|
|
|
<p><h3><code>string.byte (s [, i])</code></h3>
|
|
Returns the internal numerical code of the <code>i</code>-th character of <code>s</code>,
|
|
or <B>nil</B> if the index is out of range.
|
|
If <code>i</code> is absent, then it is assumed to be 1.
|
|
<code>i</code> may be negative.
|
|
|
|
<p>Note that numerical codes are not necessarily portable across platforms.
|
|
|
|
<p><h3><code>string.char (i1, i2, ...)</code></h3>
|
|
Receives 0 or more integers.
|
|
Returns a string with length equal to the number of arguments,
|
|
in which each character has the internal numerical code equal
|
|
to its correspondent argument.
|
|
|
|
<p>Note that numerical codes are not necessarily portable across platforms.
|
|
|
|
<p><h3><code>string.dump (function)</code></h3>
|
|
|
|
<p>Returns a binary representation of the given function,
|
|
so that a later <code>loadstring</code> on that string returns
|
|
a copy of the function.
|
|
<code>function</code> must be a Lua function without upvalues.
|
|
|
|
<p><h3><code>string.find (s, pattern [, init [, plain]])</code></h3>
|
|
Looks for the first <em>match</em> of
|
|
<code>pattern</code> in the string <code>s</code>.
|
|
If it finds one, then <code>find</code> returns the indices of <code>s</code>
|
|
where this occurrence starts and ends;
|
|
otherwise, it returns <B>nil</B>.
|
|
If the pattern specifies captures (see <code>string.gsub</code> below),
|
|
the captured strings are returned as extra results.
|
|
A third, optional numerical argument <code>init</code> specifies
|
|
where to start the search;
|
|
its default value is 1 and may be negative.
|
|
A value of <B>true</B> as a fourth, optional argument <code>plain</code>
|
|
turns off the pattern matching facilities,
|
|
so the function does a plain "find substring" operation,
|
|
with no characters in <code>pattern</code> being considered "magic".
|
|
Note that if <code>plain</code> is given, then <code>init</code> must be given too.
|
|
|
|
<p><h3><code>string.len (s)</code></h3>
|
|
Receives a string and returns its length.
|
|
The empty string <code>""</code> has length 0.
|
|
Embedded zeros are counted,
|
|
so <code>"a\000b\000c"</code> has length 5.
|
|
|
|
<p><h3><code>string.lower (s)</code></h3>
|
|
Receives a string and returns a copy of that string with all
|
|
uppercase letters changed to lowercase.
|
|
All other characters are left unchanged.
|
|
The definition of what is an uppercase letter depends on the current locale.
|
|
|
|
<p><h3><code>string.rep (s, n)</code></h3>
|
|
Returns a string that is the concatenation of <code>n</code> copies of
|
|
the string <code>s</code>.
|
|
|
|
<p><h3><code>string.sub (s, i [, j])</code></h3>
|
|
Returns the substring of <code>s</code> that
|
|
starts at <code>i</code> and continues until <code>j</code>;
|
|
<code>i</code> and <code>j</code> may be negative.
|
|
If <code>j</code> is absent, then it is assumed to be equal to <em>-1</em>
|
|
(which is the same as the string length).
|
|
In particular,
|
|
the call <code>string.sub(s,1,j)</code> returns a prefix of <code>s</code>
|
|
with length <code>j</code>,
|
|
and <code>string.sub(s, -i)</code> returns a suffix of <code>s</code>
|
|
with length <code>i</code>.
|
|
|
|
<p><h3><code>string.upper (s)</code></h3>
|
|
Receives a string and returns a copy of that string with all
|
|
lowercase letters changed to uppercase.
|
|
All other characters are left unchanged.
|
|
The definition of what is a lowercase letter depends on the current locale.
|
|
|
|
<p><a name="format"><h3><code>string.format (formatstring, e1, e2, ...)</code></h3></a>
|
|
|
|
Returns a formatted version of its variable number of arguments
|
|
following the description given in its first argument (which must be a string).
|
|
The format string follows the same rules as the <code>printf</code> family of
|
|
standard C functions.
|
|
The only differences are that the options/modifiers
|
|
<code>*</code>, <code>l</code>, <code>L</code>, <code>n</code>, <code>p</code>,
|
|
and <code>h</code> are not supported,
|
|
and there is an extra option, <code>q</code>.
|
|
The <code>q</code> option formats a string in a form suitable to be safely read
|
|
back by the Lua interpreter:
|
|
The string is written between double quotes,
|
|
and all double quotes, newlines, and backslashes in the string
|
|
are correctly escaped when written.
|
|
For instance, the call
|
|
<PRE>
|
|
string.format('%q', 'a string with "quotes" and \n new line')
|
|
</PRE>
|
|
will produce the string:
|
|
<PRE>
|
|
"a string with \"quotes\" and \
|
|
new line"
|
|
</PRE>
|
|
|
|
<p>The options <code>c</code>, <code>d</code>, <code>E</code>, <code>e</code>, <code>f</code>,
|
|
<code>g</code>, <code>G</code>, <code>i</code>, <code>o</code>, <code>u</code>, <code>X</code>, and <code>x</code> all
|
|
expect a number as argument,
|
|
whereas <code>q</code> and <code>s</code> expect a string.
|
|
The <code>*</code> modifier can be simulated by building
|
|
the appropriate format string.
|
|
For example, <code>"%*g"</code> can be simulated with
|
|
<code>"%"..width.."g"</code>.
|
|
|
|
<p>String values to be formatted with
|
|
<code>%s</code> cannot contain embedded zeros.
|
|
|
|
<p><h3><code>string.gfind (s, pat)</code></h3>
|
|
|
|
<p>Returns an iterator function that,
|
|
each time it is called,
|
|
returns the next captures from pattern <code>pat</code> over string <code>s</code>.
|
|
|
|
<p>If <code>pat</code> specifies no captures,
|
|
then the whole match is produced in each call.
|
|
|
|
<p>As an example, the following loop
|
|
<PRE>
|
|
s = "hello world from Lua"
|
|
for w in string.gfind(s, "%a+") do
|
|
print(w)
|
|
end
|
|
</PRE>
|
|
will iterate over all the words from string <code>s</code>,
|
|
printing one per line.
|
|
The next example collects all pairs <code>key=value</code> from the
|
|
given string into a table:
|
|
<PRE>
|
|
t = {}
|
|
s = "from=world, to=Lua"
|
|
for k, v in string.gfind(s, "(%w+)=(%w+)") do
|
|
t[k] = v
|
|
end
|
|
</PRE>
|
|
|
|
<p><h3><code>string.gsub (s, pat, repl [, n])</code></h3>
|
|
|
|
Returns a copy of <code>s</code>
|
|
in which all occurrences of the pattern <code>pat</code> have been
|
|
replaced by a replacement string specified by <code>repl</code>.
|
|
<code>gsub</code> also returns, as a second value,
|
|
the total number of substitutions made.
|
|
|
|
<p>If <code>repl</code> is a string, then its value is used for replacement.
|
|
Any sequence in <code>repl</code> of the form <code>%</code><em>n</em>,
|
|
with <em>n</em> between 1 and 9,
|
|
stands for the value of the <em>n</em>-th captured substring (see below).
|
|
|
|
<p>If <code>repl</code> is a function, then this function is called every time a
|
|
match occurs, with all captured substrings passed as arguments,
|
|
in order;
|
|
if the pattern specifies no captures,
|
|
then the whole match is passed as a sole argument.
|
|
If the value returned by this function is a string,
|
|
then it is used as the replacement string;
|
|
otherwise, the replacement string is the empty string.
|
|
|
|
<p>The optional last parameter <code>n</code> limits
|
|
the maximum number of substitutions to occur.
|
|
For instance, when <code>n</code> is 1 only the first occurrence of
|
|
<code>pat</code> is replaced.
|
|
|
|
<p>Here are some examples:
|
|
<PRE>
|
|
x = string.gsub("hello world", "(%w+)", "%1 %1")
|
|
--> x="hello hello world world"
|
|
|
|
x = string.gsub("hello world", "(%w+)", "%1 %1", 1)
|
|
--> x="hello hello world"
|
|
|
|
x = string.gsub("hello world from Lua", "(%w+)%s*(%w+)", "%2 %1")
|
|
--> x="world hello Lua from"
|
|
|
|
x = string.gsub("home = $HOME, user = $USER", "%$(%w+)", os.getenv)
|
|
--> x="home = /home/roberto, user = roberto"
|
|
|
|
x = string.gsub("4+5 = $return 4+5$", "%$(.-)%$", function (s)
|
|
return loadstring(s)()
|
|
end)
|
|
--> x="4+5 = 9"
|
|
|
|
local t = {name="lua", version="5.0"}
|
|
x = string.gsub("$name_$version.tar.gz", "%$(%w+)", function (v)
|
|
return t[v]
|
|
end)
|
|
--> x="lua_5.0.tar.gz"
|
|
</PRE>
|
|
|
|
<p><a name="pm"><h3>Patterns</h3></a>
|
|
|
|
<p><p>
|
|
A <em>character class</em> is used to represent a set of characters.
|
|
The following combinations are allowed in describing a character class:
|
|
<ul>
|
|
<li><b><em>x</em></b> (where <em>x</em> is not one of the magic characters
|
|
<code>^$()%.[]*+-?</code>)
|
|
--- represents the character <em>x</em> itself.
|
|
<li><b><code>.</code></b> --- (a dot) represents all characters.
|
|
<li><b><code>%a</code></b> --- represents all letters.
|
|
<li><b><code>%c</code></b> --- represents all control characters.
|
|
<li><b><code>%d</code></b> --- represents all digits.
|
|
<li><b><code>%l</code></b> --- represents all lowercase letters.
|
|
<li><b><code>%p</code></b> --- represents all punctuation characters.
|
|
<li><b><code>%s</code></b> --- represents all space characters.
|
|
<li><b><code>%u</code></b> --- represents all uppercase letters.
|
|
<li><b><code>%w</code></b> --- represents all alphanumeric characters.
|
|
<li><b><code>%x</code></b> --- represents all hexadecimal digits.
|
|
<li><b><code>%z</code></b> --- represents the character with representation 0.
|
|
<li><b><code>%<em>x</em></code></b> (where <em>x</em> is any non-alphanumeric character) ---
|
|
represents the character <em>x</em>.
|
|
This is the standard way to escape the magic characters.
|
|
Any punctuation character (even the non magic)
|
|
can be preceded by a `<code>%</code>´
|
|
when used to represent itself in a pattern.
|
|
|
|
<p><li><b><code>[<em>set</em>]</code></b> ---
|
|
represents the class which is the union of all
|
|
characters in <em>set</em>.
|
|
A range of characters may be specified by
|
|
separating the end characters of the range with a `<code>-</code>´.
|
|
All classes <code>%</code><em>x</em> described above may also be used as
|
|
components in <em>set</em>.
|
|
All other characters in <em>set</em> represent themselves.
|
|
For example, <code>[%w_]</code> (or <code>[_%w]</code>)
|
|
represents all alphanumeric characters plus the underscore,
|
|
<code>[0-7]</code> represents the octal digits,
|
|
and <code>[0-7%l%-]</code> represents the octal digits plus
|
|
the lowercase letters plus the `<code>-</code>´ character.
|
|
|
|
<p>The interaction between ranges and classes is not defined.
|
|
Therefore, patterns like <code>[%a-z]</code> or <code>[a-%%]</code>
|
|
have no meaning.
|
|
|
|
<p><li><b><code>[^<em>set</em>]</code></b> ---
|
|
represents the complement of <em>set</em>,
|
|
where <em>set</em> is interpreted as above.
|
|
</ul>
|
|
For all classes represented by single letters (<code>%a</code>, <code>%c</code>, etc.),
|
|
the corresponding uppercase letter represents the complement of the class.
|
|
For instance, <code>%S</code> represents all non-space characters.
|
|
|
|
<p>The definitions of letter, space, and other character groups
|
|
depend on the current locale.
|
|
In particular, the class <code>[a-z]</code> may not be equivalent to <code>%l</code>.
|
|
The second form should be preferred for portability.
|
|
|
|
<p><p>
|
|
A <em>pattern item</em> may be
|
|
<ul>
|
|
<li>
|
|
a single character class,
|
|
which matches any single character in the class;
|
|
<li>
|
|
a single character class followed by `<code>*</code>´,
|
|
which matches 0 or more repetitions of characters in the class.
|
|
These repetition items will always match the longest possible sequence;
|
|
<li>
|
|
a single character class followed by `<code>+</code>´,
|
|
which matches 1 or more repetitions of characters in the class.
|
|
These repetition items will always match the longest possible sequence;
|
|
<li>
|
|
a single character class followed by `<code>-</code>´,
|
|
which also matches 0 or more repetitions of characters in the class.
|
|
Unlike `<code>*</code>´,
|
|
these repetition items will always match the <em>shortest</em> possible sequence;
|
|
<li>
|
|
a single character class followed by `<code>?</code>´,
|
|
which matches 0 or 1 occurrence of a character in the class;
|
|
<li>
|
|
<code>%<em>n</em></code>, for <em>n</em> between 1 and 9;
|
|
such item matches a substring equal to the <em>n</em>-th captured string
|
|
(see below);
|
|
<li>
|
|
<code>%b<em>xy</em></code>, where <em>x</em> and <em>y</em> are two distinct characters;
|
|
such item matches strings that start with <em>x</em>, end with <em>y</em>,
|
|
and where the <em>x</em> and <em>y</em> are <em>balanced</em>.
|
|
This means that, if one reads the string from left to right,
|
|
counting <em>+1</em> for an <em>x</em> and <em>-1</em> for a <em>y</em>,
|
|
the ending <em>y</em> is the first <em>y</em> where the count reaches 0.
|
|
For instance, the item <code>%b()</code> matches expressions with
|
|
balanced parentheses.
|
|
</ul>
|
|
|
|
<p><p>
|
|
A <em>pattern</em> is a sequence of pattern items.
|
|
A `<code>^</code>´ at the beginning of a pattern anchors the match at the
|
|
beginning of the subject string.
|
|
A `<code>$</code>´ at the end of a pattern anchors the match at the
|
|
end of the subject string.
|
|
At other positions,
|
|
`<code>^</code>´ and `<code>$</code>´ have no special meaning and represent themselves.
|
|
|
|
<p><p>
|
|
A pattern may contain sub-patterns enclosed in parentheses;
|
|
they describe <em>captures</em>.
|
|
When a match succeeds, the substrings of the subject string
|
|
that match captures are stored (<em>captured</em>) for future use.
|
|
Captures are numbered according to their left parentheses.
|
|
For instance, in the pattern <code>"(a*(.)%w(%s*))"</code>,
|
|
the part of the string matching <code>"a*(.)%w(%s*)"</code> is
|
|
stored as the first capture (and therefore has number 1);
|
|
the character matching <code>.</code> is captured with number 2,
|
|
and the part matching <code>%s*</code> has number 3.
|
|
|
|
<p>As a special case, the empty capture <code>()</code> captures
|
|
the current string position (a number).
|
|
For instance, if we apply the pattern <code>"()aa()"</code> on the
|
|
string <code>"flaaap"</code>, there will be two captures: 3 and 5.
|
|
|
|
<p>A pattern cannot contain embedded zeros. Use <code>%z</code> instead.
|
|
|
|
<p><a name="5.4"><h2>5.4 - Table Manipulation</h2></a>
|
|
This library provides generic functions for table manipulation.
|
|
It provides all its functions inside the table <code>table</code>.
|
|
|
|
<p>Most functions in the table library assume that the table
|
|
represents an array or a list.
|
|
For those functions, an important concept is the <em>size</em> of the array.
|
|
There are three ways to specify that size:
|
|
<ul>
|
|
<li> the field <code>"n"</code> ---
|
|
When the table has a field <code>"n"</code> with a numerical value,
|
|
that value is assumed as its size.
|
|
<li> <code>setn</code> ---
|
|
You can call the <code>table.setn</code> function to explicitly set
|
|
the size of a table.
|
|
<li> implicit size ---
|
|
Otherwise, the size of the object is one less the first integer index
|
|
with a <B>nil</B> value.
|
|
</ul>
|
|
For more details, see the descriptions of the <code>table.getn</code> and
|
|
<code>table.setn</code> functions.
|
|
|
|
<p><h3><code>table.concat (table [, sep [, i [, j]]])</code></h3>
|
|
|
|
Returns <code>table[i]..sep..table[i+1] ... sep..table[j]</code>.
|
|
The default value for <code>sep</code> is the empty string,
|
|
the default for <code>i</code> is 1,
|
|
and the default for <code>j</code> is the size of the table.
|
|
If <code>i</code> is greater than <code>j</code>, returns the empty string.
|
|
|
|
<p><h3><code>table.foreach (table, f)</code></h3>
|
|
Executes the given <code>f</code> over all elements of <code>table</code>.
|
|
For each element, <code>f</code> is called with the index and
|
|
respective value as arguments.
|
|
If <code>f</code> returns a non-<B>nil</B> value,
|
|
then the loop is broken, and this value is returned
|
|
as the final value of <code>foreach</code>.
|
|
|
|
<p>See the <code>next</code> function for extra information about table traversals.
|
|
|
|
<p><h3><code>table.foreachi (table, f)</code></h3>
|
|
Executes the given <code>f</code> over the
|
|
numerical indices of <code>table</code>.
|
|
For each index, <code>f</code> is called with the index and
|
|
respective value as arguments.
|
|
Indices are visited in sequential order,
|
|
from 1 to <code>n</code>,
|
|
where <code>n</code> is the size of the table (see <a href="#getn">5.4</a>).
|
|
If <code>f</code> returns a non-<B>nil</B> value,
|
|
then the loop is broken and this value is returned
|
|
as the result of <code>foreachi</code>.
|
|
|
|
<p><a name="getn"><h3><code>table.getn (table)</code></h3></a>
|
|
Returns the size of a table, when seen as a list.
|
|
If the table has an <code>n</code> field with a numeric value,
|
|
this value is the size of the table.
|
|
Otherwise, if there was a previous call
|
|
to <code>table.setn</code> over this table,
|
|
the respective value is returned.
|
|
Otherwise, the size is one less the first integer index with
|
|
a <B>nil</B> value.
|
|
|
|
<p><h3><code>table.sort (table [, comp])</code></h3>
|
|
Sorts table elements in a given order, <em>in-place</em>,
|
|
from <code>table[1]</code> to <code>table[n]</code>,
|
|
where <code>n</code> is the size of the table (see <a href="#getn">5.4</a>).
|
|
If <code>comp</code> is given,
|
|
then it must be a function that receives two table elements,
|
|
and returns true
|
|
when the first is less than the second
|
|
(so that <code>not comp(a[i+1],a[i])</code> will be true after the sort).
|
|
If <code>comp</code> is not given,
|
|
then the standard Lua operator <code><</code> is used instead.
|
|
|
|
<p>The sort algorithm is <em>not</em> stable,
|
|
that is, elements considered equal by the given order
|
|
may have their relative positions changed by the sort.
|
|
|
|
<p><h3><code>table.insert (table, [pos,] value)</code></h3>
|
|
|
|
<p>Inserts element <code>value</code> at position <code>pos</code> in <code>table</code>,
|
|
shifting up other elements to open space, if necessary.
|
|
The default value for <code>pos</code> is <code>n+1</code>,
|
|
where <code>n</code> is the size of the table (see <a href="#getn">5.4</a>),
|
|
so that a call <code>table.insert(t,x)</code> inserts <code>x</code> at the end
|
|
of table <code>t</code>.
|
|
This function also updates the size of the table by
|
|
calling <code>table.setn(table, n+1)</code>.
|
|
|
|
<p><h3><code>table.remove (table [, pos])</code></h3>
|
|
|
|
<p>Removes from <code>table</code> the element at position <code>pos</code>,
|
|
shifting down other elements to close the space, if necessary.
|
|
Returns the value of the removed element.
|
|
The default value for <code>pos</code> is <code>n</code>,
|
|
where <code>n</code> is the size of the table (see <a href="#getn">5.4</a>),
|
|
so that a call <code>table.remove(t)</code> removes the last element
|
|
of table <code>t</code>.
|
|
This function also updates the size of the table by
|
|
calling <code>table.setn(table, n-1)</code>.
|
|
|
|
<p><h3><code>table.setn (table, n)</code></h3>
|
|
|
|
<p>Updates the size of a table.
|
|
If the table has a field <code>"n"</code> with a numerical value,
|
|
that value is changed to the given <code>n</code>.
|
|
Otherwise, it updates an internal state
|
|
so that subsequent calls to <code>table.getn(table)</code> return <code>n</code>.
|
|
|
|
<p><a name="mathlib"><a name="5.5"><h2>5.5 - Mathematical Functions</h2></a></a>
|
|
|
|
<p>This library is an interface to most of the functions of the
|
|
standard C math library.
|
|
(Some have slightly different names.)
|
|
It provides all its functions inside the table <code>math</code>.
|
|
In addition,
|
|
it registers the global <code>__pow</code>
|
|
for the binary exponentiation operator <code>^</code>,
|
|
so that <code>x^y</code> returns <em>x<sup>y</sup></em>.
|
|
The library provides the following functions:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<PRE>
|
|
math.abs math.acos math.asin math.atan math.atan2
|
|
math.ceil math.cos math.deg math.exp math.floor
|
|
math.log math.log10 math.max math.min math.mod
|
|
math.pow math.rad math.sin math.sqrt math.tan
|
|
math.frexp math.ldexp math.random math.randomseed
|
|
</PRE>
|
|
plus a variable <code>math.pi</code>.
|
|
Most of them
|
|
are only interfaces to the corresponding functions in the C library.
|
|
All trigonometric functions work in radians
|
|
(previous versions of Lua used degrees).
|
|
The functions <code>math.deg</code> and <code>math.rad</code> convert
|
|
between radians and degrees.
|
|
|
|
<p>The function <code>math.max</code> returns the maximum
|
|
value of its numeric arguments.
|
|
Similarly, <code>math.min</code> computes the minimum.
|
|
Both can be used with 1, 2, or more arguments.
|
|
|
|
<p>The functions <code>math.random</code> and <code>math.randomseed</code>
|
|
are interfaces to the simple random generator functions
|
|
<code>rand</code> and <code>srand</code> that are provided by ANSI C.
|
|
(No guarantees can be given for their statistical properties.)
|
|
When called without arguments,
|
|
<code>math.random</code> returns a pseudo-random real number
|
|
in the range <em>[0,1)</em>.
|
|
When called with a number <em>n</em>,
|
|
<code>math.random</code> returns a pseudo-random integer in the range <em>[1,n]</em>.
|
|
When called with two arguments, <em>l</em> and <em>u</em>,
|
|
<code>math.random</code> returns a pseudo-random integer in the range <em>[l,u]</em>.
|
|
The <code>math.randomseed</code> function sets a "seed"
|
|
for the pseudo-random generator:
|
|
Equal seeds produce equal sequences of numbers.
|
|
|
|
<p><a name="libio"><a name="5.6"><h2>5.6 - Input and Output Facilities</h2></a></a>
|
|
|
|
<p>The I/O library provides two different styles for file manipulation.
|
|
The first one uses implicit file descriptors,
|
|
that is, there are operations to set a default input file and a
|
|
default output file,
|
|
and all input/output operations are over those default files.
|
|
The second style uses explicit file descriptors.
|
|
|
|
<p>When using implicit file descriptors,
|
|
all operations are supplied by table <code>io</code>.
|
|
When using explicit file descriptors,
|
|
the operation <code>io.open</code> returns a file descriptor
|
|
and then all operations are supplied as methods by the file descriptor.
|
|
|
|
<p>The table <code>io</code> also provides
|
|
three predefined file descriptors with their usual meanings from C:
|
|
<code>io.stdin</code>, <code>io.stdout</code>, and <code>io.stderr</code>.
|
|
|
|
<p>A file handle is a userdata containing the file stream (<code>FILE*</code>),
|
|
with a distinctive metatable created by the I/O library.
|
|
|
|
<p>Unless otherwise stated,
|
|
all I/O functions return <B>nil</B> on failure
|
|
(plus an error message as a second result)
|
|
and some value different from <B>nil</B> on success.
|
|
|
|
<p><h3><code>io.close ([file])</code></h3>
|
|
|
|
<p>Equivalent to <code>file:close()</code>.
|
|
Without a <code>file</code>, closes the default output file.
|
|
|
|
<p><h3><code>io.flush ()</code></h3>
|
|
|
|
<p>Equivalent to <code>file:flush</code> over the default output file.
|
|
|
|
<p><h3><code>io.input ([file])</code></h3>
|
|
|
|
<p>When called with a file name, it opens the named file (in text mode),
|
|
and sets its handle as the default input file.
|
|
When called with a file handle,
|
|
it simply sets that file handle as the default input file.
|
|
When called without parameters,
|
|
it returns the current default input file.
|
|
|
|
<p>In case of errors this function raises the error,
|
|
instead of returning an error code.
|
|
|
|
<p><h3><code>io.lines ([filename])</code></h3>
|
|
|
|
<p>Opens the given file name in read mode
|
|
and returns an iterator function that,
|
|
each time it is called,
|
|
returns a new line from the file.
|
|
Therefore, the construction
|
|
<PRE>
|
|
for line in io.lines(filename) do ... end
|
|
</PRE>
|
|
will iterate over all lines of the file.
|
|
When the iterator function detects the end of file,
|
|
it returns <B>nil</B> (to finish the loop) and automatically closes the file.
|
|
|
|
<p>The call <code>io.lines()</code> (without a file name) is equivalent
|
|
to <code>io.input():lines()</code>, that is, it iterates over the
|
|
lines of the default input file.
|
|
|
|
<p><h3><code>io.open (filename [, mode])</code></h3>
|
|
|
|
<p>This function opens a file,
|
|
in the mode specified in the string <code>mode</code>.
|
|
It returns a new file handle,
|
|
or, in case of errors, <B>nil</B> plus an error message.
|
|
|
|
<p>The <code>mode</code> string can be any of the following:
|
|
<ul>
|
|
<li><b>"r"</b> read mode (the default);
|
|
<li><b>"w"</b> write mode;
|
|
<li><b>"a"</b> append mode;
|
|
<li><b>"r+"</b> update mode, all previous data is preserved;
|
|
<li><b>"w+"</b> update mode, all previous data is erased;
|
|
<li><b>"a+"</b> append update mode, previous data is preserved,
|
|
writing is only allowed at the end of file.
|
|
</ul>
|
|
The <code>mode</code> string may also have a <code>b</code> at the end,
|
|
which is needed in some systems to open the file in binary mode.
|
|
This string is exactly what is used in the standard C function <code>fopen</code>.
|
|
|
|
<p><h3><code>io.output ([file])</code></h3>
|
|
|
|
<p>Similar to <code>io.input</code>, but operates over the default output file.
|
|
|
|
<p><h3><code>io.read (format1, ...)</code></h3>
|
|
|
|
<p>Equivalent to <code>io.input():read</code>.
|
|
|
|
<p><h3><code>io.tmpfile ()</code></h3>
|
|
|
|
<p>Returns a handle for a temporary file.
|
|
This file is open in update mode
|
|
and it is automatically removed when the program ends.
|
|
|
|
<p><h3><code>io.type (obj)</code></h3>
|
|
|
|
<p>Checks whether <code>obj</code> is a valid file handle.
|
|
Returns the string <code>"file"</code> if <code>obj</code> is an open file handle,
|
|
<code>"closed file"</code> if <code>obj</code> is a closed file handle,
|
|
and <B>nil</B> if <code>obj</code> is not a file handle.
|
|
|
|
<p><h3><code>io.write (value1, ...)</code></h3>
|
|
|
|
<p>Equivalent to <code>io.output():write</code>.
|
|
|
|
<p><h3><code>file:close ()</code></h3>
|
|
|
|
<p>Closes <code>file</code>.
|
|
|
|
<p><h3><code>file:flush ()</code></h3>
|
|
|
|
<p>Saves any written data to <code>file</code>.
|
|
|
|
<p><h3><code>file:lines ()</code></h3>
|
|
|
|
<p>Returns an iterator function that,
|
|
each time it is called,
|
|
returns a new line from the file.
|
|
Therefore, the construction
|
|
<PRE>
|
|
for line in file:lines() do ... end
|
|
</PRE>
|
|
will iterate over all lines of the file.
|
|
(Unlike <code>io.lines</code>, this function does not close the file
|
|
when the loop ends.)
|
|
|
|
<p><h3><code>file:read (format1, ...)</code></h3>
|
|
|
|
<p>Reads the file <code>file</code>,
|
|
according to the given formats, which specify what to read.
|
|
For each format,
|
|
the function returns a string (or a number) with the characters read,
|
|
or <B>nil</B> if it cannot read data with the specified format.
|
|
When called without formats,
|
|
it uses a default format that reads the entire next line
|
|
(see below).
|
|
|
|
<p>The available formats are
|
|
<ul>
|
|
<li><b>"*n"</b> reads a number;
|
|
this is the only format that returns a number instead of a string.
|
|
<li><b>"*a"</b> reads the whole file, starting at the current position.
|
|
On end of file, it returns the empty string.
|
|
<li><b>"*l"</b> reads the next line (skipping the end of line),
|
|
returning <B>nil</B> on end of file.
|
|
This is the default format.
|
|
<li><b><em>number</em></b> reads a string with up to that number of characters,
|
|
returning <B>nil</B> on end of file.
|
|
If number is zero,
|
|
it reads nothing and returns an empty string,
|
|
or <B>nil</B> on end of file.
|
|
</ul>
|
|
|
|
<p><h3><code>file:seek ([whence] [, offset])</code></h3>
|
|
|
|
<p>Sets and gets the file position,
|
|
measured from the beginning of the file,
|
|
to the position given by <code>offset</code> plus a base
|
|
specified by the string <code>whence</code>, as follows:
|
|
<ul>
|
|
<li><b>"set"</b> base is position 0 (beginning of the file);
|
|
<li><b>"cur"</b> base is current position;
|
|
<li><b>"end"</b> base is end of file;
|
|
</ul>
|
|
In case of success, function <code>seek</code> returns the final file position,
|
|
measured in bytes from the beginning of the file.
|
|
If this function fails, it returns <B>nil</B>,
|
|
plus a string describing the error.
|
|
|
|
<p>The default value for <code>whence</code> is <code>"cur"</code>,
|
|
and for <code>offset</code> is 0.
|
|
Therefore, the call <code>file:seek()</code> returns the current
|
|
file position, without changing it;
|
|
the call <code>file:seek("set")</code> sets the position to the
|
|
beginning of the file (and returns 0);
|
|
and the call <code>file:seek("end")</code> sets the position to the
|
|
end of the file, and returns its size.
|
|
|
|
<p><h3><code>file:write (value1, ...)</code></h3>
|
|
|
|
<p>Writes the value of each of its arguments to
|
|
the filehandle <code>file</code>.
|
|
The arguments must be strings or numbers.
|
|
To write other values,
|
|
use <code>tostring</code> or <code>string.format</code> before <code>write</code>.
|
|
|
|
<p><a name="libiosys"><a name="5.7"><h2>5.7 - Operating System Facilities</h2></a></a>
|
|
|
|
<p>This library is implemented through table <code>os</code>.
|
|
|
|
<p><h3><code>os.clock ()</code></h3>
|
|
|
|
<p>Returns an approximation of the amount of CPU time
|
|
used by the program, in seconds.
|
|
|
|
<p><h3><code>os.date ([format [, time]])</code></h3>
|
|
|
|
<p>Returns a string or a table containing date and time,
|
|
formatted according to the given string <code>format</code>.
|
|
|
|
<p>If the <code>time</code> argument is present,
|
|
this is the time to be formatted
|
|
(see the <code>os.time</code> function for a description of this value).
|
|
Otherwise, <code>date</code> formats the current time.
|
|
|
|
<p>If <code>format</code> starts with `<code>!</code>´,
|
|
then the date is formatted in Coordinated Universal Time.
|
|
After that optional character,
|
|
if <code>format</code> is <code>*t</code>,
|
|
then <code>date</code> returns a table with the following fields:
|
|
<code>year</code> (four digits), <code>month</code> (1--12), <code>day</code> (1--31),
|
|
<code>hour</code> (0--23), <code>min</code> (0--59), <code>sec</code> (0--61),
|
|
<code>wday</code> (weekday, Sunday is 1),
|
|
<code>yday</code> (day of the year),
|
|
and <code>isdst</code> (daylight saving flag, a boolean).
|
|
|
|
<p>If <code>format</code> is not <code>*t</code>,
|
|
then <code>date</code> returns the date as a string,
|
|
formatted according with the same rules as the C function <code>strftime</code>.
|
|
|
|
<p>When called without arguments,
|
|
<code>date</code> returns a reasonable date and time representation that depends on
|
|
the host system and on the current locale
|
|
(that is, <code>os.date()</code> is equivalent to <code>os.date("%c")</code>).
|
|
|
|
<p><h3><code>os.difftime (t2, t1)</code></h3>
|
|
|
|
<p>Returns the number of seconds from time <code>t1</code> to time <code>t2</code>.
|
|
In Posix, Windows, and some other systems,
|
|
this value is exactly <code>t2</code><em>-</em><code>t1</code>.
|
|
|
|
<p><h3><code>os.execute (command)</code></h3>
|
|
|
|
<p>This function is equivalent to the C function <code>system</code>.
|
|
It passes <code>command</code> to be executed by an operating system shell.
|
|
It returns a status code, which is system-dependent.
|
|
|
|
<p><h3><code>os.exit ([code])</code></h3>
|
|
|
|
<p>Calls the C function <code>exit</code>,
|
|
with an optional <code>code</code>,
|
|
to terminate the host program.
|
|
The default value for <code>code</code> is the success code.
|
|
|
|
<p><h3><code>os.getenv (varname)</code></h3>
|
|
|
|
<p>Returns the value of the process environment variable <code>varname</code>,
|
|
or <B>nil</B> if the variable is not defined.
|
|
|
|
<p><h3><code>os.remove (filename)</code></h3>
|
|
|
|
<p>Deletes the file with the given name.
|
|
If this function fails, it returns <B>nil</B>,
|
|
plus a string describing the error.
|
|
|
|
<p><h3><code>os.rename (oldname, newname)</code></h3>
|
|
|
|
<p>Renames file named <code>oldname</code> to <code>newname</code>.
|
|
If this function fails, it returns <B>nil</B>,
|
|
plus a string describing the error.
|
|
|
|
<p><h3><code>os.setlocale (locale [, category])</code></h3>
|
|
|
|
<p>Sets the current locale of the program.
|
|
<code>locale</code> is a string specifying a locale;
|
|
<code>category</code> is an optional string describing which category to change:
|
|
<code>"all"</code>, <code>"collate"</code>, <code>"ctype"</code>,
|
|
<code>"monetary"</code>, <code>"numeric"</code>, or <code>"time"</code>;
|
|
the default category is <code>"all"</code>.
|
|
The function returns the name of the new locale,
|
|
or <B>nil</B> if the request cannot be honored.
|
|
|
|
<p><h3><code>os.time ([table])</code></h3>
|
|
|
|
<p>Returns the current time when called without arguments,
|
|
or a time representing the date and time specified by the given table.
|
|
This table must have fields <code>year</code>, <code>month</code>, and <code>day</code>,
|
|
and may have fields <code>hour</code>, <code>min</code>, <code>sec</code>, and <code>isdst</code>
|
|
(for a description of these fields, see the <code>os.date</code> function).
|
|
|
|
<p>The returned value is a number, whose meaning depends on your system.
|
|
In Posix, Windows, and some other systems, this number counts the number
|
|
of seconds since some given start time (the "epoch").
|
|
In other systems, the meaning is not specified,
|
|
and the number returned by <code>time</code> can be used only as an argument to
|
|
<code>date</code> and <code>difftime</code>.
|
|
|
|
<p><h3><code>os.tmpname ()</code></h3>
|
|
|
|
<p>Returns a string with a file name that can
|
|
be used for a temporary file.
|
|
The file must be explicitly opened before its use
|
|
and removed when no longer needed.
|
|
|
|
<p>This function is equivalent to the <code>tmpnam</code> C function,
|
|
and many people (and even some compilers!) advise against its use,
|
|
because between the time you call this function
|
|
and the time you open the file,
|
|
it is possible for another process
|
|
to create a file with the same name.
|
|
|
|
<p><a name="5.8"><h2>5.8 - The Reflexive Debug Interface</h2></a>
|
|
|
|
<p>The <code>debug</code> library provides
|
|
the functionality of the debug interface to Lua programs.
|
|
You should exert care when using this library.
|
|
The functions provided here should be used exclusively for debugging
|
|
and similar tasks, such as profiling.
|
|
Please resist the temptation to use them as a
|
|
usual programming tool:
|
|
They can be very slow.
|
|
Moreover, <code>setlocal</code> and <code>getlocal</code>
|
|
violate the privacy of local variables
|
|
and therefore can compromise some otherwise secure code.
|
|
|
|
<p>All functions in this library are provided
|
|
inside a <code>debug</code> table.
|
|
|
|
<p><h3><code>debug.debug ()</code></h3>
|
|
|
|
<p>Enters an interactive mode with the user,
|
|
running each string that the user enters.
|
|
Using simple commands and other debug facilities,
|
|
the user can inspect global and local variables,
|
|
change their values, evaluate expressions, and so on.
|
|
A line containing only the word <code>cont</code> finishes this function,
|
|
so that the caller continues its execution.
|
|
|
|
<p>Note that commands for <code>debug.debug</code> are not lexically nested
|
|
with any function, so they have no direct access to local variables.
|
|
|
|
<p><h3><code>debug.gethook ()</code></h3>
|
|
|
|
<p>Returns the current hook settings, as three values:
|
|
the current hook function, the current hook mask,
|
|
and the current hook count (as set by the <code>debug.sethook</code> function).
|
|
|
|
<p><h3><code>debug.getinfo (function [, what])</code></h3>
|
|
|
|
<p>This function returns a table with information about a function.
|
|
You can give the function directly,
|
|
or you can give a number as the value of <code>function</code>,
|
|
which means the function running at level <code>function</code> of the call stack:
|
|
Level 0 is the current function (<code>getinfo</code> itself);
|
|
level 1 is the function that called <code>getinfo</code>;
|
|
and so on.
|
|
If <code>function</code> is a number larger than the number of active functions,
|
|
then <code>getinfo</code> returns <B>nil</B>.
|
|
|
|
<p>The returned table contains all the fields returned by <code>lua_getinfo</code>,
|
|
with the string <code>what</code> describing which fields to fill in.
|
|
The default for <code>what</code> is to get all information available.
|
|
If present,
|
|
the option `<code>f</code>´
|
|
adds a field named <code>func</code> with the function itself.
|
|
|
|
<p>For instance, the expression <code>debug.getinfo(1,"n").name</code> returns
|
|
the name of the current function, if a reasonable name can be found,
|
|
and <code>debug.getinfo(print)</code> returns a table with all available information
|
|
about the <code>print</code> function.
|
|
|
|
<p><h3><code>debug.getlocal (level, local)</code></h3>
|
|
|
|
<p>This function returns the name and the value of the local variable
|
|
with index <code>local</code> of the function at level <code>level</code> of the stack.
|
|
(The first parameter or local variable has index 1, and so on,
|
|
until the last active local variable.)
|
|
The function returns <B>nil</B> if there is no local
|
|
variable with the given index,
|
|
and raises an error when called with a <code>level</code> out of range.
|
|
(You can call <code>debug.getinfo</code> to check whether the level is valid.)
|
|
|
|
<p><h3><code>debug.getupvalue (func, up)</code></h3>
|
|
|
|
<p>This function returns the name and the value of the upvalue
|
|
with index <code>up</code> of the function <code>func</code>.
|
|
The function returns <B>nil</B> if there is no upvalue with the given index.
|
|
|
|
<p><h3><code>debug.setlocal (level, local, value)</code></h3>
|
|
|
|
<p>This function assigns the value <code>value</code> to the local variable
|
|
with index <code>local</code> of the function at level <code>level</code> of the stack.
|
|
The function returns <B>nil</B> if there is no local
|
|
variable with the given index,
|
|
and raises an error when called with a <code>level</code> out of range.
|
|
(You can call <code>getinfo</code> to check whether the level is valid.)
|
|
|
|
<p><h3><code>debug.setupvalue (func, up, value)</code></h3>
|
|
|
|
<p>This function assigns the value <code>value</code> to the upvalue
|
|
with index <code>up</code> of the function <code>func</code>.
|
|
The function returns <B>nil</B> if there is no upvalue
|
|
with the given index.
|
|
|
|
<p><h3><code>debug.sethook (hook, mask [, count])</code></h3>
|
|
|
|
|
|
<p>Sets the given function as a hook.
|
|
The string <code>mask</code> and the number <code>count</code> describe
|
|
when the hook will be called.
|
|
The string mask may have the following characters,
|
|
with the given meaning:
|
|
<ul>
|
|
<li><b><code>"c"</code></b> The hook is called every time Lua calls a function;
|
|
<li><b><code>"r"</code></b> The hook is called every time Lua returns from a function;
|
|
<li><b><code>"l"</code></b> The hook is called every time Lua enters a new line of code.
|
|
</ul>
|
|
With a <code>count</code> different from zero,
|
|
the hook is called after every <code>count</code> instructions.
|
|
|
|
<p>When called without arguments,
|
|
the <code>debug.sethook</code> function turns off the hook.
|
|
|
|
<p>When the hook is called, its first parameter is always a string
|
|
describing the event that triggered its call:
|
|
<code>"call"</code>, <code>"return"</code> (or <code>"tail return"</code>),
|
|
<code>"line"</code>, and <code>"count"</code>.
|
|
Moreover, for line events,
|
|
it also gets as its second parameter the new line number.
|
|
Inside a hook,
|
|
you can call <code>getinfo</code> with level 2 to get more information about
|
|
the running function
|
|
(level 0 is the <code>getinfo</code> function,
|
|
and level 1 is the hook function),
|
|
unless the event is <code>"tail return"</code>.
|
|
In this case, Lua is only simulating the return,
|
|
and a call to <code>getinfo</code> will return invalid data.
|
|
|
|
<p><h3><code>debug.traceback ([message])</code></h3>
|
|
|
|
<p>Returns a string with a traceback of the call stack.
|
|
An optional <code>message</code> string is appended
|
|
at the beginning of the traceback.
|
|
This function is typically used with <code>xpcall</code> to produce
|
|
better error messages.
|
|
|
|
<p>
|
|
<a name="lua-sa"><a name="6"><h1>6 - Lua Stand-alone</h1></a></a>
|
|
|
|
<p>Although Lua has been designed as an extension language,
|
|
to be embedded in a host C program,
|
|
it is also frequently used as a stand-alone language.
|
|
An interpreter for Lua as a stand-alone language,
|
|
called simply <code>lua</code>,
|
|
is provided with the standard distribution.
|
|
The stand-alone interpreter includes
|
|
all standard libraries plus the reflexive debug interface.
|
|
Its usage is:
|
|
<PRE>
|
|
lua [options] [script [args]]
|
|
</PRE>
|
|
The options are:
|
|
<ul>
|
|
<li><b><code>-</code> </b> executes <code>stdin</code> as a file;
|
|
<li><b><code>-e</code> <em>stat</em></b> executes string <em>stat</em>;
|
|
<li><b><code>-l</code> <em>file</em></b> "requires" <em>file</em>;
|
|
<li><b><code>-i</code></b> enters interactive mode after running <em>script</em>;
|
|
<li><b><code>-v</code></b> prints version information;
|
|
<li><b><code>--</code></b> stop handling options.
|
|
</ul>
|
|
After handling its options, <code>lua</code> runs the given <em>script</em>,
|
|
passing to it the given <em>args</em>.
|
|
When called without arguments,
|
|
<code>lua</code> behaves as <code>lua -v -i</code> when <code>stdin</code> is a terminal,
|
|
and as <code>lua -</code> otherwise.
|
|
|
|
<p>Before running any argument,
|
|
the interpreter checks for an environment variable <code>LUA_INIT</code>.
|
|
If its format is @<em>filename</em>,
|
|
then lua executes the file.
|
|
Otherwise, lua executes the string itself.
|
|
|
|
<p>All options are handled in order, except <code>-i</code>.
|
|
For instance, an invocation like
|
|
<PRE>
|
|
$ lua -e'a=1' -e 'print(a)' script.lua
|
|
</PRE>
|
|
will first set <code>a</code> to 1, then print <code>a</code>,
|
|
and finally run the file <code>script.lua</code>.
|
|
(Here, <code>$</code> is the shell prompt. Your prompt may be different.)
|
|
|
|
<p>Before starting to run the script,
|
|
<code>lua</code> collects all arguments in the command line
|
|
in a global table called <code>arg</code>.
|
|
The script name is stored in index 0,
|
|
the first argument after the script name goes to index 1,
|
|
and so on.
|
|
The field <code>n</code> gets the number of arguments after the script name.
|
|
Any arguments before the script name
|
|
(that is, the interpreter name plus the options)
|
|
go to negative indices.
|
|
For instance, in the call
|
|
<PRE>
|
|
$ lua -la.lua b.lua t1 t2
|
|
</PRE>
|
|
the interpreter first runs the file <code>a.lua</code>,
|
|
then creates a table
|
|
<PRE>
|
|
arg = { [-2] = "lua", [-1] = "-la.lua", [0] = "b.lua",
|
|
[1] = "t1", [2] = "t2"; n = 2 }
|
|
</PRE>
|
|
and finally runs the file <code>b.lua</code>.
|
|
|
|
<p>In interactive mode,
|
|
if you write an incomplete statement,
|
|
the interpreter waits for its completion.
|
|
|
|
<p>If the global variable <code>_PROMPT</code> is defined as a string,
|
|
then its value is used as the prompt.
|
|
Therefore, the prompt can be changed directly on the command line:
|
|
<PRE>
|
|
$ lua -e"_PROMPT='myprompt> '" -i
|
|
</PRE>
|
|
(the outer pair of quotes is for the shell,
|
|
the inner is for Lua),
|
|
or in any Lua programs by assigning to <code>_PROMPT</code>.
|
|
Note the use of <code>-i</code> to enter interactive mode; otherwise,
|
|
the program would end just after the assignment to <code>_PROMPT</code>.
|
|
|
|
<p>In Unix systems, Lua scripts can be made into executable programs
|
|
by using <code>chmod +x</code> and the <code>#!</code> form,
|
|
as in
|
|
<PRE>
|
|
#!/usr/local/bin/lua
|
|
</PRE>
|
|
(Of course,
|
|
the location of the Lua interpreter may be different in your machine.
|
|
If <code>lua</code> is in your <code>PATH</code>,
|
|
then
|
|
<PRE>
|
|
#!/usr/bin/env lua
|
|
</PRE>
|
|
is a more portable solution.)
|
|
|
|
<p>
|
|
<h1>Acknowledgments</h1>
|
|
|
|
<p>The Lua team is grateful to <a href="http://www.tecgraf.puc-rio.br">Tecgraf</a> for its continued support to Lua.
|
|
We thank everyone at <a href="http://www.tecgraf.puc-rio.br">Tecgraf</a>,
|
|
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é Clinio,
|
|
André Costa,
|
|
Antonio Scuri,
|
|
Asko Kauppi,
|
|
Bret Mogilefsky,
|
|
Cameron Laird,
|
|
Carlos Cassino,
|
|
Carlos Henrique Levy,
|
|
Claudio Terra,
|
|
David Jeske,
|
|
Ed Ferguson,
|
|
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 Lhoste,
|
|
Renata Ratton,
|
|
Renato Borges,
|
|
Renato Cerqueira,
|
|
Reuben Thomas,
|
|
Stephan Herrmann,
|
|
Steve Dekorte,
|
|
Thatcher Ulrich,
|
|
Tomás Gorham,
|
|
Vincent Penquerc'h.
|
|
Thank you!
|
|
|
|
<p><hr>
|
|
|
|
<p><h1>Incompatibilities with Previous Versions</h1>
|
|
|
|
|
|
<p>Lua 5.0 is a major release.
|
|
There are several incompatibilities with its previous version, Lua 4.0.
|
|
|
|
<p><h2>Incompatibilities with version 4.0</h2>
|
|
|
|
<p><h3>Changes in the Language</h3>
|
|
<ul>
|
|
|
|
<p><li>
|
|
The whole tag-method scheme was replaced by metatables.
|
|
|
|
<p><li>
|
|
Function calls written between parentheses result in exactly one value.
|
|
|
|
<p><li>
|
|
A function call as the last expression in a list constructor
|
|
(like <code>{a,b,f()}</code>) has all its return values inserted in the list.
|
|
|
|
<p><li>
|
|
The precedence of <b>or</b> is smaller than the precedence of <b>and</b>.
|
|
|
|
<p><li>
|
|
<b>in</b>, <b>false</b>, and <b>true</b> are reserved words.
|
|
|
|
<p><li>
|
|
The old construction <code>for k,v in t</code>, where <code>t</code> is a table,
|
|
is deprecated (although it is still supported).
|
|
Use <code>for k,v in pairs(t)</code> instead.
|
|
|
|
<p><li>
|
|
When a literal string of the form <code>[[...]]</code> starts with a newline,
|
|
this newline is ignored.
|
|
|
|
<p>
|
|
|
|
<p><li> Upvalues in the form <code>%var</code> are obsolete;
|
|
use external local variables instead.
|
|
|
|
<p></ul>
|
|
|
|
<p><h3>Changes in the Libraries</h3>
|
|
<ul>
|
|
|
|
<p><li>
|
|
Most library functions now are defined inside tables.
|
|
There is a compatibility script (<code>compat.lua</code>) that
|
|
redefine most of them as global names.
|
|
|
|
<p><li>
|
|
In the math library, angles are expressed in radians.
|
|
With the compatibility script (<code>compat.lua</code>),
|
|
functions still work in degrees.
|
|
|
|
<p><li>
|
|
The <code>call</code> function is deprecated.
|
|
Use <code>f(unpack(tab))</code> instead of <code>call(f, tab)</code>
|
|
for unprotected calls,
|
|
or the new <code>pcall</code> function for protected calls.
|
|
|
|
<p><li>
|
|
<code>dofile</code> do not handle errors, but simply propagates them.
|
|
|
|
<p><li>
|
|
<code>dostring</code> is deprecated. Use <code>loadstring</code> instead.
|
|
|
|
<p><li>
|
|
The <code>read</code> option <code>*w</code> is obsolete.
|
|
|
|
<p><li>
|
|
The <code>format</code> option <code>%n$</code> is obsolete.
|
|
|
|
<p></ul>
|
|
|
|
<p><h3>Changes in the API</h3>
|
|
<ul>
|
|
|
|
<p><li>
|
|
<code>lua_open</code> does not have a stack size as its argument
|
|
(stacks are dynamic).
|
|
|
|
<p><li>
|
|
<code>lua_pushuserdata</code> is deprecated.
|
|
Use <code>lua_newuserdata</code> or <code>lua_pushlightuserdata</code> instead.
|
|
|
|
<p></ul>
|
|
|
|
<p>
|
|
|
|
<a name="BNF"><h1>The Complete Syntax of Lua</h1></a>
|
|
|
|
|
|
<p>
|
|
|
|
<p><pre>
|
|
|
|
<p> chunk ::= {stat [`<b>;</b>´]}
|
|
|
|
<p> block ::= chunk
|
|
|
|
<p> stat ::= varlist1 `<b>=</b>´ explist1 | functioncall | <b>do</b> block <b>end</b> | <b>while</b> exp <b>do</b> block <b>end</b> | <b>repeat</b> block <b>until</b> exp | <b>if</b> exp <b>then</b> block {<b>elseif</b> exp <b>then</b> block} [<b>else</b> block] <b>end</b> | <b>return</b> [explist1] | <b>break</b> | <b>for</b> Name `<b>=</b>´ exp `<b>,</b>´ exp [`<b>,</b>´ exp] <b>do</b> block <b>end</b> | <b>for</b> Name {`<b>,</b>´ Name} <b>in</b> explist1 <b>do</b> block <b>end</b> | <b>function</b> funcname funcbody | <b>local</b> <b>function</b> Name funcbody | <b>local</b> namelist [init]
|
|
|
|
<p> funcname ::= Name {`<b>.</b>´ Name} [`<b>:</b>´ Name]
|
|
|
|
<p> varlist1 ::= var {`<b>,</b>´ var}
|
|
|
|
<p> var ::= Name | prefixexp `<b>[</b>´ exp `<b>]</b>´ | prefixexp `<b>.</b>´ Name
|
|
|
|
<p> namelist ::= Name {`<b>,</b>´ Name}
|
|
|
|
<p> init ::= `<b>=</b>´ explist1
|
|
|
|
<p> explist1 ::= {exp `<b>,</b>´} exp
|
|
|
|
<p> exp ::= <b>nil</b> | <b>false</b> | <b>true</b> | Number | Literal | function | prefixexp | tableconstructor | exp binop exp | unop exp
|
|
|
|
<p> prefixexp ::= var | functioncall | `<b>(</b>´ exp `<b>)</b>´
|
|
|
|
<p> functioncall ::= prefixexp args | prefixexp `<b>:</b>´ Name args
|
|
|
|
<p> args ::= `<b>(</b>´ [explist1] `<b>)</b>´ | tableconstructor | Literal
|
|
|
|
<p> function ::= <b>function</b> funcbody
|
|
|
|
<p> funcbody ::= `<b>(</b>´ [parlist1] `<b>)</b>´ block <b>end</b>
|
|
|
|
<p> parlist1 ::= Name {`<b>,</b>´ Name} [`<b>,</b>´ `<b>...</b>´] | `<b>...</b>´
|
|
|
|
<p> tableconstructor ::= `<b>{</b>´ [fieldlist] `<b>}</b>´
|
|
fieldlist ::= field {fieldsep field} [fieldsep]
|
|
field ::= `<b>[</b>´ exp `<b>]</b>´ `<b>=</b>´ exp | name `<b>=</b>´ exp | exp
|
|
fieldsep ::= `<b>,</b>´ | `<b>;</b>´
|
|
|
|
<p> binop ::= `<b>+</b>´ | `<b>-</b>´ | `<b>*</b>´ | `<b>/</b>´ | `<b>^</b>´ | `<b>..</b>´ | `<b><</b>´ | `<b><=</b>´ | `<b>></b>´ | `<b>>=</b>´ | `<b>==</b>´ | `<b>~=</b>´ | <b>and</b> | <b>or</b>
|
|
|
|
<p> unop ::= `<b>-</b>´ | <b>not</b>
|
|
|
|
<p></pre>
|
|
|
|
<p>
|
|
|
|
<p>
|
|
|
|
<HR>
|
|
<SMALL>
|
|
Last update:
|
|
Tue Nov 25 16:08:37 BRST 2003
|
|
</SMALL>
|
|
|
|
</BODY>
|
|
</HTML>
|