|
|
@ -1333,19 +1333,11 @@ Expressions are discussed in @See{expressions}. |
|
|
|
|
|
|
|
Before the assignment, |
|
|
|
the list of values is @emph{adjusted} to the length of |
|
|
|
the list of variables.@index{adjustment} |
|
|
|
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 @nil's. |
|
|
|
If the list of expressions ends with a function call, |
|
|
|
then all values returned by that call enter the list of values, |
|
|
|
before the adjustment |
|
|
|
(except when the call is enclosed in parentheses; see @See{expressions}). |
|
|
|
the list of variables @see{multires}. |
|
|
|
|
|
|
|
If a variable is both assigned and read |
|
|
|
inside a multiple assignment, |
|
|
|
Lua ensures all reads get the value of the variable |
|
|
|
Lua ensures that all reads get the value of the variable |
|
|
|
before the assignment. |
|
|
|
Thus the code |
|
|
|
@verbatim{ |
|
|
@ -1684,9 +1676,10 @@ function calls are explained in @See{functioncall}; |
|
|
|
table constructors are explained in @See{tableconstructor}. |
|
|
|
Vararg expressions, |
|
|
|
denoted by three dots (@Char{...}), can only be used when |
|
|
|
directly inside a vararg function; |
|
|
|
directly inside a variadic function; |
|
|
|
they are explained in @See{func-def}. |
|
|
|
|
|
|
|
|
|
|
|
Binary operators comprise arithmetic operators @see{arith}, |
|
|
|
bitwise operators @see{bitwise}, |
|
|
|
relational operators @see{rel-ops}, logical operators @see{logic}, |
|
|
@ -1696,47 +1689,8 @@ the unary bitwise NOT @see{bitwise}, |
|
|
|
the unary logical @Rw{not} @see{logic}, |
|
|
|
and the unary @def{length operator} @see{len-op}. |
|
|
|
|
|
|
|
Both function calls and vararg expressions can result in multiple values. |
|
|
|
If a function call is used as a statement @see{funcstat}, |
|
|
|
then its return list is adjusted to zero elements, |
|
|
|
thus discarding all returned values. |
|
|
|
If an expression is used as the last (or the only) element |
|
|
|
of a list of expressions, |
|
|
|
then no adjustment is made |
|
|
|
(unless the expression is enclosed in parentheses). |
|
|
|
In all other contexts, |
|
|
|
Lua adjusts the result list to one element, |
|
|
|
either discarding all values except the first one |
|
|
|
or adding a single @nil if there are no values. |
|
|
|
|
|
|
|
Here are some examples: |
|
|
|
@verbatim{ |
|
|
|
f() -- adjusted to 0 results |
|
|
|
g(f(), x) -- f() is adjusted to 1 result |
|
|
|
g(x, f()) -- g gets x plus all results from f() |
|
|
|
a,b,c = f(), x -- f() is adjusted to 1 result (c gets nil) |
|
|
|
a,b = ... -- a gets the first vararg argument, b gets |
|
|
|
-- the second (both a and b can get nil if there |
|
|
|
-- is no corresponding vararg argument) |
|
|
|
|
|
|
|
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 results from f() |
|
|
|
return ... -- returns all received vararg arguments |
|
|
|
return x,y,f() -- returns x, y, and all results from f() |
|
|
|
{f()} -- creates a list with all results from f() |
|
|
|
{...} -- creates a list with all vararg arguments |
|
|
|
{f(), nil} -- f() is adjusted to 1 result |
|
|
|
} |
|
|
|
|
|
|
|
Any expression enclosed in parentheses always results in only one value. |
|
|
|
Thus, |
|
|
|
@T{(f(x,y,z))} is always a single value, |
|
|
|
even if @id{f} returns several values. |
|
|
|
(The value of @T{(f(x,y,z))} is the first value returned by @id{f} |
|
|
|
or @nil if @id{f} does not return any values.) |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
@sect3{arith| @title{Arithmetic Operators} |
|
|
@ -1843,8 +1797,9 @@ the library calls the metamethod of the other operand |
|
|
|
(if present) or it raises an error. |
|
|
|
Note that bitwise operators do not do this coercion. |
|
|
|
|
|
|
|
Nonetheless, it is always a good practice not to rely on these |
|
|
|
implicit coercions, as they are not always applied; |
|
|
|
It is always a good practice not to rely on the |
|
|
|
implicit coercions from strings to numbers, |
|
|
|
as they are not always applied; |
|
|
|
in particular, @T{"1"==1} is false and @T{"1"<1} raises an error |
|
|
|
@see{rel-ops}. |
|
|
|
These coercions exist mainly for compatibility and may be removed |
|
|
@ -2095,9 +2050,9 @@ The order of the assignments in a constructor is undefined. |
|
|
|
(This order would be relevant only when there are repeated keys.) |
|
|
|
|
|
|
|
If the last field in the list has the form @id{exp} |
|
|
|
and the expression is a function call or a vararg expression, |
|
|
|
and the expression is a multires expression, |
|
|
|
then all values returned by this expression enter the list consecutively |
|
|
|
@see{functioncall}. |
|
|
|
@see{multires}. |
|
|
|
|
|
|
|
The field list can have an optional trailing separator, |
|
|
|
as a convenience for machine-generated code. |
|
|
@ -2148,7 +2103,7 @@ A call of the form @T{return @rep{functioncall}} not in the |
|
|
|
scope of a to-be-closed variable is called a @def{tail call}. |
|
|
|
Lua implements @def{proper tail calls} |
|
|
|
(or @def{proper tail recursion}): |
|
|
|
in a tail call, |
|
|
|
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. |
|
|
@ -2234,22 +2189,16 @@ initialized with the argument values: |
|
|
|
} |
|
|
|
When a Lua function is called, |
|
|
|
it adjusts its list of @x{arguments} to |
|
|
|
the length of its list of parameters, |
|
|
|
unless the function is a @def{vararg function}, |
|
|
|
the length of its list of parameters @see{multires}, |
|
|
|
unless the function is a @def{variadic function}, |
|
|
|
which is indicated by three dots (@Char{...}) |
|
|
|
at the end of its parameter list. |
|
|
|
A vararg function does not adjust its argument list; |
|
|
|
A variadic function does not adjust its argument list; |
|
|
|
instead, it collects all extra arguments and supplies them |
|
|
|
to the function through a @def{vararg expression}, |
|
|
|
which is also written as three dots. |
|
|
|
The value of this expression is a list of all actual extra arguments, |
|
|
|
similar to a function with multiple results. |
|
|
|
If a vararg expression is used inside another expression |
|
|
|
or in the middle of a list of expressions, |
|
|
|
then its return list is adjusted to one element. |
|
|
|
If the expression is used as the last element of a list of expressions, |
|
|
|
then no adjustment is made |
|
|
|
(unless that last expression is enclosed in parentheses). |
|
|
|
similar to a function with multiple results @see{multires}. |
|
|
|
|
|
|
|
|
|
|
|
As an example, consider the following definitions: |
|
|
@ -2299,6 +2248,99 @@ t.a.b.c.f = function (self, @rep{params}) @rep{body} end |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
@sect3{multires| @title{Lists of expressions, multiple results, |
|
|
|
and adjustment} |
|
|
|
|
|
|
|
Both function calls and vararg expressions can result in multiple values. |
|
|
|
These expressions are called @def{multires expressions}. |
|
|
|
|
|
|
|
When a multires expression is used as the last element |
|
|
|
of a list of expressions, |
|
|
|
all results from the expression are added to the |
|
|
|
list of values produced by the list of expressions. |
|
|
|
Note that a single expression |
|
|
|
in a place that expects a list of expressions |
|
|
|
is the last expression in that (singleton) list. |
|
|
|
|
|
|
|
These are the places where Lua expects a list of expressions: |
|
|
|
@description{ |
|
|
|
|
|
|
|
@item{A @rw{return} statement, |
|
|
|
for instance @T{return e1, e2, e3} @see{control}.} |
|
|
|
|
|
|
|
@item{A table constructor, |
|
|
|
for instance @T{{e1, e2, e3}} @see{tableconstructor}.} |
|
|
|
|
|
|
|
@item{The arguments of a function call, |
|
|
|
for instance @T{foo(e1, e2, e3)} @see{functioncall}.} |
|
|
|
|
|
|
|
@item{A multiple assignment, |
|
|
|
for instance @T{a , b, c = e1, e2, e3} @see{assignment}.} |
|
|
|
|
|
|
|
@item{A local declaration, |
|
|
|
for instance @T{local a , b, c = e1, e2, e3} @see{localvar}.} |
|
|
|
|
|
|
|
@item{The initial values in a generic @rw{for} loop, |
|
|
|
for instance @T{for k in e1, e2, e3 do ... end} @see{for}.} |
|
|
|
|
|
|
|
} |
|
|
|
In the last four cases, |
|
|
|
the list of values from the list of expressions |
|
|
|
must be @emph{adjusted} to a specific length: |
|
|
|
the number of parameters in a call to a non-variadic function |
|
|
|
@see{func-def}, |
|
|
|
the number of variables in a multiple assignment or |
|
|
|
a local declaration, |
|
|
|
and exactly four for a generic @rw{for} loop. |
|
|
|
The @def{adjustment} follows these rules: |
|
|
|
If there are more values than needed, |
|
|
|
the extra values are thrown away; |
|
|
|
if there are fewer values than needed, |
|
|
|
the list is extended with @nil's. |
|
|
|
When the list of expressions ends with a multires expression, |
|
|
|
all results from that expression enter the list of values |
|
|
|
before the adjustment. |
|
|
|
|
|
|
|
When a multires expression is used |
|
|
|
in a list of expressions without being the last element, |
|
|
|
or in a place where the syntax expects a single expression, |
|
|
|
Lua adjusts the result list of that expression to one element. |
|
|
|
As a particular case, |
|
|
|
the syntax expects a single expression inside a parenthesized expression; |
|
|
|
therefore, adding parentheses around a multires expression |
|
|
|
forces it to produce exactly one result. |
|
|
|
|
|
|
|
Here are some examples. |
|
|
|
In all cases, when the construction needs |
|
|
|
@Q{the n-th result} and there is no such result, |
|
|
|
it uses a @nil. |
|
|
|
@verbatim{ |
|
|
|
print(x, f()) -- prints x and all results from f(). |
|
|
|
print(x, (f())) -- prints x and the first result from f(). |
|
|
|
print(f(), x) -- prints the first result from f() and x. |
|
|
|
print(1 + f()) -- prints 1 added to the first result from f(). |
|
|
|
x,y = ... -- x gets the first vararg argument, |
|
|
|
-- y gets the second vararg argument. |
|
|
|
x,y,z = w, f() -- x gets w, y gets the first result from f(), |
|
|
|
-- z gets the second result from f(). |
|
|
|
x,y,z = f() -- x gets the first result from f(), |
|
|
|
-- y gets the second result from f(), |
|
|
|
-- z gets the third result from f(). |
|
|
|
x,y,z = f(), g() -- x gets the first result from f(), |
|
|
|
-- y gets the first result from g(), |
|
|
|
-- z gets the second result from g(). |
|
|
|
x,y,z = (f()) -- x gets the first result from f(), y and z get nil. |
|
|
|
return f() -- returns all results from f(). |
|
|
|
return ... -- returns all received vararg arguments. |
|
|
|
return (...) -- returns the first received vararg argument. |
|
|
|
return x,y,f() -- returns x, y, and all results from f(). |
|
|
|
{f()} -- creates a list with all results from f(). |
|
|
|
{...} -- creates a list with all vararg arguments. |
|
|
|
{f(), 5} -- creates a list with the first result from f() and 5. |
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
@sect2{visibility| @title{Visibility Rules} |
|
|
@ -4780,7 +4822,7 @@ the number of parameters of the function |
|
|
|
} |
|
|
|
|
|
|
|
@item{@id{isvararg}| |
|
|
|
true if the function is a vararg function |
|
|
|
true if the function is a variadic function |
|
|
|
(always true for @N{C functions}). |
|
|
|
} |
|
|
|
|
|
|
@ -6017,9 +6059,7 @@ to start the traceback. |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
@APIEntry{const char *luaL_typeerror (lua_State *L, |
|
|
|
int arg, |
|
|
|
const char *tname);| |
|
|
|
@APIEntry{int luaL_typeerror (lua_State *L, int arg, const char *tname);| |
|
|
|
@apii{0,0,v} |
|
|
|
|
|
|
|
Raises a type error for the argument @id{arg} |
|
|
@ -6816,6 +6856,8 @@ When you require a module @id{modname} and |
|
|
|
This variable is only a reference to the real table; |
|
|
|
assignments to this variable do not change the |
|
|
|
table used by @Lid{require}. |
|
|
|
The real table is stored in the C registry @see{registry}, |
|
|
|
indexed by the key @defid{LUA_LOADED_TABLE}, a string. |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
@ -6883,6 +6925,8 @@ A table to store loaders for specific modules |
|
|
|
This variable is only a reference to the real table; |
|
|
|
assignments to this variable do not change the |
|
|
|
table used by @Lid{require}. |
|
|
|
The real table is stored in the C registry @see{registry}, |
|
|
|
indexed by the key @defid{LUA_PRELOAD_TABLE}, a string. |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
@ -7904,9 +7948,9 @@ Returns the arc sine of @id{x} (in radians). |
|
|
|
|
|
|
|
@LibEntry{math.atan (y [, x])| |
|
|
|
|
|
|
|
@index{atan2} |
|
|
|
@index{atan} @index{atan2} |
|
|
|
Returns the arc tangent of @T{y/x} (in radians), |
|
|
|
but uses the signs of both arguments to find the |
|
|
|
using the signs of both arguments to find the |
|
|
|
quadrant of the result. |
|
|
|
It also handles correctly the case of @id{x} being zero. |
|
|
|
|
|
|
@ -8997,7 +9041,7 @@ If there is a script, |
|
|
|
the script is called with arguments |
|
|
|
@T{arg[1]}, @Cdots, @T{arg[#arg]}. |
|
|
|
Like all chunks in Lua, |
|
|
|
the script is compiled as a vararg function. |
|
|
|
the script is compiled as a variadic function. |
|
|
|
|
|
|
|
In interactive mode, |
|
|
|
Lua repeatedly prompts and waits for a line. |
|
|
|