2.5 – Expressions
The basic expressions in Lua are the following:
exp ::= prefixexp
exp ::= nil | false | true
exp ::= Number
exp ::= String
exp ::= function
exp ::= tableconstructor
exp ::= `...´
exp ::= exp binop exp
exp ::= unop exp
prefixexp ::= var | functioncall | `(´ exp `)´
Numbers and literal strings are explained in §2.1;
variables are explained in §2.3;
function definitions are explained in §2.5.9;
function calls are explained in §2.5.8;
table constructors are explained in §2.5.7.
Vararg expressions, denoted by three dots (‘...
’), can only be used when directly inside a vararg function; they are explained in §2.5.9.
Binary operators comprise arithmetic operators (see §2.5.1), relational operators (see §2.5.2), logical operators (see §2.5.3), and the concatenation operator (see §2.5.4).
Unary operators comprise the unary minus (see §2.5.1), the unary not (see §2.5.3), and the unary length operator (see §2.5.5).
Both function calls and vararg expressions can result in multiple values. If an expression is used as a statement (only possible for function calls (see §2.4.6)), 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 call is enclosed in parentheses). In all other contexts, Lua adjusts the result list to one element, discarding all values except the first one.
Here are some examples:
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 parameter, b gets
-- the second (both a and b can get nil if there
-- is no corresponding vararg parameter)
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 parameters
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 parameters
{
f(), nil} -- f() is adjusted to 1 result
Any expression enclosed in parentheses always results in only one value. Thus, (f(x,y,z))
is always a single value, even if f
returns several values. (The value of (f(x,y,z))
is the first value returned by f
or nil if f
does not return any values.)
2.5.1 – Arithmetic Operators
Lua supports the usual arithmetic operators: the binary +
(addition), -
(subtraction), *
(multiplication), /
(division), %
(modulo), and ^
(exponentiation); and unary -
(negation). If the operands are numbers, or strings that can be converted to numbers (see §2.2.1), then all operations have the usual meaning. Exponentiation works for any exponent. For instance, x^(-0.5)
computes the inverse of the square root of x
. Modulo is defined as
a % b == a - math.floor(a/b)*b
That is, it is the remainder of a division that rounds the quotient towards minus infinity.
2.5.2 – Relational Operators
The relational operators in Lua are
== ~= < > <= >=
These operators always result in false or true.
Equality (==
) first compares the type of its operands. If the types are different, then the result is false. 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 reference: two objects are considered equal only if they are the same object. Every time you create a new object (a table, userdata, thread, or function), this new object is different from any previously existing object.
You can change the way that Lua compares tables and userdata by using the “eq” metamethod (see §2.8).
The conversion rules of §2.2.1 do not apply to equality comparisons. Thus, "0"==0
evaluates to false, and t[0]
and t["0"]
denote different entries in a table.
The operator ~=
is exactly the negation of equality (==
).
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