aboutsummaryrefslogtreecommitdiff
path: root/runtime/doc/luaref.txt
diff options
context:
space:
mode:
Diffstat (limited to 'runtime/doc/luaref.txt')
-rw-r--r--runtime/doc/luaref.txt4966
1 files changed, 4966 insertions, 0 deletions
diff --git a/runtime/doc/luaref.txt b/runtime/doc/luaref.txt
new file mode 100644
index 0000000000..9dbd2d4de5
--- /dev/null
+++ b/runtime/doc/luaref.txt
@@ -0,0 +1,4966 @@
+*luaref.txt* Nvim
+ *luaref* *Lua-Reference*
+
+ LUA REFERENCE MANUAL
+
+
+ Version 0.3.0
+ August 7th, 2022
+
+
+ Vimdoc version (c) 2006 by Luis Carvalho
+ <lexcarvalho at gmail dot com>
+
+ Adapted from "Lua: 5.1 reference manual"
+ R. Ierusalimschy, L. H. de Figueiredo, W. Celes
+ Copyright (c) 2006 Lua.org, PUC-Rio.
+
+
+ See |luaref-doc| for information on this manual.
+ See |luaref-copyright| for copyright and licenses.
+
+
+ CONTENTS
+ ============
+
+ 1 INTRODUCTION........................|luaref-intro|
+
+ 2 THE LANGUAGE........................|luaref-language|
+ 2.1 Lexical Conventions...............|luaref-langLexConv|
+ 2.2 Values and Types..................|luaref-langValTypes|
+ 2.2.1 Coercion........................|luaref-langCoercion|
+ 2.3 Variables.........................|luaref-langVariables|
+ 2.4 Statements........................|luaref-langStats|
+ 2.4.1 Chunks..........................|luaref-langChunks|
+ 2.4.2 Blocks..........................|luaref-langBlocks|
+ 2.4.3 Assignment......................|luaref-langAssign|
+ 2.4.4 Control Structures..............|luaref-langContStructs|
+ 2.4.5 For Statement...................|luaref-langForStat|
+ 2.4.6 Function Calls as Statements....|luaref-langFuncStat|
+ 2.4.7 Local Declarations..............|luaref-langLocalDec|
+ 2.5 Expressions.......................|luaref-langExpressions|
+ 2.5.1 Arithmetic Operators............|luaref-langArithOp|
+ 2.5.2 Relational Operators............|luaref-langRelOp|
+ 2.5.3 Logical Operators...............|luaref-langLogOp|
+ 2.5.4 Concatenation...................|luaref-langConcat|
+ 2.5.5 The Length Operator.............|luaref-langLength|
+ 2.5.6 Precedence......................|luaref-langPrec|
+ 2.5.7 Table Constructors..............|luaref-langTableConst|
+ 2.5.8 Function Calls..................|luaref-langFuncCalls|
+ 2.5.9 Function Definitions............|luaref-langFuncDefs|
+ 2.6 Visibility Rules..................|luaref-langVisibRules|
+ 2.7 Error Handling....................|luaref-langError|
+ 2.8 Metatables........................|luaref-langMetatables|
+ 2.9 Environments......................|luaref-langEnvironments|
+ 2.10 Garbage Collection...............|luaref-langGC|
+ 2.10.1 Garbage-Collection Metamethods.|luaref-langGCMeta|
+ 2.10.2 Weak Tables....................|luaref-langWeaktables|
+ 2.11 Coroutines.......................|luaref-langCoro|
+
+ 3 THE APPLICATION PROGRAM INTERFACE...|luaref-api|
+ 3.1 The Stack.........................|luaref-apiStack|
+ 3.2 Stack Size........................|luaref-apiStackSize|
+ 3.3 Pseudo-Indices....................|luaref-apiPseudoIndices|
+ 3.4 C Closures........................|luaref-apiCClosures|
+ 3.5 Registry..........................|luaref-apiRegistry|
+ 3.6 Error Handling in C...............|luaref-apiError|
+ 3.7 Functions and Types...............|luaref-apiFunctions|
+ 3.8 The Debug Interface...............|luaref-apiDebug|
+
+ 4 THE AUXILIARY LIBRARY...............|luaref-aux|
+ 4.1 Functions and Types...............|luaref-auxFunctions|
+
+ 5 STANDARD LIBRARIES..................|luaref-lib|
+ 5.1 Basic Functions...................|luaref-libBasic|
+ 5.2 Coroutine Manipulation............|luaref-libCoro|
+ 5.3 Modules...........................|luaref-libModule|
+ 5.4 String Manipulation...............|luaref-libString|
+ 5.4.1 Patterns........................|luaref-libStringPat|
+ 5.5 Table Manipulation................|luaref-libTable|
+ 5.6 Mathematical Functions............|luaref-libMath|
+ 5.7 Input and Output Facilities.......|luaref-libIO|
+ 5.8 Operating System Facilities.......|luaref-libOS|
+ 5.9 The Debug Library.................|luaref-libDebug|
+
+ A BIBLIOGRAPHY........................|luaref-bibliography|
+ B COPYRIGHT & LICENSES................|luaref-copyright|
+ C LUAREF DOC..........................|luaref-doc|
+
+
+==============================================================================
+1 INTRODUCTION *luaref-intro*
+==============================================================================
+
+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 scripting language for any program that needs one. Lua is
+implemented as a library, written in clean C (that is, in the common subset of
+ANSI C and C++).
+
+Being an extension language, Lua has no notion of a "main" program: it only
+works embedded in a host client, called the embedding program or simply the
+host. 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.
+
+Lua is free software, and is provided as usual with no guarantees, as stated
+in its license. The implementation described in this manual is available at
+Lua's official web site, www.lua.org.
+
+Like any other reference manual, this document is dry in places. For a
+discussion of the decisions behind the design of Lua, see references at
+|luaref-bibliography|. For a detailed introduction to programming in Lua, see
+Roberto's book, Programming in Lua.
+
+Lua means "moon" in Portuguese and is pronounced LOO-ah.
+
+==============================================================================
+2 THE LANGUAGE *luaref-language*
+==============================================================================
+
+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.
+
+The language constructs will be explained using the usual extended BNF
+notation, in which { `a` } means 0 or more `a`'s, and [ `a` ] means an optional `a`.
+
+==============================================================================
+2.1 Lexical Conventions *luaref-langLexConv*
+
+ *luaref-names* *luaref-identifiers*
+Names (also called identifiers) 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.) Identifiers are used to name variables
+and table fields.
+
+The following keywords are reserved and cannot be used as names:
+>
+ and break do else elseif
+ end false for function if
+ in local nil not or
+ repeat return then true until while
+<
+Lua is a case-sensitive language: `and` is a reserved word, but `And` and `AND` are
+two different, valid names. As a convention, names starting with an underscore
+followed by uppercase letters (such as `_VERSION`) are reserved for internal
+global variables used by Lua.
+
+The following strings denote other tokens:
+>
+ + - * / % ^ #
+ == ~= <= >= < > =
+ ( ) { } [ ]
+ ; : , . .. ...
+<
+ *luaref-literal*
+Literal strings can be delimited by matching single or double quotes, and can
+contain the following C-like escape sequences:
+
+ - `\a` bell
+ - `\b` backspace
+ - `\f` form feed
+ - `\n` newline
+ - `\r` carriage return
+ - `\t` horizontal tab
+ - `\v` vertical tab
+ - `\\` backslash
+ - `\"` quotation mark (double quote)
+ - `\'` apostrophe (single quote)
+
+Moreover, 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 `\ddd`, where `ddd` is a sequence of up to three
+decimal digits. (Note that if a numerical escape is to be followed by a digit,
+it must be expressed using exactly three digits.) Strings in Lua may contain
+any 8-bit value, including embedded zeros, which can be specified as `\0`.
+
+To put a double (single) quote, a newline, a backslash, or an embedded zero
+inside a literal string enclosed by double (single) quotes you must use an
+escape sequence. Any other character may be directly inserted into the
+literal. (Some control characters may cause problems for the file system, but
+Lua has no problem with them.)
+
+Literal strings can also be defined using a long format enclosed by long
+brackets. We define an opening long bracket of level n as an opening square
+bracket followed by n equal signs followed by another opening square bracket.
+So, an opening long bracket of level 0 is written as `[[`, an opening long
+bracket of level 1 is written as `[=[`, and so on.
+A closing long bracket is defined similarly; for instance, a closing long
+bracket of level 4 is written as `]====]`. A long string starts with an
+opening long bracket of any level and ends at the first closing long bracket
+of the same level. Literals in this bracketed form may run for several lines,
+do not interpret any escape sequences, and ignore long brackets of any other
+level. They may contain anything except a closing bracket of the proper level.
+
+For convenience, when the opening long bracket is immediately followed by a
+newline, the newline is not included in the string. As an example, in a system
+using ASCII (in which `a` is coded as 97, newline is coded as 10, and `1` is
+coded as 49), the five literals below denote the same string:
+>
+ a = 'alo\n123"'
+ a = "alo\n123\""
+ a = '\97lo\10\04923"'
+ a = [[alo
+ 123"]]
+ a = [==[
+ alo
+ 123"]==]
+<
+ *luaref-numconstant*
+A numerical constant may be written with an optional decimal part and an
+optional decimal exponent. Lua also accepts integer hexadecimal constants, by
+prefixing them with `0x`. Examples of valid numerical constants are
+>
+ 3 3.0 3.1416 314.16e-2 0.31416E1 0xff 0x56
+<
+ *luaref-comment*
+A comment starts with a double hyphen (`--`) anywhere outside a string. If the
+text immediately after `--` is not an opening long bracket, the comment is a
+short comment, which runs until the end of the line. Otherwise, it is a long
+comment, which runs until the corresponding closing long bracket. Long
+comments are frequently used to disable code temporarily.
+
+==============================================================================
+2.2 Values and Types *luaref-langValTypes*
+
+Lua is a dynamically typed language. This means that variables do not have
+types; only values do. There are no type definitions in the language. All
+values carry their own type.
+
+All values in Lua are first-class values. This means that all values can be
+stored in variables, passed as arguments to other functions, and returned as
+results.
+
+ *luaref-types* *luaref-nil*
+ *luaref-true* *luaref-false*
+ *luaref-number* *luaref-string*
+There are eight basic types in Lua: `nil`, `boolean`, `number`, `string`,
+`function`, `userdata`, `thread`, and `table`. Nil is the type of the value
+`nil`, whose main property is to be different from any other value; it usually
+represents the absence of a useful value. Boolean is the type of the values
+`false` and `true`. Both `nil` and `false` make a condition false; any other
+value makes it true. Number 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;
+see file `luaconf.h`.) String represents arrays of characters. Lua is 8-bit
+clean: strings may contain any 8-bit character, including embedded zeros
+(`\0`) (see |luaref-literal|).
+
+Lua can call (and manipulate) functions written in Lua and functions written
+in C (see |luaref-langFuncCalls|).
+
+ *luaref-userdatatype*
+The type userdata 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 metatables, the programmer can define operations for userdata values
+(see |luaref-langMetatables|). 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.
+
+ *luaref-thread*
+The type `thread` represents independent threads of execution and it is used to
+implement coroutines (see |luaref-langCoro|). Do not confuse Lua threads with
+operating-system threads. Lua supports coroutines on all systems, even those
+that do not support threads.
+
+ *luaref-table*
+The type `table` implements associative arrays, that is, arrays that can be
+indexed not only with numbers, but with any value (except `nil`). Tables can
+be heterogeneous; that is, they can contain values of all types (except
+`nil`). 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 `a.name` as syntactic sugar
+for `a["name"]`. There are several convenient ways to create tables in Lua
+(see |luaref-langTableConst|).
+
+Like indices, the value of a table field can be of any type (except `nil`). In
+particular, because functions are first-class values, table fields may contain
+functions. Thus tables may also carry methods (see |luaref-langFuncDefs|).
+
+Tables, functions, threads and (full) userdata values are objects: variables
+do not actually contain these values, only references to them. Assignment,
+parameter passing, and function returns always manipulate references to such
+values; these operations do not imply any kind of copy.
+
+The library function `type` returns a string describing the type of a given
+value (see |luaref-type|).
+
+------------------------------------------------------------------------------
+2.2.1 Coercion *luaref-langCoercion*
+
+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 conversion 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 `format` function from the string library (see
+|luaref-string.format|).
+
+==============================================================================
+2.3 Variables *luaref-langVariables*
+
+Variables are places that store values. There are three kinds of variables in
+Lua: global variables, local variables, and table fields.
+
+A single name can denote a global variable or a local variable (or a
+function's formal parameter, which is a particular form of local variable):
+>
+ var ::= Name
+<
+Name denotes identifiers, as defined in |luaref-langLexConv|.
+
+Any variable is assumed to be global unless explicitly declared as a local
+(see |luaref-langLocalDec|). Local variables are lexically scoped: local
+variables can be freely accessed by functions defined inside their scope (see
+|luaref-langVisibRules|).
+
+Before the first assignment to a variable, its value is `nil`.
+
+Square brackets are used to index a table:
+>
+ var ::= prefixexp [ exp ]
+<
+The first expression (`prefixexp`) should result in a table value; the second
+expression (`exp`) identifies a specific entry inside that table. The
+expression denoting the table to be indexed has a restricted syntax; see
+|luaref-langExpressions| for details.
+
+The syntax `var.NAME` is just syntactic sugar for `var["NAME"]` :
+>
+ var ::= prefixexp . Name
+<
+All global variables live as fields in ordinary Lua tables, called environment
+tables or simply environments (see |luaref-langEnvironments|). Each function
+has its own reference to an environment, so that all global variables in this
+function will refer to this environment table. When a function is created, it
+inherits the environment from the function that created it. To get the
+environment table of a Lua function, you call `getfenv` (see
+|luaref-getfenv|). To replace it, you call `setfenv` (see |luaref-setfenv|).
+(You can only manipulate the environment of C functions through the debug
+library; see |luaref-libDebug|.)
+
+An access to a global variable `x` is equivalent to `_env.x`, which in turn is
+equivalent to
+>
+ gettable_event(_env, "x")
+<
+where `_env` is the environment of the running function. (The `_env` variable is
+not defined in Lua. We use it here only for explanatory purposes.)
+
+The meaning of accesses to global variables and table fields can be changed
+via metatables. An access to an indexed variable `t[i]` is equivalent to a
+call `gettable_event(t,i)`. (See |luaref-langMetatables| for a complete
+description of the `gettable_event` function. This function is not defined or
+callable in Lua. We use it here only for explanatory purposes.)
+
+==============================================================================
+2.4 Statements *luaref-langStats*
+
+Lua supports an almost conventional set of statements, similar to those in
+Pascal or C. This set includes assignment, control structures, function
+calls, and variable declarations.
+
+------------------------------------------------------------------------------
+2.4.1 Chunks *luaref-chunk* *luaref-langChunks*
+
+The unit of execution of Lua is called a chunk. A chunk is simply a sequence
+of statements, which are executed sequentially. Each statement can be
+optionally followed by a semicolon:
+>
+ chunk ::= {stat [ ; ]}
+<
+There are no empty statements and thus `;;` is not legal.
+
+Lua handles a chunk as the body of an anonymous function with a variable
+number of arguments (see |luaref-langFuncDefs|). As such, chunks can define
+local variables, receive arguments, and return values.
+
+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 instructions for a virtual
+machine, and then the compiled code is executed by an interpreter for the
+virtual machine.
+
+Chunks may also be pre-compiled into binary form; see program `luac` for
+details. Programs in source and compiled forms are interchangeable; Lua
+automatically detects the file type and acts accordingly.
+
+------------------------------------------------------------------------------
+2.4.2 Blocks *luaref-block* *luaref-langBlocks*
+
+A block is a list of statements; syntactically, a block is the same as a
+chunk:
+>
+ block ::= chunk
+<
+ *luaref-do* *luaref-end*
+A block may be explicitly delimited to produce a single statement:
+>
+ stat ::= do block end
+<
+Explicit blocks are useful to control the scope of variable declarations.
+Explicit blocks are also sometimes used to add a `return` or `break` statement
+in the middle of another block (see |luaref-langContStructs|).
+
+------------------------------------------------------------------------------
+2.4.3 Assignment *luaref-langAssign*
+
+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:
+>
+ stat ::= varlist1 = explist1
+ varlist1 ::= var { , var }
+ explist1 ::= exp { , exp }
+<
+Expressions are discussed in |luaref-langExpressions|.
+
+Before the assignment, the list of values is adjusted 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 `nil`s as needed. If the list of expressions ends with a function
+call, then all values returned by this call enter in the list of values,
+before the adjustment (except when the call is enclosed in parentheses; see
+|luaref-langExpressions|).
+
+The assignment statement first evaluates all its expressions and only then are
+the assignments performed. Thus the code
+>
+ i = 3
+ i, a[i] = i+1, 20
+<
+sets `a[3]` to 20, without affecting `a[4]` because the `i` in `a[i]` is evaluated (to
+3) before it is assigned 4. Similarly, the line
+>
+ x, y = y, x
+<
+exchanges the values of `x` and `y`.
+
+The meaning of assignments to global variables and table fields can be changed
+via metatables. An assignment to an indexed variable `t[i] = val` is
+equivalent to `settable_event(t,i,val)`. (See |luaref-langMetatables| for a
+complete description of the `settable_event` function. This function is not
+defined or callable in Lua. We use it here only for explanatory purposes.)
+
+An assignment to a global variable `x = val` is equivalent to the
+assignment `_env.x = val`, which in turn is equivalent to
+>
+ settable_event(_env, "x", val)
+<
+where `_env` is the environment of the running function. (The `_env` variable is
+not defined in Lua. We use it here only for explanatory purposes.)
+
+------------------------------------------------------------------------------
+2.4.4 Control Structures *luaref-langContStructs*
+
+ *luaref-if* *luaref-then* *luaref-else* *luaref-elseif*
+ *luaref-while* *luaref-repeat* *luaref-until*
+The control structures `if`, `while`, and `repeat` have the usual meaning and
+familiar syntax:
+>
+ stat ::= while exp do block end
+ stat ::= repeat block until exp
+ stat ::= if exp then block { elseif exp then block }
+ [ else block ] end
+<
+Lua also has a `for` statement, in two flavors (see |luaref-langForStat|).
+
+The condition expression of a control structure may return any value.
+Both `false` and `nil` are considered false. All values different
+from `nil` and `false` are considered true (in particular, the number 0 and the
+empty string are also true).
+
+In the `repeat-until` loop, the inner block does not end at the `until` keyword,
+but only after the condition. So, the condition can refer to local variables
+declared inside the loop block.
+
+ *luaref-return*
+The `return` statement is used to return values from a function or a chunk
+(which is just a function). Functions and chunks may return more than one
+value, so the syntax for the `return` statement is
+
+ `stat ::=` `return` `[explist1]`
+
+ *luaref-break*
+The `break` statement is used to terminate the execution of a `while`, `repeat`,
+or `for` loop, skipping to the next statement after the loop:
+
+ `stat ::=` `break`
+
+A `break` ends the innermost enclosing loop.
+
+The `return` and `break` statements can only be written as the `last`
+statement of a block. If it is really necessary to `return` or `break` in the
+middle of a block, then an explicit inner block can be used, as in the idioms
+`do return end` and `do break end`, because now `return` and `break` are
+the last statements in their (inner) blocks.
+
+------------------------------------------------------------------------------
+2.4.5 For Statement *luaref-for* *luaref-langForStat*
+
+The `for` statement has two forms: one numeric and one generic.
+
+The numeric `for` loop repeats a block of code while a control variable runs
+through an arithmetic progression. It has the following syntax:
+>
+ stat ::= for Name = exp , exp [ , exp ] do block end
+<
+The `block` is repeated for `name` starting at the value of the first `exp`, until
+it passes the second `exp` by steps of the third `exp`. More precisely,
+a `for` statement like
+
+ `for var =` `e1, e2, e3` `do` `block` `end`
+
+is equivalent to the code:
+
+ `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`
+
+Note the following:
+
+ - All three control expressions are evaluated only once, before the loop
+ starts. They must all result in numbers.
+ - `var`, `limit` and `step` are invisible variables. The names are here for
+ explanatory purposes only.
+ - If the third expression (the step) is absent, then a step of 1 is used.
+ - You can use `break` to exit a `for` loop.
+ - The loop variable `var` is local to the loop; you cannot use its value
+ after the `for` ends or is broken. If you need this value, assign it to
+ another variable before breaking or exiting the loop.
+
+ *luaref-in*
+The generic `for` statement works over functions, called iterators. On each
+iteration, the iterator function is called to produce a new value, stopping
+when this new value is `nil`. The generic `for` loop has the following syntax:
+>
+ stat ::= for namelist in explist1 do block end
+ namelist ::= Name { , Name }
+<
+A `for` statement like
+
+ `for` `var1, ..., varn` `in` `explist` `do` `block` `end`
+
+is equivalent to the code:
+
+ `do`
+ `local` `f, s, var` `=` `explist`
+ `while true do`
+ `local` `var1, ..., varn` `=` `f(s, var)`
+ `var` `=` `var1`
+ `if` `var` `== nil then break end`
+ `block`
+ `end`
+ `end`
+
+Note the following:
+
+ - `explist` is evaluated only once. Its results are an iterator function,
+ a `state`, and an initial value for the first iterator variable.
+ - `f`, `s`, and `var` are invisible variables. The names are here for
+ explanatory purposes only.
+ - You can use `break` to exit a `for` loop.
+ - The loop variables `var1, ..., varn` are local to the loop; you cannot use
+ their values after the `for` ends. If you need these values, then assign
+ them to other variables before breaking or exiting the loop.
+
+------------------------------------------------------------------------------
+2.4.6 Function Calls as Statements *luaref-langFuncStat*
+
+To allow possible side-effects, function calls can be executed as statements:
+>
+ stat ::= functioncall
+<
+In this case, all returned values are thrown away. Function calls are
+explained in |luaref-langFuncCalls|.
+
+------------------------------------------------------------------------------
+2.4.7 Local Declarations *luaref-local* *luaref-langLocalDec*
+
+Local variables may be declared anywhere inside a block. The declaration may
+include an initial assignment:
+>
+ stat ::= local namelist [ = explist1 ]
+ namelist ::= Name { , Name }
+<
+If present, an initial assignment has the same semantics of a multiple
+assignment (see |luaref-langAssign|). Otherwise, all variables are initialized
+with `nil`.
+
+A chunk is also a block (see |luaref-langChunks|), and so local variables can be
+declared in a chunk outside any explicit block. The scope of such local
+variables extends until the end of the chunk.
+
+The visibility rules for local variables are explained in
+|luaref-langVisibRules|.
+
+==============================================================================
+2.5 Expressions *luaref-langExpressions*
+
+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 |luaref-langLexConv|; variables are
+explained in |luaref-langVariables|; function definitions are explained in
+|luaref-langFuncDefs|; function calls are explained in |luaref-langFuncCalls|;
+table constructors are explained in |luaref-langTableConst|. Vararg expressions,
+denoted by three dots (`...`), can only be used inside vararg functions;
+they are explained in |luaref-langFuncDefs|.
+
+Binary operators comprise arithmetic operators (see |luaref-langArithOp|),
+relational operators (see |luaref-langRelOp|), logical operators (see
+|luaref-langLogOp|), and the concatenation operator (see |luaref-langConcat|).
+Unary operators comprise the unary minus (see |luaref-labgArithOp|), the unary
+`not` (see |luaref-langLogOp|), and the unary length operator (see
+|luaref-langLength|).
+
+Both function calls and vararg expressions may result in multiple values. If
+the expression is used as a statement (see |luaref-langFuncStat|)
+(only possible for function calls), then its return list is adjusted to zero
+elements, thus discarding all returned values. If the 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 may 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
+<
+An 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 *luaref-langArithOp*
+
+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 |luaref-langCoercion|), 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 *luaref-langRelOp*
+
+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, or function), this new object is
+different from any previously existing object.
+
+You can change the way that Lua compares tables and userdata using the "eq"
+metamethod (see |luaref-langMetatables|).
+
+The conversion rules of coercion |luaref-langCoercion| 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 |luaref-langMetatables|).
+
+------------------------------------------------------------------------------
+2.5.3 Logical Operators *luaref-langLogOp*
+
+The logical operators in Lua are
+>
+ and or not
+<
+Like the control structures (see |luaref-langContStructs|), all logical operators
+consider both `false` and `nil` as false and anything else as true.
+
+ *luaref-not* *luaref-and* *luaref-or*
+The negation operator `not` always returns `false` or `true`. The conjunction
+operator `and` returns its first argument if this value is `false` or `nil`;
+otherwise, `and` returns its second argument. The disjunction
+operator `or` returns its first argument if this value is different
+from `nil` and `false`; otherwise, `or` returns its second argument.
+Both `and` and `or` use short-cut evaluation, that is, the second operand is
+evaluated only if necessary. Here are some examples:
+>
+ 10 or 20 --> 10
+ 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
+<
+(In this manual, `-->` indicates the result of the preceding expression.)
+
+------------------------------------------------------------------------------
+2.5.4 Concatenation *luaref-langConcat*
+
+The string concatenation operator in Lua is denoted by two dots (`..`).
+If both operands are strings or numbers, then they are converted to strings
+according to the rules mentioned in |luaref-langCoercion|. Otherwise, the
+"concat" metamethod is called (see |luaref-langMetatables|).
+
+------------------------------------------------------------------------------
+2.5.5 The Length Operator *luaref-langLength*
+
+The length operator is denoted by the unary operator `#`. The length of a
+string is its number of bytes (that is, the usual meaning of string length
+when each character is one byte).
+
+The length of a table `t` is defined to be any integer index `n` such that `t[n]` is
+not `nil` and `t[n+1]` is `nil`; moreover, if `t[1]` is `nil`, `n` may be zero. For a
+regular array, with non-nil values from 1 to a given `n`, its length is exactly
+that `n`, the index of its last value. If the array has "holes" (that
+is, `nil` values between other non-nil values), then `#t` may be any of the
+indices that directly precedes a `nil` value (that is, it may consider any
+such `nil` value as the end of the array).
+
+------------------------------------------------------------------------------
+2.5.6 Precedence *luaref-langPrec*
+
+Operator precedence in Lua follows the table below, from lower to higher
+priority:
+>
+ or
+ and
+ < > <= >= ~= ==
+ ..
+ + -
+ * /
+ not # - (unary)
+ ^
+<
+As usual, you can use parentheses to change the precedences in an expression.
+The concatenation (`..`) and exponentiation (`^`) operators are right
+associative. All other binary operators are left associative.
+
+------------------------------------------------------------------------------
+2.5.7 Table Constructors *luaref-langTableConst*
+
+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
+>
+ tableconstructor ::= { [ fieldlist ] }
+ fieldlist ::= field { fieldsep field } [ fieldsep ]
+ field ::= [ exp ] = exp | Name = exp | exp
+ fieldsep ::= , | ;
+<
+Each field of the form `[exp1] = exp2` adds to the new table an entry with
+key `exp1` and value `exp2`. A field of the form `name = exp` is equivalent to
+`["name"] = exp`. Finally, fields of the form `exp` are equivalent to
+`[i] = exp`, where `i` are consecutive numerical integers, starting with 1.
+Fields in the other formats do not affect this counting. For example,
+>
+ a = { [f(1)] = g; "x", "y"; x = 1, f(x), [30] = 23; 45 }
+<
+is equivalent to
+>
+ do
+ local t = {}
+ t[f(1)] = g
+ t[1] = "x" -- 1st exp
+ t[2] = "y" -- 2nd exp
+ t.x = 1 -- temp["x"] = 1
+ t[3] = f(x) -- 3rd exp
+ t[30] = 23
+ t[4] = 45 -- 4th exp
+ a = t
+ end
+<
+If the last field in the list has the form `exp` and the expression is a
+function call, then all values returned by the call enter the list
+consecutively (see |luaref-langFuncCalls|). To avoid this, enclose the function
+call in parentheses (see |luaref-langExpressions|).
+
+The field list may have an optional trailing separator, as a convenience for
+machine-generated code.
+
+------------------------------------------------------------------------------
+2.5.8 Function Calls *luaref-function* *luaref-langFuncCalls*
+
+A function call in Lua has the following syntax:
+>
+ functioncall ::= prefixexp args
+<
+In a function call, first `prefixex