aboutsummaryrefslogtreecommitdiff
path: root/files/.vim/doc/lua51refvim.txt
diff options
context:
space:
mode:
Diffstat (limited to 'files/.vim/doc/lua51refvim.txt')
-rwxr-xr-xfiles/.vim/doc/lua51refvim.txt5617
1 files changed, 5617 insertions, 0 deletions
diff --git a/files/.vim/doc/lua51refvim.txt b/files/.vim/doc/lua51refvim.txt
new file mode 100755
index 0000000..e80d613
--- /dev/null
+++ b/files/.vim/doc/lua51refvim.txt
@@ -0,0 +1,5617 @@
+*luarefvim.txt* Lua 5.1 Reference Manual for Vim
+ Vim version 7.0
+
+
+ *luaref* *Lua-Reference*
+ Lua Reference for Vim
+ =========================
+ Version 0.2.0
+ November, 25th, 2006
+
+ (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 |lrv-doc| for information on this manual.
+ See |lrv-copyright| for copyright and licenses.
+
+
+ CONTENTS
+ ============
+
+ 1 INTRODUCTION........................|lrv-intro|
+
+ 2 THE LANGUAGE........................|lrv-language|
+ 2.1 Lexical Conventions...............|lrv-langLexConv|
+ 2.2 Values and Types..................|lrv-langValTypes|
+ 2.2.1 Coercion........................|lrv-langCoercion|
+ 2.3 Variables.........................|lrv-langVariables|
+ 2.4 Statements........................|lrv-langStats|
+ 2.4.1 Chunks..........................|lrv-langChunks|
+ 2.4.2 Blocks..........................|lrv-langBlocks|
+ 2.4.3 Assignment......................|lrv-langAssign|
+ 2.4.4 Control Structures..............|lrv-langContStructs|
+ 2.4.5 For Statement...................|lrv-langForStat|
+ 2.4.6 Function Calls as Statements....|lrv-langFuncStat|
+ 2.4.7 Local Declarations..............|lrv-langLocalDec|
+ 2.5 Expressions.......................|lrv-langExpressions|
+ 2.5.1 Arithmetic Operators............|lrv-langArithOp|
+ 2.5.2 Relational Operators............|lrv-langRelOp|
+ 2.5.3 Logical Operators...............|lrv-langLogOp|
+ 2.5.4 Concatenation...................|lrv-langConcat|
+ 2.5.5 The Length Operator.............|lrv-langLength|
+ 2.5.6 Precedence......................|lrv-langPrec|
+ 2.5.7 Table Constructors..............|lrv-langTableConst|
+ 2.5.8 Function Calls..................|lrv-langFuncCalls|
+ 2.5.9 Function Definitions............|lrv-langFuncDefs|
+ 2.6 Visibility Rules..................|lrv-langVisibRules|
+ 2.7 Error Handling....................|lrv-langError|
+ 2.8 Metatables........................|lrv-langMetatables|
+ 2.9 Environments......................|lrv-langEnvironments|
+ 2.10 Garbage Collection...............|lrv-langGC|
+ 2.10.1 Garbage-Collection Metamethods.|lrv-langGCMeta|
+ 2.10.2 Weak Tables....................|lrv-langWeaktables|
+ 2.11 Coroutines.......................|lrv-langCoro|
+
+ 3 THE APPLICATION PROGRAM INTERFACE...|lrv-api|
+ 3.1 The Stack.........................|lrv-apiStack|
+ 3.2 Stack Size........................|lrv-apiStackSize|
+ 3.3 Pseudo-Indices....................|lrv-apiPseudoIndices|
+ 3.4 C Closures........................|lrv-apiCClosures|
+ 3.5 Registry..........................|lrv-apiRegistry|
+ 3.6 Error Handling in C...............|lrv-apiError|
+ 3.7 Functions and Types...............|lrv-apiFunctions|
+ 3.8 The Debug Interface...............|lrv-apiDebug|
+
+ 4 THE AUXILIARY LIBRARY...............|lrv-aux|
+ 4.1 Functions and Types...............|lrv-auxFunctions|
+
+ 5 STANDARD LIBRARIES..................|lrv-lib|
+ 5.1 Basic Functions...................|lrv-libBasic|
+ 5.2 Coroutine Manipulation............|lrv-libCoro|
+ 5.3 Modules...........................|lrv-libModule|
+ 5.4 String Manipulation...............|lrv-libString|
+ 5.4.1 Patterns........................|lrv-libStringPat|
+ 5.5 Table Manipulation................|lrv-libTable|
+ 5.6 Mathematical Functions............|lrv-libMath|
+ 5.7 Input and Output Facilities.......|lrv-libIO|
+ 5.8 Operating System Facilities.......|lrv-libOS|
+ 5.9 The Debug Library.................|lrv-libDebug|
+
+ 6 LUA STAND-ALONE.....................|lrv-LuaSA|
+
+ A INDEX...............................|lrv-index|
+ B BIBLIOGRAPHY........................|lrv-bibliography|
+ C COPYRIGHT & LICENSES................|lrv-copyright|
+ D LUAREFVIM DOC.......................|lrv-doc|
+ D.1 Installation.......................|lrv-docInstall|
+ D.2 Usage..............................|lrv-docUsage|
+
+
+==============================================================================
+1 INTRODUCTION *lrv-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.
+
+The Lua distribution includes a sample host program called$lua$, which uses
+the Lua library to offer a complete, stand-alone Lua interpreter.
+
+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
+|lrv-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 *lrv-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@.
+Non-terminals are shown in@italics@, keywords are shown in#bold#, and other
+terminal symbols are shown in$typewriter$color, enclosed in single quotes.
+
+
+==============================================================================
+2.1 Lexical Conventions *lrv-langLexConv*
+
+
+ *lrv-names* *lrv-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:
+>
+ + - * / % ^ #
+ == ~= <= >= < > =
+ ( ) { } [ ]
+ ; : , . .. ...
+>
+ *lrv-literal*
+@Literal strings@can be delimited by matching single or double quotes, and can
+contain the following C-like escape sequences:
+
+ #o#$\a$: bell
+ #o#$\b$: backspace
+ #o#$\f$: form feed
+ #o#$\n$: newline
+ #o#$\r$: carriage return
+ #o#$\t$: horizontal tab
+ #o#$\v$: vertical tab
+ #o#$\\$: backslash
+ #o#$\"$: quotation mark (double quote)
+ #o#$\'$: 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"]==]
+>
+ *lrv-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
+>
+ *lrv-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 *lrv-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.
+
+ *lrv-types* *lrv-nil* *lrv-true* *lrv-false* *lrv-number* *lrv-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 |lrv-literal|).
+
+Lua can call (and manipulate) functions written in Lua and functions written
+in C (see |lrv-langFuncCalls|).
+
+ *lrv-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 |lrv-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.
+
+ *lrv-thread*
+The type@thread@represents independent threads of execution and it is used to
+implement coroutines (see |lrv-langCoro|). Do not confuse Lua threads with
+operating-system threads. Lua supports coroutines on all systems, even those
+that do not support threads.
+
+ *lrv-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
+|lrv-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 |lrv-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 |lrv-type|).
+
+
+------------------------------------------------------------------------------
+2.2.1 Coercion *lrv-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
+|lrv-string.format|).
+
+
+==============================================================================
+2.3 Variables *lrv-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 |lrv-langLexConv|.
+
+Any variable is assumed to be global unless explicitly declared as a local
+(see |lrv-langLocalDec|). Local variables are@lexically scoped@: local
+variables can be freely accessed by functions defined inside their scope (see
+|lrv-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
+|lrv-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 |lrv-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 |lrv-getfenv|). To replace it, you call$setfenv$(see
+|lrv-setfenv|). (You can only manipulate the environment of C functions
+through the debug library; see |lrv-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 |lrv-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 *lrv-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 *lrv-chunk* *lrv-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 |lrv-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 *lrv-block* *lrv-langBlocks*
+
+
+A block is a list of statements; syntactically, a block is the same as a
+chunk:
+>
+ block ::= chunk
+>
+ *lrv-do* *lrv-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 |lrv-langContStructs|).
+
+
+------------------------------------------------------------------------------
+2.4.3 Assignment *lrv-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 |lrv-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
+|lrv-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 |lrv-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 *lrv-langContStructs*
+
+ *lrv-if* *lrv-then* *lrv-else* *lrv-elseif*
+ *lrv-while* *lrv-repeat* *lrv-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 |lrv-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.
+
+ *lrv-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]$
+
+ *lrv-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 *lrv-for* *lrv-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:
+
+ #o#All three control expressions are evaluated only once, before the loop
+ starts. They must all result in numbers.
+ #o#@var@,@limit@and@step@are invisible variables. The names are here for
+ explanatory purposes only.
+ #o#If the third expression (the step) is absent, then a step of 1 is used.
+ #o#You can use#break#to exit a#for#loop.
+ #o#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.
+
+ *lrv-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:
+
+ #o#@explist@is evaluated only once. Its results are an@iterator@function,
+ a@state@, and an initial value for the first@iterator variable@.
+ #o#@f@,@s@, and@var@are invisible variables. The names are here for
+ explanatory purposes only.
+ #o#You can use#break#to exit a#for#loop.
+ #o#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 *lrv-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 |lrv-langFuncCalls|.
+
+
+------------------------------------------------------------------------------
+2.4.7 Local Declarations *lrv-local* *lrv-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 |lrv-langAssign|). Otherwise, all variables are initialized
+with#nil#.
+
+A chunk is also a block (see |lrv-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
+|lrv-langVisibRules|.
+
+
+==============================================================================
+2.5 Expressions *lrv-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 |lrv-langLexConv|; variables are
+explained in |lrv-langVariables|; function definitions are explained in
+|lrv-langFuncDefs|; function calls are explained in |lrv-langFuncCalls|;
+table constructors are explained in |lrv-langTableConst|. Vararg expressions,
+denoted by three dots ($`...'$), can only be used inside vararg functions;
+they are explained in |lrv-langFuncDefs|.
+
+Binary operators comprise arithmetic operators (see |lrv-langArithOp|),
+relational operators (see |lrv-langRelOp|), logical operators (see
+|lrv-langLogOp|), and the concatenation operator (see |lrv-langConcat|).
+Unary operators comprise the unary minus (see |lrv-labgArithOp|), the unary
+#not# (see |lrv-langLogOp|), and the unary@length operator@(see
+|lrv-langLength|).
+
+Both function calls and vararg expressions may result in multiple values. If
+the expression is used as a statement (see |lrv-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 *lrv-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 |lrv-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 *lrv-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 |lrv-langMetatables|).
+
+The conversion rules of coercion |lrv-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 |lrv-langMetatables|).
+
+
+------------------------------------------------------------------------------
+2.5.3 Logical Operators *lrv-langLogOp*
+
+
+The logical operators in Lua are
+>
+ and or not
+>
+Like the control structures (see |lrv-langContStructs|), all logical operators
+consider both#false#and#nil#as false and anything else as true.
+
+ *lrv-not* *lrv-and* *lrv-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 *lrv-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 |lrv-langCoercion|. Otherwise, the
+"concat" metamethod is called (see |lrv-langMetatables|).
+
+
+------------------------------------------------------------------------------
+2.5.5 The Length Operator *lrv-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 *lrv-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 *lrv-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 |lrv-langFuncCalls|). To avoid this, enclose the function
+call in parentheses (see |lrv-langExpressions|).
+
+The field list may have an optional trailing separator, as a convenience for
+machine-generated code.
+
+
+------------------------------------------------------------------------------
+2.5.8 Function Calls *lrv-function* *lrv-langFuncCalls*
+
+
+A function call in Lua has the following syntax:
+>
+ functioncall ::= prefixexp args
+>
+In a function call, first@prefixexp@and@args@are evaluated. If the value
+of@prefixexp@has type@function@, then this function is called with the given
+arguments. Otherwise, the@prefixexp@"call" metamethod is called, having as
+first parameter the value of@prefixexp@, followed by the original call
+arguments (see |lrv-langMetatables|).
+
+The form
+
+ $functioncall ::= prefixexp$#`:'#$Name args$
+
+can be used to call "methods". A call$v:name($@args@$)$is syntactic sugar
+for$v.name(v,$@args@$)$, except that$v$is evaluated only once.
+
+Arguments have the following syntax:
+
+ $args ::= $#`('#$[ explist1 ]$#`)'#
+ $args ::= tableconstructor$
+ $args ::= String$
+
+All argument expressions are evaluated before the call. A call of the
+form$f{$@fields@$}$is syntactic sugar for $f({$@fields@$})$, that is, the
+argument list is a single new table. A call of the form$f'$@string@$'$
+(or$f"$@string@$"$or$f[[$@string@$]]$) is syntactic sugar for
+$f('$@string@$')$, that is, the argument list is a single literal string.
+
+As an exception to the free-format syntax of Lua, you cannot put a line break
+before the$'('$ in a function call. This restriction avoids some ambiguities
+in the language. If you write
+>
+ a = f
+ (g).x(a)
+>
+Lua would see that as a single statement,$a = f(g).x(a)$. So, if you want two
+statements, you must add a semi-colon between them. If you actually want to
+call$f$, you must remove the line break before$(g)$.
+
+ *lrv-tailcall*
+A call of the form$return$@functioncall@is called a@tail call@. Lua
+implements@proper tail calls@(or@proper tail recursion@): 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#return#has one single function call as argument; this syntax makes the
+calling function return exactly the returns of the called function. So, none
+of the following examples are tail calls:
+>
+ 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
+>
+
+------------------------------------------------------------------------------
+2.5.9 Function Definitions *lrv-langFuncDefs*
+
+
+The syntax for function definition is
+
+ $function ::=$#function#$funcbody$
+ $funcbody ::=$#`('#$[ parlist1 ]$#`)'#$block$#end#
+
+The following syntactic sugar simplifies function definitions:
+
+ $stat ::=$#function#$funcname funcbody$
+ $stat ::=$#local function#$Name funcbody$
+ $funcname ::= Name {$#`.'#$Name } [$#`:'#$Name ]$
+
+The statement
+
+ $function f ()$@body@$end$
+
+translates to
+
+ $f = function ()$@body@$end$
+
+The statement
+
+ $function t.a.b.c.f ()$@body@$end$
+
+translates to
+
+ $t.a.b.c.f = function ()$@body@$end$
+
+The statement
+
+ $local function f ()$@body@$end$
+
+translates to
+
+ $local f; f = function f ()$@body@$end$
+
+@not@to
+
+ $local f = function f ()$@body@$end$
+
+(This only makes a difference when the body of the function contains
+references to$f$.)
+
+ *lrv-closure*
+A function definition is an executable expression, whose value has
+type@function@. When Lua pre-compiles a chunk, all its function bodies are
+pre-compiled too. Then, whenever Lua executes the function definition, the
+function is@instantiated@(or@closed@). This function instance (or@closure@)
+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.
+
+Parameters act as local variables that are initialized with the argument
+values:
+
+ $parlist1 ::= namelist [$#`,' `...'#$] |$#`...'#
+
+ *lrv-vararg*
+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@vararg function@,
+which is indicated by three dots ($`...'$) at the end of its parameter list.
+A vararg function does not adjust its argument list; instead, it collects all
+extra arguments and supplies them to the function through a@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 the call is enclosed in parentheses).
+
+As an example, consider the following definitions:
+>
+ function f(a, b) end
+ function g(a, b, ...) end
+ function r() return 1,2,3 end
+>
+Then, we have the following mapping from arguments to parameters and to the
+vararg expression:
+>
+ 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, ... --> (nothing)
+ g(3, 4) a=3, b=4, ... --> (nothing)
+ g(3, 4, 5, 8) a=3, b=4, ... --> 5 8
+ g(5, r()) a=5, b=1, ... --> 2 3
+>
+Results are returned using the#return#statement (see |lrv-langContStructs|).
+If control reaches the end of a function without encountering
+a#return#statement, then the function returns with no results.
+
+ *lrv-colonsyntax*
+The@colon@syntax is used for defining@methods@, that is, functions that have
+an implicit extra parameter$self$. Thus, the statement
+
+ $function t.a.b.c:f ($@params@$)$@body@$end$
+
+is syntactic sugar for
+
+ $t.a.b.c:f = function (self, ($@params@$)$@body@$end$
+
+
+==============================================================================
+2.6 Visibility Rules *lrv-langVisibRules*
+
+
+Lua is a lexically scoped language. The scope of variables begins at the
+first statement@after@their declaration and lasts until the end of the
+innermost block that includes the declaration. Consider the following example:
+>
+ 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)
+>
+Notice that, in a declaration like$local x = x$, the new$x$being declared is
+not in scope yet, and so the second$x$refers to the outside variable.
+
+ *lrv-upvalue*
+Because of the lexical scoping rules, local variables can be freely accessed
+by functions defined inside their scope. A local variable used by an inner
+function is called an@upvalue@, or@external local variable@, inside the inner
+function.
+
+Notice that each execution of a#local#statement defines new local variables.
+Consider the following example:
+>
+ a = {}
+ local x = 20
+ for i=1,10 do
+ local y = 0
+ a[i] = function () y=y+1; return x+y end
+ end
+>
+The loop creates ten closures (that is, ten instances of the anonymous
+function). Each of these closures uses a different$y$variable, while all of
+them share the same$x$.
+
+
+==============================================================================
+2.7 Error Handling *lrv-langError*
+
+
+Because Lua is an embedded extension language, all Lua actions start from
+C code in the host program calling a function from the Lua library (see
+|lrv-lua_pcall|). Whenever an error occurs during Lua compilation or
+execution, control returns to C, which can take appropriate measures (such as
+print an error message).
+
+Lua code can explicitly generate an error by calling the$error$function (see
+|lrv-error|). If you need to catch errors in Lua, you can use
+the$pcall$function (see |lrv-pcall|).
+
+
+==============================================================================
+2.8 Metatables *lrv-metatable* *lrv-langMetatables*
+
+
+Every value in Lua may have a@metatable@. This@metatable@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 a
+non-numeric value is the operand of an addition, Lua checks for a function in
+the field$"__add"$in its metatable. If it finds one, Lua calls that function
+to perform the addition.
+
+We call the keys in a metatable@events@and the values@metamethods@. In the
+previous example, the event is$"add"$and the metamethod is the function that
+performs the addition.
+
+You can query the metatable of any value through the$getmetatable$function
+(see |lrv-getmetatable|).
+
+You can replace the metatable of tables through the$setmetatable$function (see
+|lrv-setmetatable|). You cannot change the metatable of other types from Lua
+(except using the debug library); you must use the C API for that.
+
+Tables and userdata have individual metatables (although multiple tables and
+userdata can share a same table as their metatable); values of all other types
+share one single metatable per type. So, there is one single metatable for all
+numbers, and for all strings, etc.
+
+A metatable may control how an object behaves in arithmetic operations, order
+comparisons, concatenation, length operation, 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@event@. When
+Lua performs one of those operations over a value, it checks whether this
+value has a metatable with the corresponding event. If so, the value
+associated with that key (the@metamethod@) controls how Lua will perform the
+operation.
+
+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$"__add"$. The semantics of these operations is better explained
+by a Lua function describing how the interpreter executes that operation.
+
+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 ($rawget$,$tonumber$, etc.) are
+described in |lrv-libBasic|. In particular, to retrieve the metamethod of a
+given object, we use the expression
+>
+ metatable(obj)[event]
+>
+This should be read as
+>
+ rawget(metatable(obj) or {}, event)
+>
+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#nil#).
+
+$"add":$ *lrv-__add*
+--------
+the$+$operation.
+
+The function$getbinhandler$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.
+>
+ function getbinhandler (op1, op2, event)
+ return metatable(op1)[event] or metatable(op2)[event]
+ end
+>
+By using this function, the behavior of the$op1 + op2$is
+>
+ 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
+>
+$"sub":$ *lrv-__sub*
+--------
+the$-$operation. Behavior similar to the "add" operation.
+
+$"mul":$ *lrv-__mul*
+--------
+the$*$operation. Behavior similar to the "add" operation.
+
+$"div":$ *lrv-__div*
+--------
+the$/$operation. Behavior similar to the "add" operation.
+
+$"mod":$ *lrv-__mod*
+--------
+the$%$operation. Behavior similar to the "add" operation, with the
+operation$o1 - floor(o1/o2)*o2$as the primitive operation.
+
+$"pow":$ *lrv-__pow*
+--------
+the$^$(exponentiation) operation. Behavior similar to the "add" operation,
+with the function$pow$(from the C math library) as the primitive operation.
+
+$"unm":$ *lrv-__unm*
+--------
+the unary$-$operation.
+>
+ 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
+ return h(op)
+ else -- no handler available: default behavior
+ error(...)
+ end
+ end
+ end
+>
+$"concat":$ *lrv-__concat*
+-----------
+the$..$(concatenation) operation.
+>
+ 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
+>
+$"len":$ *lrv-__len*
+-----------
+the$#$operation.
+>
+ function len_event (op)
+ if type(op) == "string" then
+ return strlen(op) -- primitive string length
+ elseif type(op) == "table" then
+ return #op -- primitive table length
+ else
+ local h = metatable(op).__len
+ if h then
+ -- call the handler with the operand
+ return h(op)
+ else -- no handler available: default behavior
+ error(...)
+ end
+ end
+ end
+>
+$"eq":$ *lrv-__eq*
+-------
+the$==$operation.
+
+The function$getcomphandler$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.
+>
+ 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
+>
+The "eq" event is defined as follows:
+>
+ 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
+>
+$a ~= b$is equivalent to$not (a == b)$.
+
+$"lt":$ *lrv-__lt*
+-------
+the$<$operation.
+>
+ 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
+>
+$a > b$is equivalent to$b < a$.
+
+$"le":$ *lrv-__le*
+-------
+the$<=$operation.
+>
+ 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
+>
+$a >= b$is equivalent to$b <= a$. Note that, in the absence of a "le"
+metamethod, Lua tries the "lt", assuming that$a <= b$is equivalent
+to$not (b < a)$.
+
+$"index":$ *lrv-__index*
+----------
+The indexing access$table[key]$.
+>
+ 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
+>
+$"newindex":$ *lrv-__newindex*
+-------------
+The indexing assignment$table[key] = value$.
+>
+ 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
+>
+$"call":$ *lrv-__call*
+---------
+called when Lua calls a value.
+>
+ function function_event (func, ...)
+ if type(func) == "function" then
+ return func(...) -- primitive call
+ else
+ local h = metatable(func).__call
+ if h then
+ return h(func, ...)
+ else
+ error(...)
+ end
+ end
+ end
+>
+
+==============================================================================
+2.9 Environments *lrv-environment* *lrv-langEnvironments*
+
+
+Besides metatables, objects of types thread, function, and userdata have
+another table associated with them, called their@environment@. Like
+metatables, environments are regular tables and multiple objects can share the
+same environment.
+
+Environments associated with userdata have no meaning for Lua. It is only a
+convenience feature for programmers to associate a table to a userdata.
+
+Environments associated with threads are called@global environments@. They are
+used as the default environment for their threads and non-nested functions
+created by the thread (through$loadfile$|lrv-loadfile|,
+$loadstring$|lrv-loadstring| or$load$|lrv-load|) and can be directly accessed
+by C code (see |lrv-apiPseudoIndices|).
+
+
+Environments associated with C functions can be directly accessed by C code
+(see |lrv-apiPseudoIndices|). They are used as the default environment for
+other C functions created by the function.
+
+Environments associated with Lua functions are used to resolve all accesses to
+global variables within the function (see |lrv-langVariables|). They are used
+as the default environment for other Lua functions created by the function.
+
+You can change the environment of a Lua function or the running thread by
+calling$setfenv$(see |lrv-setenv|). You can get the environment of a Lua
+function or the running thread by calling$getfenv$(see |lrv-getfenv|). To
+manipulate the environment of other objects (userdata, C functions, other
+threads) you must use the C API.
+
+
+==============================================================================
+2.10 Garbage Collection *lrv-langGC*
+
+
+Lua performs automatic memory management. This means that you do not have to
+worry neither about allocating memory for new objects nor about freeing it
+when the objects are no longer needed. Lua manages memory automatically by
+running a@garbage collector@from time to time to collect all@dead objects@
+(that is, these objects that are no longer accessible from Lua). All objects
+in Lua are subject to automatic management: tables, userdata, functions,
+threads, and strings.
+
+Lua implements an incremental mark-and-sweep collector. It uses two numbers to
+control its garbage-collection cycles: the@garbage-collector pause@and the
+@garbage-collector step multiplier@.
+
+The garbage-collector pause controls how long the collector waits before
+starting a new cycle. Larger values make the collector less aggressive. Values
+smaller than 1 mean the collector will not wait to start a new cycle. A value
+of 2 means that the collector waits for the total memory in use to double
+before starting a new cycle.
+
+The step multiplier controls the relative speed of the collector relative to
+memory allocation. Larger values make the collector more aggressive but also
+increase the size of each incremental step. Values smaller than 1 make the
+collector too slow and may result in the collector never finishing a cycle.
+The default, 2, means that the collector runs at "twice" the speed of memory
+allocation.
+
+You can change these numbers by calling$lua_gc$(see |lrv-lua_gc|) in C or
+$collectgarbage$(see |lrv-collectgarbage|) in Lua. Both get percentage points
+as arguments (so an argument of 100 means a real value of 1). With these
+functions you can also control the collector directly (e.g., stop and restart
+it).
+
+
+------------------------------------------------------------------------------
+2.10.1 Garbage-Collection Metamethods *lrv-langGCMeta*
+
+
+Using the C API, you can set garbage-collector metamethods for userdata (see
+|lrv-langMetatables|). These metamethods are also called@finalizers@.
+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).
+
+ *lrv-__gc*
+Garbage userdata with a field$__gc$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:
+>
+ function gc_event (udata)
+ local h = metatable(udata).__gc
+ if h then
+ h(udata)
+ end
+ end
+>
+At the end of each garbage-collection cycle, the finalizers for userdata are
+called in@reverse@order of their creation, among these collected in that
+cycle. That is, the first finalizer to be called is the one associated with
+the userdata created last in the program.
+
+
+------------------------------------------------------------------------------
+2.10.2 - Weak Tables *lrv-weaktable* *lrv-langWeaktables*
+
+
+A@weak table@is a table whose elements are@weak references@. 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 this
+object.
+
+ *lrv-__mode*
+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$__mode$field of its metatable. If the$__mode$field is a
+string containing the character$'k'$, the keys in the table are weak.
+If$__mode$contains$'v'$, the values in the table are weak.
+
+After you use a table as a metatable, you should not change the value of its
+field$__mode$. Otherwise, the weak behavior of the tables controlled by this
+metatable is undefined.
+
+
+==============================================================================
+2.11 Coroutines *lrv-coroutine* *lrv-langCoro*
+
+
+Lua supports coroutines, also called@collaborative multithreading@.
+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.
+
+You create a coroutine with a call to$coroutine.create$(see
+|lrv-coroutine.create|). Its sole argument is a function that is the main
+function of the coroutine. The$create$function only creates a new coroutine
+and returns a handle to it (an object of type@thread@); it does not start the
+coroutine execution.
+
+When you first call$coroutine.resume$(see |lrv-coroutine.resume|), passing as
+its first argument the thread returned by$coroutine.create$, the coroutine
+starts its execution, at the first line of its main function. Extra arguments
+passed to$coroutine.resume$are passed on to the coroutine main function. After
+the coroutine starts running, it runs until it terminates or@yields@.
+
+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,
+$coroutine.resume$returns#true#, plus any values returned by the coroutine
+main function. In case of errors,$coroutine.resume$returns#false#plus an error
+message.
+
+A coroutine yields by calling$coroutine.yield$(see |lrv-coroutine.yield|).
+When a coroutine yields, the corresponding$coroutine.resume$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,$coroutine.resume$also
+returns#true#, plus any values passed to$coroutine.yield$. The next time you
+resume the same coroutine, it continues its execution from the point where it
+yielded, with the call to$coroutine.yield$returning any extra arguments passed
+to$coroutine.resume$.
+
+Like$coroutine.create$, the$coroutine.wrap$function (see |lrv-coroutine.wrap|)
+also creates a coroutine, but instead of returning the coroutine itself, it
+returns a function that, when called, resumes the coroutine. Any arguments
+passed to this function go as extra arguments to$coroutine.resume$.
+$coroutine.wrap$returns all the values returned by$coroutine.resume$, except
+the first one (the boolean error code). Unlike$coroutine.resume$,
+$coroutine.wrap$does not catch errors; any error is propagated to the caller.
+
+As an example, consider the next code:
+>
+ 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)
+
+ print("main", coroutine.resume(co, 1, 10))
+ print("main", coroutine.resume(co, "r"))
+ print("main", coroutine.resume(co, "x", "y"))
+ print("main", coroutine.resume(co, "x", "y"))
+>
+When you run it, it produces the following output:
+>
+ 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
+>
+
+==============================================================================
+3 THE APPLICATION PROGRAM INTERFACE *lrv-API*
+==============================================================================
+
+
+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$lua.h$.
+
+Even when we use the term "function", any facility in the API may be provided
+as a@macro@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.
+
+As in most C libraries, the Lua API functions do not check their arguments for
+validity or consistency. However, you can change this behavior by compiling
+Lua with a proper definition for the macro$luai_apicheck$,in file$luaconf.h$.
+
+
+==============================================================================
+3.1 The Stack *lrv-stack* *lrv-apiStack*
+
+
+Lua uses a@virtual stack@to pass values to and from C. Each element in this
+stack represents a Lua value (#nil#, number, string, etc.).
+
+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. This 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
+|lrv-lua_CFunction|).
+
+ *lrv-stackindex*
+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
+@index@: a positive index represents an@absolute@stack position (starting
+at 1); a negative index represents an@offset@from the top of the stack.
+More specifically, if the stack has@n@elements, then index 1 represents the
+first element (that is, the element that was pushed onto the stack first) and
+index@n@represents the last element; index@-1@also represents the last element
+(that is, the element at the top) and index@-n@represents the first element.
+We say that an index is@valid@if it lies between 1 and the stack top (that is,
+if$1 <= abs(index) <= top$).
+
+
+==============================================================================
+3.2 Stack Size *lrv-apiStackSize*
+
+
+When you interact with Lua API, you are responsible for ensuring consistency.
+In particular, @you are responsible for controlling stack overflow@. You can
+use the function$lua_checkstack$to grow the stack size (see
+|lrv-lua_checkstack|).
+
+Whenever Lua calls C, it ensures that at least$LUA_MINSTACK$stack positions
+are available.$LUA_MINSTACK$is defined as 20, so that usually you do not have
+to worry about stack space unless your code has loops pushing elements onto
+the stack.
+
+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$lua_checkstack$. Such indices are called@acceptable indices@. More
+formally, we define an@acceptable index@as follows:
+>
+ (index < 0 && abs(index) <= top) || (index > 0 && index <= stackspace)
+>
+Note that 0 is never an acceptable index.
+
+
+==============================================================================
+3.3 Pseudo-Indices *lrv-pseudoindex* *lrv-apiPseudoIndices*
+
+
+Unless otherwise noted, any function that accepts valid indices can also be
+called with@pseudo-indices@, which represent some Lua values that are
+accessible to the C code but which are not in the stack. Pseudo-indices are
+used to access the thread environment, the function environment, the registry,
+and the upvalues of a C function (see |lrv-apiCClosures|).
+
+The thread environment (where global variables live) is always at pseudo-index
+$LUA_GLOBALSINDEX$. The environment of the running C function is always at
+pseudo-index$LUA_ENVIRONINDEX$.
+
+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
+>
+ lua_getfield(L, LUA_GLOBALSINDEX, varname);
+>
+
+==============================================================================
+3.4 C Closures *lrv-cclosure* *lrv-apiCClosures*
+
+
+When a C function is created, it is possible to associate some values with it,
+thus creating a@C closure@; these values are called@upvalues@and are
+accessible to the function whenever it is called (see |lrv-lua_pushcclosure|).
+
+
+Whenever a C function is called, its upvalues are located at specific
+pseudo-indices. These pseudo-indices are produced by the macro
+$lua_upvalueindex$(see |lrv-lua_upvalueindex|). The first value associated
+with a function is at position$lua_upvalueindex(1)$, and so on. Any access to
+$lua_upvalueindex($@n@$)$, where@n@is greater than the number of upvalues of
+the current function, produces an acceptable (but invalid) index.
+
+
+==============================================================================
+3.5 Registry *lrv-registry* *lrv-apiRegistry*
+
+
+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. This table is always
+located at pseudo-index$LUA_REGISTRYINDEX$. Any C library can store data into
+this table, but it should take care to choose keys different from those used
+by other libraries, to avoid collisions. 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.
+
+The integer keys in the registry are used by the reference mechanism,
+implemented by the auxiliary library, and therefore should not be used for
+other purposes.
+
+
+==============================================================================
+3.6 Error Handling in C *lrv-apiError*
+
+
+Internally, Lua uses the C$longjmp$facility to handle errors. (You can also
+choose to use exceptions if you use C++; see file$luaconf.h$.) When Lua faces
+any error (such as memory allocation errors, type errors, syntax errors, and
+runtime errors) it@raises@an error; that is, it does a long jump.
+A@protected environment@uses$setjmp$to set a recover point; any error jumps to
+the most recent active recover point.
+
+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:
+$lua_newstate$,$lua_close$,$lua_load$,$lua_pcall$, and$lua_cpcall$(see
+|lrv-lua_newstate|, |lrv-lua_close|, |lrv-lua_load|, |lrv-lua_pcall|, and
+|lrv-lua_cpcall|).
+
+Inside a C function you can raise an error by calling$lua_error$ (see
+|lrv-lua_error|).
+
+
+==============================================================================
+3.7 Functions and Types *lrv-apiFunctions*
+
+
+Here we list all functions and types from the C API in alphabetical order.
+
+
+$lua_Alloc$ *lrv-lua_Alloc*
+-----------
+>
+ typedef void * (*lua_Alloc) (void *ud,
+ void *ptr,
+ size_t osize,
+ size_t nsize);
+>
+The type of the memory-allocation function used by Lua states. The allocator
+function must provide a functionality similar to$realloc$, but not exactly the
+same. Its arguments are$ud$, an opaque pointer passed to$lua_newstate$
+(see |lrv-lua_newstate|);$ptr$, a pointer to the block being
+allocated/reallocated/freed;$osize$, the original size of the block;
+$nsize$, the new size of the block.$ptr$is$NULL$if and only if$osize$is zero.
+When$nsize$is zero, the allocator must return$NULL$; if$osize$is not zero,
+it should free the block pointed to by$ptr$. When$nsize$is not zero, the
+allocator returns$NULL$if and only if it cannot fill the request.
+When$nsize$is not zero and$osize$is zero, the allocator should behave
+like$malloc$. When$nsize$and$osize$are not zero, the allocator behaves like
+$realloc$. Lua assumes that the allocator never fails when$osize >= nsize$.
+
+Here is a simple implementation for the allocator function. It is used in the
+auxiliary library by$luaL_newstate$(see |lrv-luaL_newstate|).
+>
+ static void *l_alloc (void *ud, void *ptr, size_t osize,
+ size_t nsize) {
+ (void)ud; (void)osize; /* not used */
+ if (nsize == 0) {
+ free(ptr);
+ return NULL;
+ }
+ else
+ return realloc(ptr, nsize);
+ }
+>
+This code assumes that$free(NULL)$has no effect and that
+$realloc(NULL, size)$is equivalent to$malloc(size)$. ANSI C ensures both
+behaviors.
+
+
+$lua_atpanic$ *lrv-lua_atpanic*
+-------------
+>
+ lua_CFunction lua_atpanic (lua_State *L, lua_CFunction panicf);
+>
+Sets a new panic function and returns the old one.
+
+If an error happens outside any protected environment, Lua calls a@panic@
+@function@and then calls$exit(EXIT_FAILURE)$, thus exiting the host
+application. Your panic function may avoid this exit by never returning (e.g.,
+doing a long jump).
+
+The panic function can access the error message at the top of the stack.
+
+
+$lua_call$ *lrv-lua_call*
+----------
+>
+ void lua_call (lua_State *L, int nargs, int nresults);
+>
+Calls a function.
+
+To call a function you must use the following protocol: first, the function to
+be called is pushed onto the stack; then, the arguments to the function are
+pushed in direct order; that is, the first argument is pushed first. Finally
+you call$lua_call$;$nargs$is the number of arguments that you pushed onto the
+stack. All arguments and the function value are popped from the stack when the
+function is called. The function results are pushed onto the stack when the
+function returns. The number of results is adjusted to$nresults$, unless
+$nresults$is$LUA_MULTRET$. In this case,@all@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 of the
+stack.
+
+Any error inside the called function is propagated upwards (with a$longjmp$).
+
+The following example shows how the host program may do the equivalent to this
+Lua code:
+>
+ a = f("how", t.x, 14)
+>
+Here it is in C:
+>
+ lua_getfield(L, LUA_GLOBALSINDEX, "f"); /* function to be called */
+ lua_pushstring(L, "how"); /* 1st argument */
+ lua_getfield(L, LUA_GLOBALSINDEX, "t"); /* table to be indexed */
+ lua_getfield(L, -1, "x"); /* push result of t.x (2nd arg) */
+ lua_remove(L, -2); /* remove 't' from the stack */
+ lua_pushinteger(L, 14); /* 3rd argument */
+ lua_call(L, 3, 1); /* call 'f' with 3 arguments and 1 result */
+ lua_setfield(L, LUA_GLOBALSINDEX, "a"); /* set global 'a' */
+>
+Note that the code above is "balanced": at its end, the stack is back to its
+original configuration. This is considered good programming practice.
+
+
+$lua_CFunction$ *lrv-cfunction* *lrv-lua_CFunction*
+---------------
+>
+ typedef int (*lua_CFunction) (lua_State *L);
+>
+Type for C functions.
+
+In order to communicate properly with Lua, a C function must use 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,$lua_gettop(L)$
+(see |lrv-lua_gettop|) returns the number of arguments received by the
+function. The first argument (if any) is at index 1 and its last argument is
+at index$lua_gettop(L)$. 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 discarded by Lua. Like a Lua function, a C function called by
+Lua can also return many results.
+
+ *lrv-cfunctionexample*
+As an example, the following function receives a variable number of numerical
+arguments and returns their average and sum:
+>
+ static int foo (lua_State *L) {
+ int n = lua_gettop(L); /* number of arguments */
+ lua_Number sum = 0;
+ int i;
+ for (i = 1; i &lt;= n; i++) {
+ if (!lua_isnumber(L, i)) {
+ lua_pushstring(L, "incorrect argument");
+ 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 */
+ }
+>
+
+$lua_checkstack$ *lrv-lua_checkstack*
+----------------
+>
+ int lua_checkstack (lua_State *L, int extra);
+>
+Ensures that there are at least$extra$free stack slots in the stack. 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.
+
+
+$lua_close$ *lrv-lua_close*
+-----------
+>
+ void lua_close (lua_State *L);
+>
+Destroys all objects in the given Lua state (calling the corresponding
+garbage-collection metamethods, if any) and frees all dynamic memory used by
+this 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.
+
+
+$lua_concat$ *lrv-lua_concat*
+------------
+>
+ void lua_concat (lua_State *L, int n);
+>
+Concatenates the$n$values at the top of the stack, pops them, and leaves the
+result at the top. If$n$is 1, the result is the single string on the stack
+(that is, the function does nothing); if$n$is 0, the result is the empty
+string. Concatenation is done following the usual semantics of Lua (see
+|lrv-langConcat|).
+
+
+$lua_cpcall$ *lrv-lua_cpcall*
+------------
+>
+ int lua_cpcall (lua_State *L, lua_CFunction func, void *ud);
+>
+Calls the C function$func$in protected mode.$func$starts with only one element
+in its stack, a light userdata containing$ud$. In case of errors,
+$lua_cpcall$returns the same error codes as$lua_pcall$(see |lrv-lua_pcall|),
+plus the error object on the top of the stack; otherwise, it returns zero, and
+does not change the stack. All values returned by$func$are discarded.
+
+
+$lua_createtable$ *lrv-lua_createtable*
+-----------------
+>
+ void lua_createtable (lua_State *L, int narr, int nrec);
+>
+Creates a new empty table and pushes it onto the stack. The new table has
+space pre-allocated for$narr$array elements and$nrec$non-array elements. This
+pre-allocation is useful when you know exactly how many elements the table
+will have. Otherwise you can use the function$lua_newtable$ (see
+|lrv-lua_newtable|).
+
+
+$lua_dump$ *lrv-lua_dump*
+----------
+>
+ int lua_dump (lua_State *L, lua_Writer writer, void *data);
+>
+Dumps a function as a binary chunk. Receives a Lua function on the top of the
+stack and produces a binary chunk that, if loaded again, results in a function
+equivalent to the one dumped. As it produces parts of the chunk,$lua_dump$
+calls function$writer$(see |lrv-lua_Writer|) with the given$data$to write
+them.
+
+The value returned is the error code returned by the last call to the writer;
+0 means no errors.
+
+This function does not pop the Lua function from the stack.
+
+
+$lua_equal$ *lrv-lua_equal*
+-----------
+>
+ int lua_equal (lua_State *L, int index1, int index2);
+>
+Returns 1 if the two values in acceptable indices$index1$and$index2$are equal,
+following the semantics of the Lua$==$operator (that is, may call
+metamethods). Otherwise returns 0. Also returns 0 if any of the indices is non
+valid.
+
+
+$lua_error$ *lrv-lua_error*
+-----------
+>
+ int lua_error (lua_State *L);
+>
+Generates a Lua error. The error message (which can actually be a Lua value of
+any type) must be on the stack top. This function does a long jump, and
+therefore never returns (see |lrv-luaL_error|).
+
+
+$lua_gc$ *lrv-lua_gc*
+--------
+>
+ int lua_gc (lua_State *L, int what, int data);
+>
+Controls the garbage collector.
+
+This function performs several tasks, according to the value of the parameter
+$what$:
+
+ #o#$LUA_GCSTOP$: stops the garbage collector.
+ #o#$LUA_GCRESTART$: restarts the garbage collector.
+ #o#$LUA_GCCOLLECT$: performs a full garbage-collection cycle.
+ #o#$LUA_GCCOUNT$: returns the current amount of memory (in Kbytes) in use by
+ Lua.
+ #o#$LUA_GCCOUNTB$: returns the remainder of dividing the current amount of
+ bytes of memory in use by Lua by 1024.
+ #o#$LUA_GCSTEP$: performs an incremental step of garbage collection. The
+ step "size" is controlled by$data$(larger values mean more steps) in a
+ non-specified way. If you want to control the step size you must
+ experimentally tune the value of$data$. The function returns 1 if the
+ step finished a garbage-collection cycle.
+ #o#$LUA_GCSETPAUSE$: sets$data$/100 as the new value for the@pause@of the
+ collector (see |lrv-langGC|). The function returns the previous value of
+ the pause.
+ #o#$LUA_GCSETSTEPMUL$: sets$data$/100 as the new value for the@step@
+ @multiplier@ of the collector (see |lrv-langGC|). The function returns
+ the previous value of the step multiplier.
+
+
+$lua_getallocf$ *lrv-lua_getallocf*
+---------------
+>
+ lua_Alloc lua_getallocf (lua_State *L, void **ud);
+>
+Returns the memory-allocation function of a given state. If$ud$is not$NULL$,
+Lua stores in$*ud$the opaque pointer passed to$lua_newstate$(see
+|lrv-lua_newstate|).
+
+
+$lua_getfenv$ *lrv-lua_getfenv*
+-------------
+>
+ void lua_getfenv (lua_State *L, int index);
+>
+Pushes onto the stack the environment table of the value at the given index.
+
+
+$lua_getfield$ *lrv-lua_getfield*
+--------------
+>
+ void lua_getfield (lua_State *L, int index, const char *k);
+>
+Pushes onto the stack the value$t[k]$, where$t$is the value at the given valid
+index$index$. As in Lua, this function may trigger a metamethod for the
+"index" event (see |lrv-langMetatables|).
+
+
+$lua_getglobal$ *lrv-lua_getglobal*
+---------------
+>
+ void lua_getglobal (lua_State *L, const char *name);
+>
+Pushes onto the stack the value of the global$name$. It is defined as a macro:
+>
+ #define lua_getglobal(L,s) lua_getfield(L, LUA_GLOBALSINDEX, s)
+>
+
+$lua_getmetatable$ *lrv-lua_getmetatable*
+------------------
+>
+ int lua_getmetatable (lua_State *L, int index);
+>
+Pushes onto the stack the metatable of the value at the given acceptable
+index. If the index is not valid, or if the value does not have a metatable,
+the function returns 0 and pushes nothing on the stack.
+
+
+$lua_gettable$ *lrv-lua_gettable*
+--------------
+>
+ void lua_gettable (lua_State *L, int index);
+>
+Pushes onto the stack the value$t[k]$, where$t$is the value at the given valid
+index$index$and$k$is the value at the top of the stack.
+
+This function pops the key from the stack (putting the resulting value in its
+place). As in Lua, this function may trigger a metamethod for the "index"
+event (see |lrv-langMetatables|).
+
+
+$lua_gettop$ *lrv-lua_gettop*
+------------
+>
+ int lua_gettop (lua_State *L);
+>
+Returns the index of the top element in the stack. Because indices start
+at 1, this result is equal to the number of elements in the stack (and so
+0 means an empty stack).
+
+
+$lua_insert$ *lrv-lua_insert*
+------------
+>
+ void lua_insert (lua_State *L, int index);
+>
+Moves the top element into the given valid index, shifting up the elements
+above this index to open space. Cannot be called with a pseudo-index, because
+a pseudo-index is not an actual stack position.
+
+
+$lua_Integer$ *lrv-lua_Integer*
+-------------
+>
+ typedef ptrdiff_t lua_Integer;
+>
+The type used by the Lua API to represent integral values.
+
+By default it is a$ptrdiff_t$, which is usually the largest integral type the
+machine handles "comfortably".
+
+
+$lua_isboolean$ *lrv-lua_isboolean*
+---------------
+>
+ int lua_isboolean (lua_State *L, int index);
+>
+Returns 1 if the value at the given acceptable index has type boolean, and
+0 otherwise.
+
+
+$lua_iscfunction$ *lrv-lua_iscfunction*
+-----------------
+>
+ int lua_iscfunction (lua_State *L, int index);
+>
+Returns 1 if the value at the given acceptable index is a C function, and
+0 otherwise.
+
+
+$lua_isfunction$ *lrv-lua_isfunction*
+----------------
+>
+ int lua_isfunction (lua_State *L, int index);
+>
+Returns 1 if the value at the given acceptable index is a function (either
+C or Lua), and 0 otherwise.
+
+
+$lua_islightuserdata$ *lrv-lua_islightuserdata*
+---------------------
+>
+ int lua_islightuserdata (lua_State *L, int index);
+>
+Returns 1 if the value at the given acceptable index is a light userdata, and
+0 otherwise.
+
+
+$lua_isnil$ *lrv-lua_isnil*
+-----------
+>
+ int lua_isnil (lua_State *L, int index);
+>
+Returns 1 if the value at the given acceptable index is#nil#, and 0 otherwise.
+
+
+$lua_isnumber$ *lrv-lua_isnumber*
+--------------
+>
+ int lua_isnumber (lua_State *L, int index);
+>
+Returns 1 if the value at the given acceptable index is a number or a string
+convertible to a number, and 0 otherwise.
+
+
+$lua_isstring$ *lrv-lua_isstring*
+--------------
+>
+ int lua_isstring (lua_State *L, int index);
+>
+Returns 1 if the value at the given acceptable index is a string or a number
+(which is always convertible to a string), and 0 otherwise.
+
+
+$lua_istable$ *lrv-lua_istable*
+-------------
+>
+ int lua_istable (lua_State *L, int index);
+>
+Returns 1 if the value at the given acceptable index is a table, and
+0 otherwise.
+
+
+$lua_isthread$ *lrv-lua_isthread*
+--------------
+>
+ int lua_isthread (lua_State *L, int index);
+>
+Returns 1 if the value at the given acceptable index is a thread, and
+0 otherwise.
+
+
+$lua_isuserdata$ *lrv-lua_isuserdata*
+----------------
+>
+ int lua_isuserdata (lua_State *L, int index);
+>
+Returns 1 if the value at the given acceptable index is a userdata (either
+full or light), and 0 otherwise.
+
+
+$lua_lessthan$ *lrv-lua_lessthan*
+--------------
+>
+ int lua_lessthan (lua_State *L, int index1, int index2);
+>
+Returns 1 if the value at acceptable index$index1$is smaller than the value at
+acceptable index$index2$, following the semantics of the Lua$<$operator (that
+is, may call metamethods). Otherwise returns 0. Also returns 0 if any of the
+indices is non valid.
+
+
+$lua_load$ *lrv-lua_load*
+----------
+>
+ int lua_load (lua_State *L,
+ lua_Reader reader,
+ void *data,
+ const char *chunkname);
+>
+Loads a Lua chunk. If there are no errors,$lua_load$pushes the compiled chunk
+as a Lua function on top of the stack. Otherwise, it pushes an error message.
+The return values of$lua_load$are:
+
+ #o##0#: no errors;
+ #o#$LUA_ERRSYNTAX$: syntax error during pre-compilation;
+ #o#$LUA_ERRMEM$: memory allocation error.
+
+This function only loads a chunk; it does not run it.
+
+$lua_load$automatically detects whether the chunk is text or binary, and loads
+it accordingly (see program$luac$, |lrv-luac|).
+
+The$lua_load$function uses a user-supplied$reader$function to read the chunk
+(see |lrv-lua_Reader|). The$data$argument is an opaque value passed to the
+reader function.
+
+The$chunkname$argument gives a name to the chunk, which is used for error
+messages and in debug information (see |lrv-apiDebug|).
+
+
+$lua_newstate$ *lrv-lua_newstate*
+--------------
+>
+ lua_State *lua_newstate (lua_Alloc f, void *ud);
+>
+Creates a new, independent state. Returns$NULL$if cannot create the state (due
+to lack of memory). The argument$f$is the allocator function; Lua does all
+memory allocation for this state through this function. The second argument,
+$ud$, is an opaque pointer that Lua simply passes to the allocator in every
+call.
+
+
+$lua_newtable$ *lrv-lua_newtable*
+--------------
+>
+ void lua_newtable (lua_State *L);
+>
+Creates a new empty table and pushes it onto the stack. It is equivalent to
+$lua_createtable(L, 0, 0)$(see |lrv-lua_createtable|).
+
+
+$lua_newthread$ *lrv-lua_newthread*
+---------------
+>
+ lua_State *lua_newthread (lua_State *L);
+>
+Creates a new thread, pushes it on the stack, and returns a pointer to a
+$lua_State$ (see |lrv-lua_State|) 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 execution stack.
+
+There is no explicit function to close or to destroy a thread. Threads are
+subject to garbage collection, like any Lua object.
+
+
+$lua_newuserdata$ *lrv-lua_newuserdata*
+-----------------
+>
+ void *lua_newuserdata (lua_State *L, size_t size);
+>
+This function allocates a new block of memory with the given size, pushes onto
+the stack a new full userdata with the block address, and returns this
+address.
+
+ *lrv-userdata*
+Userdata represents C values in Lua. 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).
+
+When Lua collects a full userdata with a$gc$metamethod, Lua calls the
+metamethod and marks the userdata as finalized. When this userdata is
+collected again then Lua frees its corresponding memory.
+
+
+$lua_next$ *lrv-lua_next*
+----------
+>
+ int lua_next (lua_State *L, int index);
+>
+Pops a key from the stack, and pushes a key-value pair from the table at the
+given index (the "next" pair after the given key). If there are no more
+elements in the table, then$lua_next$returns 0 (and pushes nothing).
+
+ *lrv-tabletraversal*
+A typical traversal looks like this:
+>
+ /* table is in the stack at index 't' */
+ lua_pushnil(L); /* first key */
+ while (lua_next(L, t) != 0) {
+ /* uses 'key' (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)));
+ /* removes 'value'; keeps 'key' for next iteration */
+ lua_pop(L, 1);
+ }
+>
+While traversing a table, do not call$lua_tolstring$(see |lrv-lua_tolstring|)
+directly on a key, unless you know that the key is actually a string. Recall
+that$lua_tolstring$@changes@the value at the given index; this confuses the
+next call to$lua_next$.
+
+
+$lua_Number$ *lrv-lua_Number*
+------------
+>
+ typedef double lua_Number;
+>
+The type of numbers in Lua. By default, it is double, but that can be changed
+in$luaconf.h$.
+
+Through the configuration file you can change Lua to operate with another type
+for numbers (e.g., float or long).
+
+
+$lua_objlen$ *lrv-lua_objlen*
+------------
+>
+ size_t lua_objlen (lua_State *L, int index);
+>
+Returns the "length" of the value at the given acceptable index: for strings,
+this is the string length; for tables, this is the result of the length
+operator ($'#'$); for userdata, this is the size of the block of memory
+allocated for the userdata; for other values, it is 0.
+
+
+$lua_pcall$ *lrv-lua_pcall*
+-----------
+>
+ lua_pcall (lua_State *L, int nargs, int nresults, int errfunc);
+>
+Calls a function in protected mode.
+
+Both$nargs$and$nresults$have the same meaning as in$lua_call$(see
+|lrv-lua_call|). If there are no errors during the call,$lua_pcall$behaves
+exactly like $lua_call$. However, if there is any error,$lua_pcall$catches it,
+pushes a single value on the stack (the error message), and returns an error
+code. Like $lua_call$,$lua_pcall$always removes the function and its arguments
+from the stack.
+
+If$errfunc$is 0, then the error message returned on the stack is exactly the
+original error message. Otherwise,$errfunc$is the stack index of an@error@
+@handler function@. (In the current implementation, this index cannot be a
+pseudo-index.) In case of runtime errors, this function will be called with
+the error message and its return value will be the message returned on the
+stack by$lua_pcall$.
+
+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$lua_pcall$, since by then the stack has unwound.
+
+The$lua_pcall$function returns 0 in case of success or one of the following
+error codes (defined in$lua.h$):
+
+ #o#$LUA_ERRRUN$: a runtime error.
+ #o#$LUA_ERRMEM$: memory allocation error. For such errors, Lua does not call
+ the error handler function.
+ #o#$LUA_ERRERR$: error while running the error handler function.
+
+
+$lua_pop$ *lrv-lua_pop*
+---------
+>
+ void lua_pop (lua_State *L, int n);
+>
+Pops$n$elements from the stack.
+
+
+$lua_pushboolean$ *lrv-lua_pushboolean*
+-----------------
+>
+ void lua_pushboolean (lua_State *L, int b);
+>
+Pushes a boolean value with value$b$onto the stack.
+
+
+$lua_pushcclosure$ *lrv-lua_pushcclosure*
+------------------
+>
+ void lua_pushcclosure (lua_State *L, lua_CFunction fn, int n);
+>
+Pushes a new C closure onto the stack.
+
+When a C function is created, it is possible to associate some values with it,
+thus creating a C closure (see |lrv-apiCClosures|); 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$lua_pushcclosure$is
+called to create and push the C function onto the stack, with the argument
+$n$telling how many values should be associated with the function.
+$lua_pushcclosure$also pops these values from the stack.
+
+
+$lua_pushcfunction$ *lrv-lua_pushcfunction*
+-------------------
+>
+ void lua_pushcfunction (lua_State *L, lua_CFunction f);
+>
+Pushes a C function onto the stack. This function receives a pointer to a C
+function and pushes onto the stack a Lua value of type$function$that, when
+called, invokes the corresponding C function.
+
+Any function to be registered in Lua must follow the correct protocol to
+receive its parameters and return its results (see |lrv-lua_CFunction|).
+
+$lua_pushcfunction$is defined as a macro:
+>
+ #define lua_pushcfunction(L,f) lua_pushcclosure(L,f,0)
+>
+
+$lua_pushfstring$ *lrv-lua_pushfstring*
+-----------------
+>
+ const char *lua_pushfstring (lua_State *L, const char *fmt, ...);
+>
+Pushes onto the stack a formatted string and returns a pointer to this string.
+It is similar to the C function$sprintf$, but has some important differences:
+
+ #o# You do not have to allocate space for the result: the result is a Lua
+ string and Lua takes care of memory allocation (and deallocation,
+ through garbage collection).
+ #o# The conversion specifiers are quite restricted. There are no flags,
+ widths, or precisions. The conversion specifiers can only be$'%%'$
+ (inserts a$'%'$in the string),$'%s'$(inserts a zero-terminated string,
+ with no size restrictions),$'%f'$(inserts a$lua_Number$),$'%p'$(inserts
+ a pointer as a hexadecimal numeral),$'%d'$(inserts an$int$), and$'%c'$
+ (inserts an$int$as a character).
+
+
+$lua_pushinteger$ *lrv-lua_pushinteger*
+-----------------
+>
+ void lua_pushinteger (lua_State *L, lua_Integer n);
+>
+Pushes a number with value$n$onto the stack.
+
+
+$lua_pushlightuserdata$ *lrv-lua_pushlightuserdata*
+-----------------------
+>
+ void lua_pushlightuserdata (lua_State *L, void *p);
+>
+Pushes a light userdata onto the stack.
+
+ *lrv-lightuserdata*
+Userdata represents C values in Lua. A@light userdata@represents a pointer. It
+is a value (like a number): you do not create it, it has no individual
+metatable, and it is not collected (as it was never created). A light userdata
+is equal to "any" light userdata with the same C address.
+
+
+$lua_pushlstring$ *lrv-lua_pushlstring*
+-----------------
+>
+ void lua_pushlstring (lua_State *L, const char *s, size_t len);
+>
+Pushes the string pointed to by$s$with size$len$onto the stack. Lua makes (or
+reuses) an internal copy of the given string, so the memory at$s$can be freed
+or reused immediately after the function returns. The string can contain
+embedded zeros.
+
+
+$lua_pushnil$ *lrv-lua_pushnil*
+-------------
+>
+ void lua_pushnil (lua_State *L);
+>
+Pushes a nil value onto the stack.
+
+
+$lua_pushnumber$ *lrv-lua_pushnumber*
+----------------
+>
+ void lua_pushnumber (lua_State *L, lua_Number n);
+>
+Pushes a number with value$n$onto the stack.
+
+
+$lua_pushstring$ *lrv-lua_pushstring*
+----------------
+>
+ void lua_pushstring (lua_State *L, const char *s);
+>
+Pushes the zero-terminated string pointed to by$s$onto the stack. Lua makes
+(or reuses) an internal copy of the given string, so the memory at$s$can be
+freed or reused immediately after the function returns. The string cannot
+contain embedded zeros; it is assumed to end at the first zero.
+
+
+$lua_pushthread$ *lrv-lua_pushthread*
+----------------
+>
+ int lua_pushthread (lua_State *L);
+>
+Pushes the thread represented by$L$onto the stack. Returns 1 if this thread is
+the main thread of its state.
+
+
+$lua_pushvalue$ *lrv-lua_pushvalue*
+---------------
+>
+ void lua_pushvalue (lua_State *L, int index);
+>
+Pushes a copy of the element at the given valid index onto the stack.
+
+
+$lua_pushvfstring$ *lrv-lua_pushvfstring*
+------------------
+>
+ const char *lua_pushvfstring (lua_State *L,
+ const char *fmt,
+ va_list argp);
+>
+Equivalent to$lua_pushfstring$(see |lrv-pushfstring|), except that it
+receives a$va_list$instead of a variable number of arguments.
+
+
+$lua_rawequal$ *lrv-lua_rawequal*
+--------------
+>
+ int lua_rawequal (lua_State *L, int index1, int index2);
+>
+Returns 1 if the two values in acceptable indices$index1$and$index2$are
+primitively equal (that is, without calling metamethods). Otherwise
+returns 0. Also returns 0 if any of the indices are non valid.
+
+
+$lua_rawget$ *lrv-lua_rawget*
+------------
+>
+ void lua_rawget (lua_State *L, int index);
+>
+Similar to$lua_gettable$(see |lrv-lua_gettable|), but does a raw access
+(i.e., without metamethods).
+
+
+$lua_rawgeti$ *lrv-lua_rawgeti*
+-------------
+>
+ void lua_rawgeti (lua_State *L, int index, int n);
+>
+Pushes onto the stack the value$t[n]$, where$t$is the value at the given valid
+index$index$. The access is raw; that is, it does not invoke metamethods.
+
+
+$lua_rawset$ *lrv-lua_rawset*
+------------
+>
+ void lua_rawset (lua_State *L, int index);
+>
+Similar to$lua_settable$(see |lrv-lua_settable|), but does a raw assignment
+(i.e., without metamethods).
+
+
+$lua_rawseti$ *lrv-lua_rawseti*
+-------------
+>
+ void lua_rawseti (lua_State *L, int index, int n);
+>
+Does the equivalent of$t[n] = v$, where$t$is the value at the given valid
+index$index$and$v$is the value at the top of the stack.
+
+This function pops the value from the stack. The assignment is raw; that is,
+it does not invoke metamethods.
+
+
+$lua_Reader$ *lrv-lua_Reader*
+------------
+>
+ typedef const char * (*lua_Reader) (lua_State *L,
+ void *data,
+ size_t *size);
+>
+The reader function used by$lua_load$(see |lrv-lua_load|). Every time it needs
+another piece of the chunk,$lua_load$calls the reader, passing along its$data$
+parameter. The reader must return a pointer to a block of memory with a new
+piece of the chunk and set$size$to the block size. The block must exist until
+the reader function is called again. To signal the end of the chunk, the
+reader must return$NULL$. The reader function may return pieces of any size
+greater than zero.
+
+
+$lua_register$ *lrv-lua_register*
+--------------
+>
+ void lua_register (lua_State *L,
+ const char *name,
+ lua_CFunction f);
+>
+Sets the C function$f$as the new value of global$name$. It is defined as a
+macro:
+>
+ #define lua_register(L,n,f) \
+ (lua_pushcfunction(L, f), lua_setglobal(L, n))
+>
+
+$lua_remove$ *lrv-lua_remove*
+------------
+>
+ void lua_remove (lua_State *L, int index);
+>
+Removes the element at the given valid index, shifting down the elements above
+this index to fill the gap. Cannot be called with a pseudo-index, because a
+pseudo-index is not an actual stack position.
+
+
+$lua_replace$ *lrv-lua_replace*
+-------------
+>
+ void lua_replace (lua_State *L, int index);
+>
+Moves the top element into the given position (and pops it), without shifting
+any element (therefore replacing the value at the given position).
+
+
+$lua_resume$ *lrv-lua_resume*
+------------
+>
+ int lua_resume (lua_State *L, int narg);
+>
+Starts and resumes a coroutine in a given thread.
+
+To start a coroutine, you first create a new thread (see |lrv-lua_newthread|);
+then you push onto its stack the main function plus any arguments; then you
+call$lua_resume$(see |lrv-lua_resume|) with$narg$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$lua_yield$
+(see |lrv-lua_yield|), or all values returned by the body function.
+$lua_resume$returns$LUA_YIELD$if the coroutine yields, 0 if the coroutine
+finishes its execution without errors, or an error code in case of errors (see
+|lrv-lua_pcall|). In case of errors, the stack is not unwound, so you can use
+the debug API over it. The error message is on the top of the stack. To
+restart a coroutine, you put on its stack only the values to be passed as
+results from$lua_yield$, and then call$lua_resume$.
+
+
+$lua_setallocf$ *lrv-lua_setallocf*
+---------------
+>
+ void lua_setallocf (lua_State *L, lua_Alloc f, void *ud);
+>
+Changes the allocator function of a given state to$f$with user data$ud$.
+
+
+$lua_setfenv$ *lrv-lua_setfenv*
+-------------
+>
+ int lua_setfenv (lua_State *L, int index);
+>
+Pops a table from the stack and sets it as the new environment for the value
+at the given index. If the value at the given index is neither a function nor
+a thread nor a userdata,$lua_setfenv$returns 0. Otherwise it returns 1.
+
+
+$lua_setfield$ *lrv-lua_setfield*
+--------------
+>
+ void lua_setfield (lua_State *L, int index, const char *k);
+>
+Does the equivalent to$t[k] = v$, where$t$is the value at the given valid
+index$index$and$v$is the value at the top of the stack.
+
+This function pops the value from the stack. As in Lua, this function may
+trigger a metamethod for the "newindex" event (see |lrv-langMetatables|).
+
+
+$lua_setglobal$ *lrv-lua_setglobal*
+---------------
+>
+ void lua_setglobal (lua_State *L, const char *name);
+>
+Pops a value from the stack and sets it as the new value of global$name$.
+It is defined as a macro:
+>
+ #define lua_setglobal(L,s) lua_setfield(L, LUA_GLOBALSINDEX, s)
+>
+
+$lua_setmetatable$ *lrv-lua_setmetatable*
+------------------
+>
+ int lua_setmetatable (lua_State *L, int index);
+>
+Pops a table from the stack and sets it as the new metatable for the value at
+the given acceptable index.
+
+
+$lua_settable$ *lrv-lua_settable*
+--------------
+>
+ void lua_settable (lua_State *L, int index);
+>
+Does the equivalent to$t[k] = v$, where$t$is the value at the given valid
+index$index$,$v$is the value at the top of the stack, and$k$is the value just
+below the top.
+
+This function pops both the key and the value from the stack. As in Lua, this
+function may trigger a metamethod for the "newindex" event (see
+|lrv-langMetatables|).
+
+
+$lua_settop$ *lrv-lua_settop*
+------------
+>
+ void lua_settop (lua_State *L, int index);
+>
+Accepts any acceptable index, or 0, and sets the stack top to this index. If
+the new top is larger than the old one, then the new elements are filled with
+#nil#. If$index$is 0, then all stack elements are removed.
+
+
+$lua_State$ *lrv-lua_State*
+-----------
+>
+ typedef struct lua_State lua_State;
+>
+Opaque structure that keeps the whole state of a Lua interpreter. The Lua
+library is fully reentrant: it has no global variables. All information about
+a state is kept in this structure.
+
+A pointer to this state must be passed as the first argument to every function
+in the library, except to$lua_newstate$(see |lrv-lua_newstate|), which
+creates a Lua state from scratch.
+
+
+$lua_status$ *lrv-lua_status*
+------------
+>
+ int lua_status (lua_State *L);
+>
+Returns the status of the thread$L$.
+
+The status can be 0 for a normal thread, an error code if the thread finished
+its execution with an error, or$LUA_YIELD$if the thread is suspended.
+
+
+$lua_toboolean$ *lrv-lua_toboolean*
+---------------
+>
+ int lua_toboolean (lua_State *L, int index);
+>
+Converts the Lua value at the given acceptable index to a C boolean value
+(0 or 1). Like all tests in Lua,$lua_toboolean$returns 1 for any Lua value
+different from#false#and#nil#; otherwise it returns 0. It also returns 0 when
+called with a non-valid index. (If you want to accept only actual boolean
+values, use$lua_isboolean$|lrv-lua_isboolean| to test the value's type.)
+
+
+$lua_tocfunction$ *lrv-lua_tocfunction*
+-----------------
+>
+ lua_CFunction lua_tocfunction (lua_State *L, int index);
+>
+Converts a value at the given acceptable index to a C function. That value
+must be a C function; otherwise it returns$NULL$.
+
+
+$lua_tointeger$ *lrv-lua_tointeger*
+---------------
+>
+ lua_Integer lua_tointeger (lua_State *L, int idx);
+>
+Converts the Lua value at the given acceptable index to the signed integral
+type$lua_Integer$(see |lrv-lua_Integer|). The Lua value must be a number or a
+string convertible to a number (see |lrv-langCoercion|); otherwise,
+$lua_tointeger$returns 0.
+
+If the number is not an integer, it is truncated in some non-specified way.
+
+
+$lua_tolstring$ *lrv-lua_tolstring*
+---------------
+>
+ const char *lua_tolstring (lua_State *L, int index, size_t *len);
+>
+Converts the Lua value at the given acceptable index to a C string. If$len$is
+not$NULL$, it also sets$*len$with the string length. The Lua value must be a
+string or a number; otherwise, the function returns$NULL$. If the value is a
+number, then$lua_tolstring$ also@changes the actual value in the stack to a@
+@string@. (This change confuses$lua_next$|lrv-lua_next| when$lua_tolstring$is
+applied to keys during a table traversal.)
+
+$lua_tolstring$returns a fully aligned pointer to a string inside the Lua
+state. This string always has a zero ($'\0'$) after its last character (as
+in C), but may contain other zeros in its body. Because Lua has garbage
+collection, there is no guarantee that the pointer returned by$lua_tolstring$
+will be valid after the corresponding value is removed from the stack.
+
+
+$lua_tonumber$ *lrv-lua_tonumber*
+--------------
+>
+ lua_Number lua_tonumber (lua_State *L, int index);
+>
+Converts the Lua value at the given acceptable index to the C type$lua_Number$
+(see |lrv-lua_Number|). The Lua value must be a number or a string convertible
+to a number (see |lrv-langCoercion|); otherwise,$lua_tonumber$returns 0.
+
+
+$lua_topointer$ *lrv-lua_topointer*
+---------------
+>
+ const void *lua_topointer (lua_State *L, int index);
+>
+Converts the value at the given acceptable index to a generic C pointer
+($void*$). The value may be a userdata, a table, a thread, or a function;
+otherwise,$lua_topointer$returns$NULL$. Different objects will give different
+pointers. There is no way to convert the pointer back to its original value.
+
+Typically this function is used only for debug information.
+
+
+$lua_tostring$ *lrv-lua_tostring*
+--------------
+>
+ const char *lua_tostring (lua_State *L, int index);
+>
+Equivalent to$lua_tolstring$(see |lrv-lua_tolstring|) with$len$equal to$NULL$.
+
+
+$lua_tothread$ *lrv-lua_tothread*
+--------------
+>
+ lua_State *lua_tothread (lua_State *L, int index);
+>
+Converts the value at the given acceptable index to a Lua thread (represented
+as$lua_State*$|lrv-lua_State|). This value must be a thread; otherwise, the
+function returns$NULL$.
+
+
+$lua_touserdata$ *lrv-lua_touserdata*
+----------------
+>
+ void *lua_touserdata (lua_State *L, int index);
+>
+If the value at the given acceptable index is a full userdata, returns its
+block address. If the value is a light userdata, returns its pointer.
+Otherwise, it returns$NULL$.
+
+
+$lua_type$ *lrv-lua_type*
+----------
+>
+ int lua_type (lua_State *L, int index);
+>
+Returns the type of the value in the given acceptable index, or$LUA_TNONE$for
+a non-valid index (that is, an index to an "empty" stack position). The types
+returned by$lua_type$are coded by the following constants defined in$lua.h$:
+$LUA_TNIL$,$LUA_TNUMBER$,$LUA_TBOOLEAN$,$LUA_TSTRING$,$LUA_TTABLE$,
+$LUA_TFUNCTION$,$LUA_TUSERDATA$,$LUA_TTHREAD$, and$LUA_TLIGHTUSERDATA$.
+
+
+$lua_typename$ *lrv-lua_typename*
+--------------
+>
+ const char *lua_typename (lua_State *L, int tp);
+>
+Returns the name of the type encoded by the value$tp$, which must be one the
+values returned by$lua_type$.
+
+
+$lua_Writer$ *lrv-lua_Writer*
+------------
+>
+ typedef int (*lua_Writer) (lua_State *L,
+ const void* p,
+ size_t sz,
+ void* ud);
+>
+The writer function used by$lua_dump$(see |lrv-lua_dump|). Every time it
+produces another piece of chunk,$lua_dump$calls the writer, passing along the
+buffer to be written ($p$), its size ($sz$), and the$data$parameter supplied
+to$lua_dump$.
+
+The writer returns an error code: 0 means no errors; any other value means an
+error and stops$lua_dump$from calling the writer again.
+
+
+$lua_xmove$ *lrv-lua_xmove*
+-----------
+>
+ void lua_xmove (lua_State *from, lua_State *to, int n);
+>
+Exchange values between different threads of the@same@global state.
+
+This function pops$n$values from the stack$from$, and pushes them onto the
+stack$to$.
+
+
+$lua_yield$ *lrv-lua_yield*
+-----------
+>
+ int lua_yield (lua_State *L, int nresults);
+>
+Yields a coroutine.
+
+This function should only be called as the return expression of a C function,
+as follows:
+>
+ return lua_yield (L, nresults);
+>
+When a C function calls$lua_yield$in that way, the running coroutine suspends
+its execution, and the call to$lua_resume$(see |lrv-lua_resume|) that started
+this coroutine returns. The parameter$nresults$is the number of values from
+the stack that are passed as results to$lua_resume$.
+
+
+ *lrv-stackexample*
+As an example of stack manipulation, if the stack starts as
+$10 20 30 40 50*$(from bottom to top; the $'*'$marks the top), then
+>
+ 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*
+>
+
+==============================================================================
+3.8 The Debug Interface *lrv-apiDebug*
+
+
+Lua has no built-in debugging facilities. Instead, it offers a special
+interface by means of functions and@hooks@. This interface allows the
+construction of different kinds of debuggers, profilers, and other tools that
+need "inside information" from the interpreter.
+
+
+$lua_Debug$ *lrv-lua_Debug*
+-----------
+
+ $typedef struct lua_Debug {$
+ $int event;$
+ $const char *name; /* (n) */$
+ $const char *namewhat; /* (n) */$
+ $const char *what; /* (S) */$
+ $const char *source; /* (S) */$
+ $int currentline; /* (l) */$
+ $int nups; /* (u) number of upvalues */$
+ $int linedefined; /* (S) */$
+ $int lastlinedefined; /* (S) */$
+ $char short_src[LUA_IDSIZE]; /* (S) */$
+ $/* private part */$
+ @other fields@
+ $} lua_Debug;$
+
+
+A structure used to carry different pieces of information about an active
+function.$lua_getstack$(see |lrv-lua_getstack|) fills only the private part
+of this structure, for later use. To fill the other fields of$lua_Debug$with
+useful information, call$lua_getinfo$(see |lrv-lua_getinfo|).
+
+The fields of$lua_Debug$ have the following meaning:
+
+ #o#$source$: If the function was defined in a string, then$source$is that
+ string. If the function was defined in a file, then$source$starts with a
+ $'@'$followed by the file name.
+ #o#$short_src$: a "printable" version of$source$, to be used in error
+ messages.
+ #o#$linedefined$: the line number where the definition of the function
+ starts.
+ #o#$lastlinedefined$: the line number where the definition of the function
+ ends.
+ #o#$what$: the string$"Lua"$if the function is a Lua function,$"C"$if it is
+ a C function,$"main"$if it is the main part of a chunk, and$"tail"$if it
+ was a function that did a tail call. In the latter case, Lua has no
+ other information about the function.
+ #o#$currentline$: the current line where the given function is executing.
+ When no line information is available,$currentline$is set to -1.
+ #o#$name$: 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$lua_getinfo$function checks how
+ the function was called to find a suitable name. If it cannot find a
+ name, then$name$is set to$NULL$.
+ #o#$namewhat$: explains the$name$field. The value of$namewhat$can be
+ $"global"$,$"local"$,$"method"$,$"field"$,$"upvalue"$, or$""$(the empty
+ string), according to how the function was called. (Lua uses the empty
+ string when no other option seems to apply.)
+ #o#$nups$: the number of upvalues of the function.
+
+
+$lua_gethook$ *lrv-lua_gethook*
+-------------
+>
+ lua_Hook lua_gethook (lua_State *L);
+>
+Returns the current hook function.
+
+
+$lua_gethookcount$ *lrv-lua_gethookcount*
+------------------
+>
+ int lua_gethookcount (lua_State *L);
+>
+Returns the current hook count.
+
+
+$lua_gethookmask$ *lrv-lua_gethookmask*
+>
+ int lua_gethookmask (lua_State *L);
+>
+Returns the current hook mask.
+
+
+$lua_getinfo$ *lrv-lua_getinfo*
+-------------
+>
+ int lua_getinfo (lua_State *L, const char *what, lua_Debug *ar);
+>
+Returns information about a specific function or function invocation.
+
+To get information about a function invocation, the parameter$ar$must be a
+valid activation record that was filled by a previous call to$lua_getstack$
+(see |lrv-lua_getstack|) or given as argument to a hook (see |lrv-lua_Hook|).
+
+To get information about a function you push it onto the stack and start the
+$what$string with the character $'>'$. (In that case,$lua_getinfo$pops the
+function in the top of the stack.) For instance, to know in which line a
+function$f$was defined, you can write the following code:
+>
+ lua_Debug ar;
+ lua_getfield(L, LUA_GLOBALSINDEX, "f"); /* get global 'f' */
+ lua_getinfo(L, ">S", &ar);
+ printf("%d\n", ar.linedefined);
+>
+Each character in the string$what$selects some fields of the structure$ar$to
+be filled or a value to be pushed on the stack:
+
+ #o#$'n'$: fills in the field$name$and$namewhat$;
+ #o#$'S'$: fills in the fields$source$,$short_src$,$linedefined$,
+ $lastlinedefined$, and$what$;
+ #o#$'l'$: fills in the field$currentline$;
+ #o#$'u'$: fills in the field$nups$;
+ #o#$'f'$: pushes onto the stack the function that is running at the given
+ level;
+ #o#$'L'$: pushes onto the stack a table whose indices are the numbers of the
+ lines that are valid on the function. (A@valid line@is a line with some
+ associated code, that is, a line where you can put a break point.
+ Non-valid lines include empty lines and comments.)
+
+This function returns 0 on error (for instance, an invalid option in$what$).
+
+
+$lua_getlocal$ *lrv-lua_getlocal*
+--------------
+>
+ const char *lua_getlocal (lua_State *L, lua_Debug *ar, int n);
+>
+Gets information about a local variable of a given activation record. The
+parameter$ar$must be a valid activation record that was filled by a previous
+call to$lua_getstack$(see |lrv-lua_getstack|) or given as argument to a hook
+(see |lrv-lua_Hook|). The index$n$selects which local variable to inspect (1
+is the first parameter or active local variable, and so on, until the last
+active local variable).$lua_getlocal$pushes the variable's value onto the
+stack and returns its name.
+
+Variable names starting with$'('$(open parentheses) represent internal
+variables (loop control variables, temporaries, and C function locals).
+
+Returns$NULL$(and pushes nothing) when the index is greater than the number of
+active local variables.
+
+
+$lua_getstack$ *lrv-lua_getstack*
+--------------
+>
+ int lua_getstack (lua_State *L, int level, lua_Debug *ar);
+>
+Gets information about the interpreter runtime stack.
+
+This function fills parts of a$lua_Debug$(see |lrv-lua_Debug|) structure with
+an identification of the@activation record@of the function executing at a
+given level. Level 0 is the current running function, whereas level@n+1@is the
+function that has called level@n@. When there are no errors,$lua_getstack$
+returns 1; when called with a level greater than the stack depth, it
+returns 0.
+
+
+$lua_getupvalue$ *lrv-lua_getupvalue*
+----------------
+>
+ const char *lua_getupvalue (lua_State *L, int funcindex, int n);
+>
+Gets information about a closure's upvalue. (For Lua functions, upvalues are
+the external local variables that the function uses, and that are consequently
+included in its closure.)$lua_getupvalue$gets the index$n$of an upvalue,
+pushes the upvalue's value onto the stack, and returns its name.$funcindex$
+points to the closure in the stack. (Upvalues have no particular order, as
+they are active through the whole function. So, they are numbered in an
+arbitrary order.)
+
+Returns$NULL$(and pushes nothing) when the index is greater than the number of
+upvalues. For C functions, this function uses the empty string$""$as a name
+for all upvalues.
+
+
+$lua_Hook$ *lrv-lua_Hook*
+----------
+>
+ typedef void (*lua_Hook) (lua_State *L, lua_Debug *ar);
+>
+Type for debugging hook functions.
+
+
+Whenever a hook is called, its$ar$argument has its field$event$set to the
+specific event that triggered the hook. Lua identifies these events with the
+following constants:$LUA_HOOKCALL$,$LUA_HOOKRET$,$LUA_HOOKTAILRET$,
+$LUA_HOOKLINE$, and$LUA_HOOKCOUNT$. Moreover, for line events, the field
+$currentline$is also set. To get the value of any other field in$ar$, the hook
+must call$lua_getinfo$(see |lrv-lua_getinfo|). For return events,$event$may be
+$LUA_HOOKRET$, the normal value, or$LUA_HOOKTAILRET$. 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$lua_getinfo$.
+
+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, this execution occurs
+without any calls to hooks.
+
+
+$lua_sethook$ *lrv-lua_sethook*
+-------------
+>
+ int lua_sethook (lua_State *L, lua_Hook f, int mask, int count);
+>
+Sets the debugging hook function.
+
+Argument$f$is the hook function.$mask$specifies on which events the hook will
+be called: it is formed by a bitwise@or@of the constants$LUA_MASKCALL$,
+$LUA_MASKRET$,$LUA_MASKLINE$, and$LUA_MASKCOUNT$. The$count$argument is only
+meaningful when the mask includes$LUA_MASKCOUNT$. For each event, the hook is
+called as explained below:
+
+ #o##The call hook#: is called when the interpreter calls a function. The
+ hook is called just after Lua enters the new function, before the
+ function gets its arguments.
+ #o##The return hook#: is called when the interpreter returns from a
+ function. The hook is called just before Lua leaves the function. You
+ have no access to the values to be returned by the function.
+ #o##The line hook#: 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.)
+ #o##The count hook#: is called after the interpreter executes every$count$
+ instructions. (This event only happens while Lua is executing a Lua
+ function.)
+
+A hook is disabled by setting$mask$to zero.
+
+
+$lua_setlocal$ *lrv-lua_setlocal*
+--------------
+>
+ const char *lua_setlocal (lua_State *L, lua_Debug *ar, int n);
+>
+Sets the value of a local variable of a given activation record. Parameters$ar$
+and$n$are as in$lua_getlocal$(see |lrv-lua_getlocal|).$lua_setlocal$assigns
+the value at the top of the stack to the variable and returns its name. It
+also pops the value from the stack.
+
+Returns$NULL$(and pops nothing) when the index is greater than the number of
+active local variables.
+
+
+$lua_setupvalue$ *lrv-lua_setupvalue*
+----------------
+>
+ const char *lua_setupvalue (lua_State *L, int funcindex, int n);
+>
+Sets the value of a closure's upvalue. It assigns the value at the top of the
+stack to the upvalue and returns its name. It also pops the value from the
+stack. Parameters$funcindex$and$n$are as in the$lua_getupvalue$(see
+|lrv-lua_getupvalue|).
+
+Returns$NULL$(and pops nothing) when the index is greater than the number of
+upvalues.
+
+
+ *lrv-debugexample*
+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:
+>
+ 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_getupvalue(L, -1, i++)) != NULL) {
+ printf("upvalue %d %s\n", i-1, name);
+ lua_pop(L, 1); /* remove upvalue value */
+ }
+ return 1;
+ }
+>
+
+==============================================================================
+4 THE AUXILIARY LIBRARY *lrv-aux*
+==============================================================================
+
+
+The@auxiliary library@provides several convenient functions to interface C
+with Lua. While the basic API provides the primitive functions for all
+interactions between C and Lua, the auxiliary library provides higher-level
+functions for some common tasks.
+
+All functions from the auxiliary library are defined in header file$lauxlib.h$
+and have a prefix$luaL_$.
+
+All functions in the auxiliary library are built on top of the basic API, and
+so they provide nothing that cannot be done with this API.
+
+Several functions in the auxiliary library are used to check C function
+arguments. Their names are always$luaL_check*$or$luaL_opt*$. All of these
+functions raise an error if the check is not satisfied. Because the error
+message is formatted for arguments (e.g.,$"bad argument #1"$), you should not
+use these functions for other stack values.
+
+
+==============================================================================
+4.1 Functions and Types *lrv-auxFunctions*
+
+
+Here we list all functions and types from the auxiliary library in
+alphabetical order.
+
+
+$luaL_addchar$ *lrv-luaL_addchar*
+--------------
+>
+ void luaL_addchar (luaL_Buffer *B, char c);
+>
+Adds the character$c$to the buffer$B$(see |lrv-luaL_Buffer|).
+
+
+$luaL_addlstring$ *lrv-luaL_addlstring*
+-----------------
+>
+ void luaL_addlstring (luaL_Buffer *B, const char *s, size_t l);
+>
+Adds the string pointed to by$s$with length$l$to the buffer$B$(see
+|lrv-luaL_Buffer|). The string may contain embedded zeros.
+
+
+$luaL_addsize$ *lrv-luaL_addsize*
+--------------
+>
+ void luaL_addsize (luaL_Buffer *B, size_t n);
+>
+Adds to the buffer$B$(see |lrv-luaL_Buffer|) a string of length$n$previously
+copied to the buffer area (see |lrv-luaL_prepbuffer|).
+
+
+$luaL_addstring$ *lrv-luaL_addstring*
+----------------
+>
+ void luaL_addstring (luaL_Buffer *B, const char *s);
+>
+Adds the zero-terminated string pointed to by$s$to the buffer$B$(see
+|lrv-luaL_Buffer|). The string may not contain embedded zeros.
+
+
+$luaL_addvalue$ *lrv-luaL_addvalue*
+---------------
+>
+ void luaL_addvalue (luaL_Buffer *B);
+>
+Adds the value at the top of the stack to the buffer$B$(see
+|lrv-luaL_Buffer|). Pops the value.
+
+This is the only function on string buffers that can (and must) be called with
+an extra element on the stack, which is the value to be added to the buffer.
+
+
+$luaL_argcheck$ *lrv-luaL_argcheck*
+---------------
+>
+ void luaL_argcheck (lua_State *L,
+ int cond,
+ int narg,
+ const char *extramsg);
+>
+Checks whether$cond$is true. If not, raises an error with the following
+message, where$func$is retrieved from the call stack:
+>
+ bad argument #<narg> to <func> (<extramsg>)
+>
+
+$luaL_argerror$ *lrv-luaL_argerror*
+---------------
+>
+ int luaL_argerror (lua_State *L, int narg, const char *extramsg);
+>
+Raises an error with the following message, where$func$is retrieved from the
+call stack:
+>
+ bad argument #<narg> to <func> (<extramsg>)
+>
+This function never returns, but it is an idiom to use it in C functions as
+$return luaL_argerror($@args@$)$.
+
+
+$luaL_Buffer$ *lrv-luaL_Buffer*
+-------------
+>
+ typedef struct luaL_Buffer luaL_Buffer;
+>
+Type for a@string buffer@.
+
+A string buffer allows C code to build Lua strings piecemeal. Its pattern of
+use is as follows:
+
+ #o# First you declare a variable$b$of type$luaL_Buffer$.
+ #o# Then you initialize it with a call$luaL_buffinit(L, &b)$(see
+ |lrv-luaL_buffinit|).
+ #o# Then you add string pieces to the buffer calling any of the$luaL_add*$
+ functions.
+ #o# You finish by calling$luaL_pushresult(&b)$(see |lrv-luaL_pushresult|).
+ This call leaves the final string on the top of the stack.
+
+During its normal operation, a string buffer uses a variable number of stack
+slots. So, while using a buffer, you cannot assume that you know where the top
+of the stack is. You can use the stack between successive calls to buffer
+operations as long as that use is balanced; that is, when you call a buffer
+operation, the stack is at the same level it was immediately after the
+previous buffer operation. (The only exception to this rule is
+$luaL_addvalue$|lrv-luaL_addvalue|.) After calling$luaL_pushresult$the stack
+is back to its level when the buffer was initialized, plus the final string on
+its top.
+
+
+$luaL_buffinit$ *lrv-luaL_buffinit*
+---------------
+>
+ void luaL_buffinit (lua_State *L, luaL_Buffer *B);
+>
+Initializes a buffer$B$. This function does not allocate any space; the buffer
+must be declared as a variable (see |lrv-luaL_Buffer|).
+
+
+$luaL_callmeta$ *lrv-luaL_callmeta*
+---------------
+>
+ int luaL_callmeta (lua_State *L, int obj, const char *e);
+>
+Calls a metamethod.
+
+If the object at index$obj$has a metatable and this metatable has a field$e$,
+this function calls this field and passes the object as its only argument. In
+this case this function returns 1 and pushes onto the stack the value returned
+by the call. If there is no metatable or no metamethod, this function returns
+0 (without pushing any value on the stack).
+
+
+$luaL_checkany$ *lrv-luaL_checkany*
+---------------
+>
+ void luaL_checkany (lua_State *L, int narg);
+>
+Checks whether the function has an argument of any type (including#nil#) at
+position$narg$.
+
+
+$luaL_checkint$ *lrv-luaL_checkint*
+---------------
+>
+ int luaL_checkint (lua_State *L, int narg);
+>
+Checks whether the function argument$narg$is a number and returns this number
+cast to an$int$.
+
+
+$luaL_checkinteger$ *lrv-luaL_checkinteger*
+-------------------
+>
+ lua_Integer luaL_checkinteger (lua_State *L, int narg);
+>
+Checks whether the function argument$narg$is a number and returns this number
+cast to a$lua_Integer$(see |lrv-lua_Integer|).
+
+
+$luaL_checklong$ *lrv-luaL_checklong*
+----------------
+>
+ long luaL_checklong (lua_State *L, int narg);
+>
+Checks whether the function argument$narg$is a number and returns this number
+cast to a$long$.
+
+
+$luaL_checklstring$ *lrv-luaL_checklstring*
+-------------------
+>
+ const char *luaL_checklstring (lua_State *L, int narg, size_t *l);
+>
+Checks whether the function argument$narg$is a string and returns this string;
+if$l$is not$NULL$fills$*l$with the string's length.
+
+
+$luaL_checknumber$ *lrv-luaL_checknumber*
+------------------
+>
+ lua_Number luaL_checknumber (lua_State *L, int narg);
+>
+Checks whether the function argument$narg$is a number and returns this number
+(see |lrv-lua_Number|).
+
+
+$luaL_checkoption$ *lrv-luaL_checkoption*
+------------------
+>
+ int luaL_checkoption (lua_State *L,
+ int narg,
+ const char *def,
+ const char *const lst[]);
+>
+Checks whether the function argument$narg$is a string and searches for this
+string in the array$lst$(which must be NULL-terminated). Returns the index in
+the array where the string was found. Raises an error if the argument is not a
+string or if the string cannot be found.
+
+If$def$is not$NULL$, the function uses$def$as a default value when there is no
+argument$narg$or if this argument is#nil#.
+
+This is a useful function for mapping strings to C enums. (The usual
+convention in Lua libraries is to use strings instead of numbers to select
+options.)
+
+
+$luaL_checkstack$ *lrv-luaL_checkstack*
+-----------------
+>
+ void luaL_checkstack (lua_State *L, int sz, const char *msg);
+>
+Grows the stack size to$top + sz$elements, raising an error if the stack
+cannot grow to that size.$msg$is an additional text to go into the error
+message.
+
+
+$luaL_checkstring$ *lrv-luaL_checkstring*
+------------------
+>
+ const char *luaL_checkstring (lua_State *L, int narg);
+>
+Checks whether the function argument$narg$is a string and returns this string.
+
+
+$luaL_checktype$ *lrv-luaL_checktype*
+----------------
+>
+ void luaL_checktype (lua_State *L, int narg, int t);
+>
+Checks whether the function argument$narg$has type$t$(see |lrv-lua_type|).
+
+
+$luaL_checkudata$ *lrv-luaL_checkudata*
+-----------------
+>
+ void *luaL_checkudata (lua_State *L, int narg, const char *tname);
+>
+Checks whether the function argument$narg$is a userdata of the type$tname$
+(see |lrv-luaL_newmetatable|).
+
+
+$luaL_dofile$ *lrv-luaL_dofile*
+-------------
+>
+ int luaL_dofile (lua_State *L, const char *filename);
+>
+Loads and runs the given file. It is defined as the following macro:
+>
+ (luaL_loadfile(L, filename) || lua_pcall(L, 0, LUA_MULTRET, 0))
+>
+It returns 0 if there are no errors or 1 in case of errors.
+
+
+$luaL_dostring$ *lrv-luaL_dostring*
+---------------
+>
+ int luaL_dostring (lua_State *L, const char *str);
+>
+Loads and runs the given string. It is defined as the following macro:
+>
+ (luaL_loadstring(L, str) || lua_pcall(L, 0, LUA_MULTRET, 0))
+>
+It returns 0 if there are no errors or 1 in case of errors.
+
+
+$luaL_error$ *lrv-luaL_error*
+------------
+>
+ int luaL_error (lua_State *L, const char *fmt, ...);
+>
+Raises an error. The error message format is given by$fmt$plus any extra
+arguments, following the same rules of$lua_pushfstring$(see
+|lrv-lua_pushfstring|). It also adds at the beginning of the message the file
+name and the line number where the error occurred, if this information is
+available.
+
+This function never returns, but it is an idiom to use it in C functions as
+$return luaL_error($@args@$)$.
+
+
+$luaL_getmetafield$ *lrv-luaL_getmetafield*
+-------------------
+>
+ int luaL_getmetafield (lua_State *L, int obj, const char *e);
+>
+Pushes onto the stack the field$e$from the metatable of the object at index
+$obj$. If the object does not have a metatable, or if the metatable does not
+have this field, returns 0 and pushes nothing.
+
+
+$luaL_getmetatable$ *lrv-luaL_getmetatable*
+-------------------
+>
+ void luaL_getmetatable (lua_State *L, const char *tname);
+>
+Pushes onto the stack the metatable associated with name$tname$in the registry
+(see |lrv-luaL_newmetatable|).
+
+
+$luaL_gsub$ *lrv-luaL_gsub*
+-----------
+>
+ const char *luaL_gsub (lua_State *L,
+ const char *s,
+ const char *p,
+ const char *r);
+>
+Creates a copy of string$s$by replacing any occurrence of the string$p$with
+the string$r$. Pushes the resulting string on the stack and returns it.
+
+
+$luaL_loadbuffer$ *lrv-luaL_loadbuffer*
+-----------------
+>
+ int luaL_loadbuffer (lua_State *L,
+ const char *buff,
+ size_t sz,
+ const char *name);
+>
+Loads a buffer as a Lua chunk. This function uses$lua_load$(see
+|lrv-lua_load|) to load the chunk in the buffer pointed to by$buff$with size
+$sz$.
+
+This function returns the same results as$lua_load$.$name$is the chunk name,
+used for debug information and error messages.
+
+
+$luaL_loadfile$ *lrv-luaL_loadfile*
+---------------
+>
+ int luaL_loadfile (lua_State *L, const char *filename);
+>
+Loads a file as a Lua chunk. This function uses$lua_load$(see |lrv-lua_load|)
+to load the chunk in the file named$filename$. If$filename$is$NULL$, then it
+loads from the standard input. The first line in the file is ignored if it
+starts with a$#$.
+
+This function returns the same results as$lua_load$, but it has an extra error
+code$LUA_ERRFILE$if it cannot open/read the file.
+
+As$lua_load$, this function only loads the chunk; it does not run it.
+
+
+$luaL_loadstring$ *lrv-luaL_loadstring*
+-----------------
+>
+ int luaL_loadstring (lua_State *L, const char *s);
+>
+Loads a string as a Lua chunk. This function uses$lua_load$(see
+|lrv-lua_load|) to load the chunk in the zero-terminated string$s$.
+
+This function returns the same results as$lua_load$.
+
+Also as$lua_load$, this function only loads the chunk; it does not run it.
+
+
+$luaL_newmetatable$ *lrv-luaL_newmetatable*
+-------------------
+>
+ int luaL_newmetatable (lua_State *L, const char *tname);
+>
+If the registry already has the key$tname$, returns 0. Otherwise, creates a
+new table to be used as a metatable for userdata, adds it to the registry with
+key$tname$, and returns 1.
+
+In both cases pushes onto the stack the final value associated with$tname$in
+the registry.
+
+
+$luaL_newstate$ *lrv-luaL_newstate*
+---------------
+>
+ lua_State *luaL_newstate (void);
+>
+Creates a new Lua state. It calls$lua_newstate$(see |lrv-lua_newstate|) with an
+allocator based on the standard C$realloc$function and then sets a panic
+function (see |lrv-lua_atpanic|) that prints an error message to the standard
+error output in case of fatal errors.
+
+Returns the new state, or$NULL$if there is a memory allocation error.
+
+
+$luaL_openlibs$ *lrv-luaL_openlibs*
+---------------
+>
+ void luaL_openlibs (lua_State *L);
+>
+Opens all standard Lua libraries into the given state. See also
+|lrv-openlibs| for details on how to open individual libraries.
+
+
+$luaL_optint$ *lrv-luaL_optint*
+-------------
+>
+ int luaL_optint (lua_State *L, int narg, int d);
+>
+If the function argument$narg$is a number, returns this number cast to an
+$int$. If this argument is absent or is#nil#, returns$d$. Otherwise, raises an
+error.
+
+
+$luaL_optinteger$ *lrv-luaL_optinteger*
+-----------------
+>
+ lua_Integer luaL_optinteger (lua_State *L,
+ int narg,
+ lua_Integer d);
+>
+If the function argument$narg$is a number, returns this number cast to a
+$lua_Integer$(see |lrv-lua_Integer|). If this argument is absent or is#nil#,
+returns$d$. Otherwise, raises an error.
+
+
+$luaL_optlong$ *lrv-luaL_optlong*
+--------------
+>
+ long luaL_optlong (lua_State *L, int narg, long d);
+>
+If the function argument$narg$is a number, returns this number cast to a
+$long$. If this argument is absent or is#nil#, returns$d$. Otherwise, raises
+an error.
+
+
+$luaL_optlstring$ *lrv-luaL_optlstring*
+-----------------
+>
+ const char *luaL_optlstring (lua_State *L,
+ int narg,
+ const char *d,
+ size_t *l);
+>
+If the function argument$narg$is a string, returns this string. If this
+argument is absent or is#nil#, returns$d$. Otherwise, raises an error.
+
+If$l$is not$NULL$, fills the position$*l$with the results's length.
+
+
+$luaL_optnumber$ *lrv-luaL_optnumber*
+----------------
+>
+ lua_Number luaL_optnumber (lua_State *L, int narg, lua_Number d);
+>
+If the function argument$narg$is a number, returns this number. If this
+argument is absent or is#nil#, returns$d$. Otherwise, raises an error.
+
+
+$luaL_optstring$ *lrv-luaL_optstring*
+----------------
+>
+ const char *luaL_optstring (lua_State *L,
+ int narg,
+ const char *d);
+>
+If the function argument$narg$is a string, returns this string. If this
+argument is absent or is#nil#, returns$d$. Otherwise, raises an error.
+
+
+$luaL_prepbuffer$ *lrv-luaL_prepbuffer*
+-----------------
+>
+ char *luaL_prepbuffer (luaL_Buffer *B);
+>
+Returns an address to a space of size$LUAL_BUFFERSIZE$where you can copy a
+string to be added to buffer$B$(see |lrv-luaL_Buffer|). After copying the
+string into this space you must call$luaL_addsize$(see |lrv-luaL_addsize|)
+with the size of the string to actually add it to the buffer.
+
+
+$luaL_pushresult$ *lrv-luaL_pushresult*
+-----------------
+>
+ void luaL_pushresult (luaL_Buffer *B);
+>
+Finishes the use of buffer$B$leaving the final string on the top of the stack.
+
+
+$luaL_ref$ *lrv-luaL_ref*
+----------
+>
+ int luaL_ref (lua_State *L, int t);
+>
+Creates and returns a@reference@, in the table at index$t$, for the object at
+the top of the stack (and pops the object).
+
+A reference is a unique integer key. As long as you do not manually add
+integer keys into table$t$,$luaL_ref$ensures the uniqueness of the key it
+returns. You can retrieve an object referred by reference$r$by calling
+$lua_rawgeti(L, t, r)$(see |lrv-lua_rawgeti|). Function$luaL_unref$(see
+|lrv-luaL_unref|) frees a reference and its associated object.
+
+If the object at the top of the stack is#nil#,$luaL_ref$returns the constant
+$LUA_REFNIL$. The constant$LUA_NOREF$is guaranteed to be different from any
+reference returned by$luaL_ref$.
+
+
+$luaL_Reg$ *lrv-luaL_Reg*
+----------
+>
+ typedef struct luaL_Reg {
+ const char *name;
+ lua_CFunction func;
+ } luaL_Reg;
+>
+Type for arrays of functions to be registered by$luaL_register$ (see
+|lrv-luaL_register|).$name$is the function name and$func$is a pointer to the
+function. Any array of$luaL_Reg$must end with a sentinel entry in which both
+$name$and$func$are$NULL$.
+
+
+$luaL_register$ *lrv-luaL_register*
+---------------
+>
+ void luaL_register (lua_State *L,
+ const char *libname,
+ const luaL_Reg *l);
+>
+Opens a library.
+
+When called with$libname$equal to$NULL$, it simply registers all functions in
+the list$l$(see |lrv-luaL_Reg|) into the table on the top of the stack.
+
+When called with a non-null$libname$,$luaL_register$creates a new table$t$,
+sets it as the value of the global variable$libname$, sets it as the value of
+$package.loaded[libname]$, and registers on it all functions in the list$l$.
+If there is a table in$package.loaded[libname]$or in variable$libname$, reuses
+this table instead of creating a new one.
+
+In any case the function leaves the table on the top of the stack.
+
+
+$luaL_typename$ *lrv-luaL_typename*
+---------------
+>
+ const char *luaL_typename (lua_State *L, int idx);
+>
+Returns the name of the type of the value at index$idx$.
+
+
+$luaL_typerror$ *lrv-luaL_typerror*
+---------------
+>
+ int luaL_typerror (lua_State *L, int narg, const char *tname);
+>
+Generates an error with a message like the following:
+
+ @location@$: bad argument$@narg@$to$@'func'@$($@tname@$expected, got$@rt@$)$
+
+where@location@is produced by$luaL_where$ (see |lrv-luaL_where|),@func@is the
+name of the current function, and@rt@is the type name of the actual argument.
+
+
+$luaL_unref$ *lrv-luaL_unref*
+------------
+>
+ void luaL_unref (lua_State *L, int t, int ref);
+>
+Releases reference$ref$from the table at index$t$(see |lrv-luaL_ref|).
+The entry is removed from the table, so that the referred object can be
+collected. The reference$ref$is also freed to be used again.
+
+If$ref$is$LUA_NOREF$or$LUA_REFNIL$,$luaL_unref$does nothing.
+
+
+$luaL_where$ *lrv-luaL_where*
+------------
+>
+ void luaL_where (lua_State *L, int lvl);
+>
+Pushes onto the stack a string identifying the current position of the control
+at level$lvl$in the call stack. Typically this string has the following
+format:
+
+ @chunkname:currentline:@
+
+Level 0 is the running function, level 1 is the function that called the
+running function, etc.
+
+This function is used to build a prefix for error messages.
+
+
+==============================================================================
+5 STANDARD LIBRARIES *lrv-Lib*
+==============================================================================
+
+
+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.,$type$and$getmetatable$); 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 requirements that deserve an
+implementation in C (e.g.,$sort$).
+
+All libraries are implemented through the official C API and are provided as
+separate C modules. Currently, Lua has the following standard libraries:
+
+ #o# basic library;
+ #o# package library;
+ #o# string manipulation;
+ #o# table manipulation;
+ #o# mathematical functions (sin, log, etc.);
+ #o# input and output;
+ #o# operating system facilities;
+ #o# debug facilities.
+
+Except for the basic and package libraries, each library provides all its
+functions as fields of a global table or as methods of its objects.
+
+ *lrv-openlibs*
+To have access to these libraries, the C host program should call the
+$luaL_openlibs$function, which opens all standard libraries (see
+|lrv-luaL_openlibs|). Alternatively, the host program can open the libraries
+individually by calling$luaopen_base$(for the basic library),
+$luaopen_package$(for the package library),$luaopen_string$(for the string
+library),$luaopen_table$(for the table library),$luaopen_math$(for the
+mathematical library),$luaopen_io$(for the I/O and the Operating System
+libraries), and$luaopen_debug$(for the debug library). These functions are
+declared in$lualib.h$and should not be called directly: you must call them
+like any other Lua C function, e.g., by using$lua_call$(see |lrv-lua_call|).
+
+
+==============================================================================
+5.1 Basic Functions *lrv-libBasic*
+
+
+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 implementations for some of its facilities.
+
+
+$assert (v [, message])$ *lrv-assert*
+------------------------
+Issues an error when the value of its argument$v$is false (i.e.,#nil#or
+#false#); otherwise, returns all its arguments.$message$is an error message;
+when absent, it defaults to "assertion failed!"
+
+
+$collectgarbage (opt [, arg])$ *lrv-collectgarbage*
+------------------------------
+This function is a generic interface to the garbage collector. It performs
+different functions according to its first argument,$opt$:
+
+ #o##"stop"#: stops the garbage collector.
+ #o##"restart"#: restarts the garbage collector.
+ #o##"collect"#: performs a full garbage-collection cycle.
+ #o##"count"#: returns the total memory in use by Lua (in Kbytes).
+ #o##"step"#: performs a garbage-collection step. The step "size" is
+ controlled by$arg$(larger values mean more steps) in a non-specified
+ way. If you want to control the step size you must experimentally tune
+ the value of$arg$. Returns#true#if the step finished a collection cycle.
+ #o##"setpause"#: sets$arg$/100 as the new value for the@pause@of the
+ collector (see |lrv-langGC|).
+ #o##"setstepmul"#: sets$arg$/100 as the new value for the@step multiplier@of
+ the collector (see |lrv-langGC|).
+
+
+$dofile (filename)$ *lrv-dofile*
+-------------------
+Opens the named file and executes its contents as a Lua chunk. When called
+without arguments,$dofile$executes the contents of the standard input
+($stdin$). Returns all values returned by the chunk. In case of
+errors,$dofile$propagates the error to its caller (that is,$dofile$does not
+run in protected mode).
+
+
+$error (message [, level])$ *lrv-error*
+---------------------------
+Terminates the last protected function called and returns$message$as the error
+message. Function$error$never returns.
+
+Usually,$error$adds some information about the error position at the beginning
+of the message. The$level$argument specifies how to get the error position.
+With level 1 (the default), the error position is where the$error$function was
+called. Level 2 points the error to where the function that called$error$was
+called; and so on. Passing a level 0 avoids the addition of error position
+information to the message.
+
+
+$_G$ *lrv-_G*
+-----
+A global variable (not a function) that holds the global environment (that
+is,$_G._G = _G$). Lua itself does not use this variable; changing its value
+does not affect any environment, nor vice-versa. (Use$setfenv$to change
+environments.)
+
+
+$getfenv (f)$ *lrv-getfenv*
+-------------
+Returns the current environment in use by the function.$f$can be a Lua
+function or a number that specifies the function at that stack level:
+Level 1 is the function calling$getfenv$. If the given function is not a Lua
+function, or if$f$is 0,$getfenv$returns the global environment. The default
+for$f$is 1.
+
+
+$getmetatable (object)$ *lrv-getmetatable*
+-----------------------
+If$object$does not have a metatable, returns#nil#. Otherwise, if the object's
+metatable has a$"__metatable"$field, returns the associated value. Otherwise,
+returns the metatable of the given object.
+
+
+$ipairs (t)$ *lrv-ipairs*
+------------
+Returns three values: an iterator function, the table$t$, and 0, so that the
+construction
+
+ $for i,v in ipairs(t) do$@body@$end$
+
+will iterate over the pairs ($1,t[1]$), ($2,t[2]$), ..., up to the first
+integer key absent from the table.
+
+
+$load (func [, chunkname])$ *lrv-load*
+---------------------------
+Loads a chunk using function$func$to get its pieces. Each call to$func$must
+return a string that concatenates with previous results. A return of#nil#(or
+no value) signals the end of the chunk.
+
+If there are no errors, returns the compiled chunk as a function; otherwise,
+returns#nil#plus the error message. The environment of the returned function
+is the global environment.
+
+$chunkname$is used as the chunk name for error messages and debug information.
+
+
+$loadfile ([filename])$ *lrv-loadfile*
+-----------------------
+Similar to$load$(see |lrv-load|), but gets the chunk from file$filename$or
+from the standard input, if no file name is given.
+
+
+$loadstring (string [, chunkname])$ *lrv-loadstring*
+-----------------------------------
+Similar to$load$(see |lrv-load|), but gets the chunk from the given string.
+
+To load and run a given string, use the idiom
+>
+ assert(loadstring(s))()
+>
+
+$next (table [, index])$ *lrv-next*
+------------------------
+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.$next$returns the next
+index of the table and its associated value. When called with#nil#as its
+second argument,$next$returns an initial index and its associated value. When
+called with the last index, or with#nil#in an empty table,$next$returns#nil#.
+If the second argument is absent, then it is interpreted as#nil#. In
+particular, you can use$next(t)$to check whether a table is empty.
+
+The order in which the indices are enumerated is not specified,@even for@
+@numeric indices@. (To traverse a table in numeric order, use a numerical#for#
+or the$ipairs$|lrv-ipairs| function.)
+
+The behavior of$next$is@undefined@if, during the traversal, you assign any
+value to a non-existent field in the table. You may however modify existing
+fields. In particular, you may clear existing fields.
+
+
+$pairs (t)$ *lrv-pairs*
+-----------
+Returns three values: the$next$|lrv-next| function, the table$t$, and#nil#, so
+that the construction
+
+ $for k,v in pairs(t) do$@body@$end$
+
+will iterate over all key-value pairs of table$t$.
+
+
+$pcall (f, arg1, ...)$ *lrv-pcall*
+----------------------
+Calls function$f$with the given arguments in@protected mode@. This means that
+any error inside$f$is not propagated; instead,$pcall$catches the error 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,$pcall$also returns
+all results from the call, after this first result. In case of any error,
+$pcall$returns#false#plus the error message.
+
+
+$print (...)$ *lrv-print*
+-------------
+Receives any number of arguments, and prints their values to$stdout$, using
+the$tostring$|lrv-tostring| function to convert them to strings.$print$is not
+intended for formatted output, but only as a quick way to show a value,
+typically for debugging. For formatted output, use$string.format$(see
+|lrv-string.format|).
+
+
+$rawequal (v1, v2)$ *lrv-rawequal*
+-------------------
+Checks whether$v1$is equal to$v2$, without invoking any metamethod. Returns a
+boolean.
+
+
+$rawget (table, index)$ *lrv-rawget*
+-----------------------
+Gets the real value of$table[index]$, without invoking any metamethod.$table$
+must be a table;$index$may be any value.
+
+
+$rawset (table, index, value)$ *lrv-rawset*
+------------------------------
+Sets the real value of$table[index]$to$value$, without invoking any
+metamethod.$table$must be a table,$index$any value different from#nil#,
+and$value$any Lua value.
+
+This function returns$table$.
+
+
+$select (index, ...)$ *lrv-select*
+---------------------
+If$index$is a number, returns all arguments after argument number$index$.
+Otherwise,$index$must be the string$"#"$, and$select$returns the total number
+of extra arguments it received.
+
+
+$setfenv (f, table)$ *lrv-setfenv*
+--------------------
+Sets the environment to be used by the given function.$f$can be a Lua function
+or a number that specifies the function at that stack level: Level 1 is the
+function calling$setfenv$.$setfenv$returns the given function.
+
+As a special case, when$f$is 0$setfenv$changes the environment of the running
+thread. In this case,$setfenv$returns no values.
+
+
+$setmetatable (table, metatable)$ *lrv-setmetatable*
+---------------------------------
+Sets the metatable for the given table. (You cannot change the metatable of
+other types from Lua, only from C.) If$metatable$is#nil#, removes the
+metatable of the given table. If the original metatable has
+a$"__metatable"$field, raises an error.
+
+This function returns$table$.
+
+
+$tonumber (e [, base])$ *lrv-tonumber*
+-----------------------
+Tries to convert its argument to a number. If the argument is already a number
+or a string convertible to a number, then$tonumber$returns this number;
+otherwise, it returns#nil#.
+
+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$'A'$(in either upper or lower case) represents 10,$'B'$represents 11,
+and so forth, with$'Z'$representing 35. In base 10 (the default), the number
+may have a decimal part, as well as an optional exponent part (see
+|lrv-langLexConv|). In other bases, only unsigned integers are accepted.
+
+
+$tostring (e)$ *lrv-tostring*
+--------------
+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$string.format$
+(see |lrv-string.format|).
+
+ *lrv-__tostring*
+If the metatable of$e$has a$"__tostring"$field,$tostring$calls the
+corresponding value with$e$as argument, and uses the result of the call as its
+result.
+
+
+$type (v)$ *lrv-type*
+----------
+Returns the type of its only argument, coded as a string. The possible results
+of this function are$"nil"$(a string, not the value#nil#),$"number"$,
+$"string"$,$"boolean$,$"table"$,$"function"$,$"thread"$, and$"userdata"$.
+
+
+$unpack (list [, i [, j]])$ *lrv-unpack*
+---------------------------
+Returns the elements from the given table. This function is equivalent to
+>
+ return list[i], list[i+1], ..., list[j]
+>
+except that the above code can be written only for a fixed number of elements.
+By default,$i$is 1 and$j$is the length of the list, as defined by the length
+operator (see |lrv-langLength|).
+
+
+$_VERSION$ *lrv-_VERSION*
+----------
+A global variable (not a function) that holds a string containing the current
+interpreter version. The current contents of this string is$"Lua 5.1"$.
+
+
+$xpcall (f, err)$ *lrv-xpcall*
+-----------------
+This function is similar to$pcall$(see |lrv-pcall|), except that you can set a
+new error handler.
+
+$xpcall$calls function$f$in protected mode, using$err$as the error handler.
+Any error inside$f$is not propagated; instead,$xpcall$catches the error, calls
+the$err$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 this case,$xpcall$also returns all results from
+the call, after this first result. In case of any error,$xpcall$returns#false#
+plus the result from$err$.
+
+
+==============================================================================
+5.2 Coroutine Manipulation *lrv-libCoro*
+
+
+The operations related to coroutines comprise a sub-library of the basic
+library and come inside the table$coroutine$. See |lrv-langCoro| for a general
+description of coroutines.
+
+
+$coroutine.create (f)$ *lrv-coroutine.create*
+----------------------
+Creates a new coroutine, with body$f$.$f$must be a Lua function. Returns this
+new coroutine, an object with type$"thread"$.
+
+
+$coroutine.resume (co [, val1, ...])$ *lrv-coroutine.resume*
+-------------------------------------
+Starts or continues the execution of coroutine$co$. The first time you resume
+a coroutine, it starts running its body. The values$val1$, ... are passed as
+arguments to the body function. If the coroutine has yielded,$resume$restarts
+it; the values$val1$, ... are passed as the results from the yield.
+
+If the coroutine runs without any errors,$resume$returns#true#plus any values
+passed to$yield$(if the coroutine yields) or any values returned by the body
+function (if the coroutine terminates). If there is any error,$resume$returns
+#false#plus the error message.
+
+
+$coroutine.running ()$ *lrv-coroutine.running*
+----------------------
+Returns the running coroutine, or#nil#when called by the main thread.
+
+
+$coroutine.status (co)$ *lrv-coroutine.status*
+-----------------------
+Returns the status of coroutine$co$, as a string:$"running"$, if the coroutine
+is running (that is, it called$status$);$"suspended"$, if the coroutine is
+suspended in a call to$yield$, or if it has not started running yet;
+$"normal"$if the coroutine is active but not running (that is, it has resumed
+another coroutine); and$"dead"$if the coroutine has finished its body
+function, or if it has stopped with an error.
+
+
+$coroutine.wrap (f)$ *lrv-coroutine.wrap*
+--------------------
+Creates a new coroutine, with body$f$.$f$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$resume$. Returns the
+same values returned by$resume$, except the first boolean. In case of error,
+propagates the error.
+
+
+$coroutine.yield (...)$ *lrv-coroutine.yield*
+-----------------------
+Suspends the execution of the calling coroutine. The coroutine cannot be
+running a C function, a metamethod, or an iterator. Any arguments to$yield$are
+passed as extra results to$resume$.
+
+
+==============================================================================
+5.3 - Modules *lrv-libModule*
+
+
+The package library provides basic facilities for loading and building modules
+in Lua. It exports two of its functions directly in the global environment:
+$require$and$module$(see |lrv-require| and |lrv-module|). Everything else is
+exported in a table$package$.
+
+
+$module (name [, ...])$ *lrv-module*
+-----------------------
+Creates a module. If there is a table in$package.loaded[name]$, this table is
+the module. Otherwise, if there is a global table$t$with the given name, this
+table is the module. Otherwise creates a new table$t$and sets it as the value
+of the global$name$and the value of$package.loaded[name]$. This function also
+initializes$t._NAME$with the given name,$t._M$with the module ($t$itself), and
+$t._PACKAGE$with the package name (the full module name minus last component;
+see below). Finally,$module$sets$t$as the new environment of the current
+function and the new value of$package.loaded[name]$, so that$require$(see
+|lrv-require|) returns$t$.
+
+If$name$is a compound name (that is, one with components separated by dots),
+$module$creates (or reuses, if they already exist) tables for each component.
+For instance, if$name$is$a.b.c$, then$module$stores the module table in field
+$c$of field$b$of global$a$.
+
+This function may receive optional@options@after the module name, where each
+option is a function to be applied over the module.
+
+
+$require (modname)$ *lrv-require*
+-------------------
+Loads the given module. The function starts by looking into the
+$package.loaded$table to determine whether$modname$is already loaded. If it
+is, then$require$returns the value stored at$package.loaded[modname]$.
+Otherwise, it tries to find a@loader@for the module.
+
+To find a loader, first$require$queries$package.preload[modname]$. If it has a
+value, this value (which should be a function) is the loader. Otherwise
+$require$searches for a Lua loader using the path stored in$package.path$.
+If that also fails, it searches for a C loader using the path stored in
+$package.cpath$. If that also fails, it tries an@all-in-one@loader (see
+below).
+
+When loading a C library,$require$first uses a dynamic link facility to link
+the application with the library. Then it tries to find a C function inside
+this library to be used as the loader. The name of this C function is the
+string$"luaopen_"$concatenated with a copy of the module name where each dot
+is replaced by an underscore. Moreover, if the module name has a hyphen, its
+prefix up to (and including) the first hyphen is removed. For instance, if the
+module name is$a.v1-b.c$, the function name will be$luaopen_b_c$.
+
+If$require$finds neither a Lua library nor a C library for a module, it calls
+the@all-in-one loader@. This loader searches the C path for a library for the
+root name of the given module. For instance, when requiring$a.b.c$, it will
+search for a C library for$a$. If found, it looks into it for an open function
+for the submodule; in our example, that would be$luaopen_a_b_c$. With this
+facility, a package can pack several C submodules into one single library,
+with each submodule keeping its original open function.
+
+Once a loader is found,$require$calls the loader with a single argument,
+$modname$. If the loader returns any value,$require$assigns the returned value
+to$package.loaded[modname]$. If the loader returns no value and has not
+assigned any value to$package.loaded[modname]$, then$require$assigns#true#to
+this entry. In any case,$require$returns the final value of
+$package.loaded[modname]$.
+
+If there is any error loading or running the module, or if it cannot find any
+loader for the module, then$require$signals an error.
+
+
+$package.cpath$ *lrv-package.cpath*
+---------------
+The path used by$require$to search for a C loader.
+
+Lua initializes the C path$package.cpath$in the same way it initializes the
+Lua path$package.path$, using the environment variable$LUA_CPATH$(plus another
+default path defined in$luaconf.h$).
+
+
+$package.loaded$ *lrv-package.loaded*
+----------------
+A table used by$require$to control which modules are already loaded. When you
+require a module$modname$and$package.loaded[modname]$is not false,$require$
+simply returns the value stored there.
+
+
+$package.loadlib (libname, funcname)$ *lrv-package.loadlib*
+-------------------------------------
+Dynamically links the host program with the C library$libname$. Inside this
+library, looks for a function$funcname$and returns this function as a
+C function. (So,$funcname$must follow the protocol (see |lrv-lua_CFunction|)).
+
+This is a low-level function. It completely bypasses the package and module
+system. Unlike$require$, it does not perform any path searching and does not
+automatically adds extensions.$libname$must be the complete file name of the
+C library, including if necessary a path and extension.$funcname$must be the
+exact name exported by the C library (which may depend on the C compiler and
+linker used).
+
+This function is not supported by ANSI C. As such, it is only available on
+some platforms (Windows, Linux, Mac OS X, Solaris, BSD, plus other Unix
+systems that support the$dlfcn$standard).
+
+
+$package.path$ *lrv-package.path*
+--------------
+The path used by$require$to search for a Lua loader.
+
+At start-up, Lua initializes this variable with the value of the environment
+variable$LUA_PATH$or with a default path defined in$luaconf.h$, if the
+environment variable is not defined. Any$";;"$in the value of the environment
+variable is replaced by the default path.
+
+A path is a sequence of@templates@separated by semicolons. For each template,
+$require$will change each interrogation mark in the template by$filename$,
+which is$modname$with each dot replaced by a "directory separator" (such as
+$"/"$ in Unix); then it will try to load the resulting file name. So, for
+instance, if the Lua path is
+>
+ "./?.lua;./?.lc;/usr/local/?/init.lua"
+>
+the search for a Lua loader for module$foo$will try to load the files
+$./foo.lua$,$./foo.lc$, and$/usr/local/foo/init.lua$, in that order.
+
+
+$package.preload$ *lrv-package.preload*
+-----------------
+A table to store loaders for specific modules (see |lrv-require|).
+
+
+$package.seeall (module)$ *lrv-package.seeall*
+-------------------------
+Sets a metatable for$module$with its$__index$field referring to the global
+environment, so that this module inherits values from the global environment.
+To be used as an option to function$module$.
+
+
+==============================================================================
+5.4 - String Manipulation *lrv-libString*
+
+
+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 -1, and
+so on.
+
+The string library provides all its functions inside the table$string$.
+It also sets a metatable for strings where the$__index$field points to the
+$string$table. Therefore, you can use the string functions in object-oriented
+style. For instance,$string.byte(s, i)$can be written as$s:byte(i)$.
+
+
+
+$string.byte (s [, i [, j]])$ *lrv-string.byte*
+-----------------------------
+Returns the internal numerical codes of the characters$s[i]$,$s[i+1]$,...,
+$s[j]$. The default value for$i$is 1; the default value for$j$is$i$.
+
+Note that numerical codes are not necessarily portable across platforms.
+
+
+$string.char (...)$ *lrv-string.char*
+-------------------
+Receives zero 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.
+
+Note that numerical codes are not necessarily portable across platforms.
+
+
+$string.dump (function)$ *lrv-string.dump*
+------------------------
+Returns a string containing a binary representation of the given function, so
+that a later$loadstring$on this string returns a copy of the function.
+$function$must be a Lua function without upvalues.
+
+
+$string.find (s, pattern [, init [, plain]])$ *lrv-string.find*
+---------------------------------------------
+Looks for the first match of$pattern$in the string$s$. If it finds a match,
+then$find$returns the indices of$s$where this occurrence starts and ends;
+otherwise, it returns#nil#. A third, optional numerical argument$init$
+specifies where to start the search; its default value is 1 and may be
+negative. A value of#true#as a fourth, optional argument$plain$turns off the
+pattern matching facilities, so the function does a plain "find substring"
+operation, with no characters in$pattern$being considered "magic". Note that
+if$plain$is given, then$init$must be given as well.
+
+
+If the pattern has captures, then in a successful match the captured values
+are also returned, after the two indices.
+
+
+$string.format (formatstring, ...)$ *lrv-string.format*
+-----------------------------------
+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$printf$family of standard C functions.
+The only differences are that the options/modifiers$*$,$l$,$L$,$n$,$p$, and$h$
+are not supported and that there is an extra option,$q$. The$q$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,
+embedded zeros, and backslashes in the string are correctly escaped when
+written. For instance, the call
+>
+ string.format('%q', 'a string with "quotes" and \n new line')
+>
+will produce the string:
+>
+ "a string with \"quotes\" and \
+ new line"
+>
+The options$c$,$d$,$E$,$e$,$f$,$g$,$G$,$i$,$o$,$u$,$X$, and$x$all expect a
+number as argument, whereas$q$and$s$expect a string.
+
+This function does not accept string values containing embedded zeros.
+
+
+$string.gmatch (s, pattern)$ *lrv-string.gmatch*
+----------------------------
+Returns an iterator function that, each time it is called, returns the next
+captures from$pattern$over string$s$.
+
+If$pattern$specifies no captures, then the whole match is produced in each
+call.
+
+As an example, the following loop
+>
+ s = "hello world from Lua"
+ for w in string.gmatch(s, "%a+") do
+ print(w)
+ end
+>
+will iterate over all the words from string$s$, printing one per line.
+The next example collects all pairs$key=value$from the given string into a
+table:
+>
+ t = {}
+ s = "from=world, to=Lua"
+ for k, v in string.gmatch(s, "(%w+)=(%w+)") do
+ t[k] = v
+ end
+>
+
+$string.gsub (s, pattern, repl [, n])$ *lrv-string.gsub*
+--------------------------------------
+Returns a copy of$s$in which all occurrences of the$pattern$have been replaced
+by a replacement string specified by$repl$, which may be a string, a table, or
+a function.$gsub$also returns, as its second value, the total number of
+substitutions made.
+
+If$repl$is a string, then its value is used for replacement. The character$%$
+works as an escape character: any sequence in$repl$of the form$%n$, with@n@
+between 1 and 9, stands for the value of the@n@-th captured substring (see
+below). The sequence$%0$stands for the whole match. The sequence$%%$stands for
+a single$%$.
+
+If$repl$is a table, then the table is queried for every match, using the first
+capture as the key; if the pattern specifies no captures, then the whole match
+is used as the key.
+
+If$repl$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 the table query or by the function call is a string
+or a number, then it is used as the replacement string; otherwise, if it is
+#false#or#nil#, then there is no replacement (that is, the original match is
+kept in the string).
+
+The optional last parameter$n$limits the maximum number of substitutions to
+occur. For instance, when$n$is 1 only the first occurrence of$pattern$is
+replaced.
+
+Here are some examples:
+>
+ x = string.gsub("hello world", "(%w+)", "%1 %1")
+ --> x="hello hello world world"
+
+ x = string.gsub("hello world", "%w+", "%0 %0", 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.1"}
+ x = string.gsub("$name%-$version.tar.gz", "%$(%w+)", t)
+ --> x="lua-5.1.tar.gz"
+>
+
+$string.len (s)$ *lrv-string.len*
+----------------
+Receives a string and returns its length. The empty string$""$has length 0.
+Embedded zeros are counted, so$"a\000b\000c"$has length 5.
+
+
+$string.lower (s)$ *lrv-string.lower*
+------------------
+Receives a string and returns a copy of this string with all uppercase letters
+changed to lowercase. All other characters are left unchanged. The definition
+of what an uppercase letter is depends on the current locale.
+
+
+$string.match (s, pattern [, init])$ *lrv-string.match*
+------------------------------------
+Looks for the first@match@of$pattern$in the string$s$. If it finds one, then
+$match$returns the captures from the pattern; otherwise it returns#nil#.
+If$pattern$specifies no captures, then the whole match is returned. A third,
+optional numerical argument$init$specifies where to start the search; its
+default value is 1 and may be negative.
+
+
+$string.rep (s, n)$ *lrv-string.rep*
+-------------------
+Returns a string that is the concatenation of$n$copies of the string$s$.
+
+
+$string.reverse (s)$ *lrv-string.reverse*
+--------------------
+Returns a string that is the string$s$reversed.
+
+
+$string.sub (s, i [, j])$ *lrv-string.sub*
+-------------------------
+Returns the substring of$s$that starts at$i$and continues until$j$;$i$and$j$
+may be negative. If$j$is absent, then it is assumed to be equal to@-1@(which
+is the same as the string length). In particular, the call$string.sub(s,1,j)$
+returns a prefix of$s$with length$j$, and$string.sub(s,-i)$returns a suffix
+of$s$with length$i$.
+
+
+$string.upper (s)$ *lrv-string.upper*
+------------------
+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 a lowercase letter is depends on the current locale.
+
+
+------------------------------------------------------------------------------
+5.4.1 Patterns *lrv-patterns* *lrv-libStringPat*
+
+
+A@character class@is used to represent a set of characters. The following
+combinations are allowed in describing a character class:
+
+ #o#@x@: (where@x@is not one of@the magic characters@ ^$()%.[]*+-? )
+ represents the character@x@itself.
+ #o#$.$: (a dot) represents all characters.
+ #o#$%a$: represents all letters.
+ #o#$%c$: represents all control characters.
+ #o#$%d$: represents all digits.
+ #o#$%l$: represents all lowercase letters.
+ #o#$%p$: represents all punctuation characters.
+ #o#$%s$: represents all space characters.
+ #o#$%u$: represents all uppercase letters.
+ #o#$%w$: represents all alphanumeric characters.
+ #o#$%x$: represents all hexadecimal digits.
+ #o#$%z$: represents the character with representation 0.
+ #o#$%x$(where@x@is any non-alphanumeric character) represents the
+ character@x@. This is the standard way to escape the magic characters.
+ Any punctuation character (even the non-magic) can be preceded by a
+ $'%'$when used to represent itself in a pattern.
+
+ #o#$[set]$: represents the class which is the union of all characters in
+ @set@. A range of characters may be specified by separating the end
+ characters of the range with a$'-'$. All classes$%x$described above may
+ also be used as components in@set@. All other characters in@set@
+ represent themselves. For example,$[%w_]$(or$[_%w]$) represents all
+ alphanumeric characters plus the underscore,$[0-7]$represents the octal
+ digits, and$[0-7%l%-]$represents the octal digits plus the lowercase
+ letters plus the$'-'$character.
+
+ The interaction between ranges and classes is not defined. Therefore,
+ patterns like$[%a-z]$or$[a-%%]$have no meaning.
+
+ #o#$[^set]$: represents the complement of@set@, where@set@is interpreted
+ as above.
+
+For all classes represented by single letters ($%a$,$%c$, etc.), the
+corresponding uppercase letter represents the complement of the class. For
+instance,$%S$represents all non-space characters.
+
+The definitions of letter, space, and other character groups depend on the
+current locale. In particular, the class$[a-z]$may not be equivalent to$%l$.
+
+ *lrv-patternitem*
+Pattern Item:~
+-------------
+A@pattern item@may be
+
+ #o# a single character class, which matches any single character in the
+ class;
+ #o# a single character class followed by$'*'$, which matches 0 or more
+ repetitions of characters in the class. These repetition items will
+ always match the longest possible sequence;
+ #o# a single character class followed by$'+'$, which matches 1 or more
+ repetitions of characters in the class. These repetition items will
+ always match the longest possible sequence;
+ #o# a single character class followed by$'-'$, which also matches 0 or
+ more repetitions of characters in the class. Unlike$'*'$, these
+ repetition items will always match the@shortest@possible sequence;
+ #o# a single character class followed by$'?'$, which matches 0 or 1
+ occurrences of a character in the class;
+ #o#$%n$, for@n@between 1 and 9; such item matches a substring equal to the
+ @n@-th captured string (see below);
+ #o#$%bxy$, where@x@and@y@are two distinct characters; such item matches
+ strings that start with@x@, end with@y@, and where the@x@and@y@
+ are@balanced@. This means that, if one reads the string from left to
+ right, counting@+1@for an@x@and@-1@for a@y@, the ending@y@is the first
+ @y@where the count reaches 0. For instance, the item$%b()$matches
+ expressions with balanced parentheses.
+
+ *lrv-pattern*
+Pattern:~
+--------
+A@pattern@is a sequence of pattern items. A$'^'$at the beginning of a pattern
+anchors the match at the beginning of the subject string. A '$' at the end of
+a pattern anchors the match at the end of the subject string. At other
+positions,$'^'$and '$' have no special meaning and represent themselves.
+
+ *lrv-capture*
+Captures:~
+---------
+A pattern may contain sub-patterns enclosed in parentheses; they describe
+@captures@. When a match succeeds, the substrings of the subject string that
+match captures are stored (@captured@) for future use. Captures are numbered
+according to their left parentheses. For instance, in the pattern
+$"(a*(.)%w(%s*))"$, the part of the string matching$"a*(.)%w(%s*)"$is
+stored as the first capture (and therefore has number 1); the character
+matching$.$is captured with number 2, and the part matching$%s*$has number 3.
+
+As a special case, the empty capture$()$captures the current string position
+(a number). For instance, if we apply the pattern$"()aa()"$on the
+string$"flaaap"$, there will be two captures: 3 and 5.
+
+A pattern cannot contain embedded zeros. Use$%z$instead.
+
+
+==============================================================================
+5.5 Table Manipulation *lrv-libTable*
+
+
+This library provides generic functions for table manipulation. It provides
+all its functions inside the table$table$.
+
+Most functions in the table library assume that the table represents an array
+or a list. For those functions, when we talk about the "length" of a table we
+mean the result of the length operator.
+
+
+$table.concat (table [, sep [, i [, j]]])$ *lrv-table.concat*
+------------------------------------------
+Given an array where all elements are strings or numbers, returns
+$table[i]..sep..table[i+1] ... sep..table[j]$. The default value for$sep$is
+the empty string, the default for$i$is 1, and the default for$j$is the length
+of the table. If$i$is greater than$j$, returns the empty string.
+
+
+$table.foreach (table, f)$ *lrv-table.foreach*
+--------------------------
+Executes the given$f$over all elements of$table$. For each element,$f$is
+called with the index and respective value as arguments. If$f$returns a
+non-#nil#value, then the loop is broken, and this value is returned as the
+final value of$table.foreach$.
+
+See |lrv-next| for extra information about table traversals.
+
+
+$table.foreachi (table, f)$ *lrv-table.foreachi*
+---------------------------
+Executes the given$f$over the numerical indices of$table$. For each
+index,$f$is called with the index and respective value as arguments. Indices
+are visited in sequential order, from 1 to$n$, where$n$is the length of the
+table. If$f$returns a non-#nil#value, then the loop is broken and this value
+is returned as the result of$table.foreachi$.
+
+
+$table.insert (table, [pos,] value)$ *lrv-table.insert*
+------------------------------------
+Inserts element$value$at position$pos$in$table$, shifting up other elements to
+open space, if necessary. The default value for$pos$is$n+1$, where$n$is the
+length of the table (see |lrv-langLength|), so that a call$table.insert(t,x)$
+inserts$x$at the end of table$t$.
+
+
+$table.maxn (table)$ *lrv-table.maxn*
+--------------------
+Returns the largest positive numerical index of the given table, or zero if
+the table has no positive numerical indices. (To do its job this function does
+a linear traversal of the whole table.)
+
+
+$table.remove (table [, pos])$ *lrv-table.remove*
+------------------------------
+Removes from$table$the element at position$pos$, shifting down other elements
+to close the space, if necessary. Returns the value of the removed element.
+The default value for$pos$is$n$, where$n$is the length of the table (see
+|lrv-langLength|), so that a call$table.remove(t)$removes the last element of
+table$t$.
+
+
+$table.sort (table [, comp])$ *lrv-table.sort*
+-----------------------------
+Sorts table elements in a given order,@in-place@, from$table[1]$to$table[n]$,
+where$n$is the length of the table (see |lrv-langLength|). If$comp$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$not comp(a[i+1],a[i])$will be
+true after the sort). If$comp$is not given, then the standard Lua
+operator$<$is used instead.
+
+The sort algorithm is@not@stable, that is, elements considered equal by the
+given order may have their relative positions changed by the sort.
+
+
+==============================================================================
+5.6 Mathematical Functions *lrv-libMath*
+
+
+This library is an interface to most of the functions of the standard C math
+library. It provides all its functions inside the table$math$.
+
+
+$math.abs (x)$ *lrv-math.abs*
+--------------
+Returns the absolute value of$x$.
+
+
+$math.acos (x)$ *lrv-math.acos*
+---------------
+Returns the arc cosine of$x$(in radians).
+
+
+$math.asin (x)$ *lrv-math.asin*
+---------------
+Returns the arc sine of$x$(in radians).
+
+
+$math.atan (x)$ *lrv-math.atan*
+---------------
+Returns the arc tangent of$x$(in radians).
+
+
+$math.atan2 (x, y)$ *lrv-math.atan2*
+-------------------
+Returns the arc tangent of$x/y$(in radians), but uses the signs of both
+parameters to find the quadrant of the result. (It also handles correctly the
+case of$y$being zero.)
+
+
+$math.ceil (x)$ *lrv-math.ceil*
+---------------
+Returns the smallest integer larger than or equal to$x$.
+
+
+$math.cos (x)$ *lrv-math.cos*
+--------------
+Returns the cosine of$x$(assumed to be in radians).
+
+
+$math.cosh (x)$ *lrv-math.cosh*
+---------------
+Returns the hyperbolic cosine of$x$.
+
+
+$math.deg (x)$ *lrv-math.deg*
+--------------
+Returns the angle$x$(given in radians) in degrees.
+
+
+$math.exp (x)$ *lrv-math.exp*
+--------------
+Returns the value$e^x$.
+
+
+$math.floor (x)$ *lrv-math.floor*
+----------------
+Returns the largest integer smaller than or equal to$x$.
+
+
+$math.fmod (x, y)$ *lrv-math.fmod*
+------------------
+Returns the remainder of the division of$x$by$y$.
+
+
+$math.frexp (x)$ *lrv-math.frexp*
+----------------
+Returns$m$and$e$such that$x = m * 2^e$,$e$is an integer and the absolute value
+of$m$is in the range@[0.5, 1)@(or zero when$x$is zero).
+
+
+$math.huge$ *lrv-math.huge*
+-----------
+The value$HUGE_VAL$, a value larger than or equal to any other numerical
+value.
+
+
+$math.ldexp (m, e)$ *lrv-math.ldexp*
+-------------------
+Returns$m * 2^e$($e$should be an integer).
+
+
+$math.log (x)$ *lrv-math.log*
+--------------
+Returns the natural logarithm of$x$.
+
+
+$math.log10 (x)$ *lrv-math.log10*
+----------------
+Returns the base-10 logarithm of$x$.
+
+
+$math.max (x, ...)$ *lrv-math.max*
+-------------------
+Returns the maximum value among its arguments.
+
+
+$math.min (x, ...)$ *lrv-math.min*
+-------------------
+Returns the minimum value among its arguments.
+
+
+$math.modf (x)$ *lrv-math.modf*
+---------------
+Returns two numbers, the integral part of$x$and the fractional part of$x$.
+
+
+$math.pi$ *lrv-math.pi*
+---------
+The value of@pi@.
+
+
+$math.pow (x, y)$ *lrv-math.pow*
+-----------------
+Returns$x^y$. (You can also use the expression$x^y$to compute this value.)
+
+
+$math.rad (x)$ *lrv-math.rad*
+--------------
+Returns the angle$x$(given in degrees) in radians.
+
+
+$math.random ([m [, n]])$ *lrv-math.random*
+-------------------------
+This function is an interface to the simple pseudo-random generator function
+$rand$provided by ANSI C. (No guarantees can be given for its statistical
+properties.)
+
+When called without arguments, returns a pseudo-random real number in the
+range@[0,1)@. When called with a number$m$,$math.random$returns a
+pseudo-random integer in the range@[1, m]@. When called with two numbers$m$
+and$n$,$math.random$returns a pseudo-random integer in the range@[m, n]@.
+
+
+$math.randomseed (x)$ *lrv-math.randomseed*
+---------------------
+Sets$x$as the "seed" for the pseudo-random generator: equal seeds produce
+equal sequences of numbers.
+
+
+$math.sin (x)$ *lrv-math.sin*
+--------------
+Returns the sine of$x$(assumed to be in radians).
+
+
+$math.sinh (x)$ *lrv-math.sinh*
+---------------
+Returns the hyperbolic sine of$x$.
+
+
+$math.sqrt (x)$ *lrv-math.sqrt*
+---------------
+Returns the square root of$x$. (You can also use the expression$x^0.5$to
+compute this value.)
+
+
+$math.tan (x)$ *lrv-math.tan*
+--------------
+Returns the tangent of$x$(assumed to be in radians).
+
+
+$math.tanh (x)$ *lrv-math.tanh*
+---------------
+Returns the hyperbolic tangent of$x$.
+
+
+==============================================================================
+5.6 Input and Output Facilities *lrv-libIO*
+
+
+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 these default files. The second style uses explicit file
+descriptors.
+
+When using implicit file descriptors, all operations are supplied by
+table$io$. When using explicit file descriptors, the operation$io.open$returns
+a file descriptor and then all operations are supplied as methods of the file
+descriptor.
+
+The table$io$also provides three predefined file descriptors with their usual
+meanings from C:$io.stdin$,$io.stdout$, and$io.stderr$.
+
+Unless otherwise stated, all I/O functions return#nil#on failure (plus an
+error message as a second result) and some value different from#nil#on
+success.
+
+
+$io.close ([file])$ *lrv-io.close*
+-------------------
+Equivalent to$file:close$. Without a$file$, closes the default output file.
+
+
+$io.flush ()$ *lrv-io.flush*
+-------------
+Equivalent to$file:flush$over the default output file.
+
+
+$io.input ([file])$ *lrv-io.input*
+-------------------
+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 this file handle as the default input file. When called without
+parameters, it returns the current default input file.
+
+In case of errors this function raises the error, instead of returning an
+error code.
+
+
+$io.lines ([filename])$ *lrv-io.lines*
+-----------------------
+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
+
+ $for line in io.lines(filename) do$@body@$end$
+
+will iterate over all lines of the file. When the iterator function detects
+the end of file, it returns#nil#(to finish the loop) and automatically closes
+the file.
+
+The call$io.lines()$(without a file name) is equivalent to
+$io.input():lines()$; that is, it iterates over the lines of the default input
+file. In this case it does not close the file when the loop ends.
+
+
+$io.open (filename [, mode])$ *lrv-io.open*
+-----------------------------
+This function opens a file, in the mode specified in the string$mode$. It
+returns a new file handle, or, in case of errors,#nil#plus an error message.
+
+The$mode$string can be any of the following:
+
+ #o#@"r"@: read mode (the default);
+ #o#@"w"@: write mode;
+ #o#@"a"@: append mode;
+ #o#@"r+"@: update mode, all previous data is preserved;
+ #o#@"w+"@: update mode, all previous data is erased;
+ #o#@"a+"@: append update mode, previous data is preserved, writing is only
+ allowed at the end of file.
+
+The$mode$string may also have a$'b'$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$fopen$.
+
+
+$io.output ([file])$ *lrv-io.output*
+--------------------
+Similar to$io.input$, but operates over the default output file.
+
+
+$io.popen (prog [, mode])$ *lrv-io.popen*
+--------------------------
+Starts program$prog$in a separated process and returns a file handle that you
+can use to read data from this program (if$mode$is$"r"$, the default) or to
+write data to this program (if$mode$is$"w"$).
+
+This function is system dependent and is not available on all platforms.
+
+
+$io.read (...)$ *lrv-io.read*
+---------------
+Equivalent to$io.input():read$.
+
+
+$io.tmpfile ()$ *lrv-io.tmpfile*
+---------------
+Returns a handle for a temporary file. This file is opened in update mode and
+it is automatically removed when the program ends.
+
+
+$io.type (obj)$ *lrv-io.type*
+---------------
+Checks whether$obj$is a valid file handle. Returns the string$"file"$if$obj$is
+an open file handle,$"closed file"$if$obj$is a closed file handle, or#nil#if
+$obj$is not a file handle.
+
+
+$io.write (...)$ *lrv-io.write*
+----------------
+Equivalent to$io.output():write$.
+
+
+$file:close ()$ *lrv-file:close*
+---------------
+Closes$file$. Note that files are automatically closed when their handles are
+garbage collected, but that takes an unpredictable amount of time to happen.
+
+
+$file:flush ()$ *lrv-file:flush*
+---------------
+Saves any written data to$file$.
+
+
+$file:lines ()$ *lrv-file:lines*
+---------------
+Returns an iterator function that, each time it is called, returns a new line
+from the file. Therefore, the construction
+
+ $for line in file:lines() do$@body@$end$
+
+will iterate over all lines of the file. (Unlike$io.lines$, this function does
+not close the file when the loop ends.)
+
+
+$file:read (...)$ *lrv-file:read*
+-----------------
+Reads the file$file$, 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#nil#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).
+
+The available formats are
+
+ #o##"*n"#: reads a number; this is the only format that returns a number
+ instead of a string.
+ #o##"*a"#: reads the whole file, starting at the current position. On end of
+ file, it returns the empty string.
+ #o##"*l"#: reads the next line (skipping the end of line), returning#nil#on
+ end of file. This is the default format.
+ #o#@number@: reads a string with up to that number of characters, returning
+ #nil#on end of file. If number is zero, it reads nothing and returns an
+ empty string, or#nil#on end of file.
+
+
+$file:seek ([whence] [, offset])$ *lrv-file:seek*
+---------------------------------
+Sets and gets the file position, measured from the beginning of the file, to
+the position given by$offset$plus a base specified by the string$whence$, as
+follows:
+
+ #o##"set"#: base is position 0 (beginning of the file);
+ #o##"cur"#: base is current position;
+ #o##"end"#: base is end of file;
+
+In case of success, function$seek$returns the final file position, measured in
+bytes from the beginning of the file. If this function fails, it returns#nil#,
+plus a string describing the error.
+
+The default value for$whence$is$"cur"$, and for$offset$is 0. Therefore, the
+call$file:seek()$returns the current file position, without changing it; the
+call$file:seek("set")$sets the position to the beginning of the file (and
+returns 0); and the call$file:seek("end")$sets the position to the end of the
+file, and returns its size.
+
+
+$file:setvbuf (mode [, size])$ *lrv-file:setvbuf*
+------------------------------
+Sets the buffering mode for an output file. There are three available modes:
+
+ #o##"no"#: no buffering; the result of any output operation appears
+ immediately.
+ #o##"full"#: full buffering; output operation is performed only when the
+ buffer is full (or when you explicitly$flush$the file (see
+ |lrv-io.flush|).
+ #o##"line"#: line buffering; output is buffered until a newline is output or
+ there is any input from some special files (such as a terminal device).
+
+For the last two cases,$size$specifies the size of the buffer, in bytes.
+The default is an appropriate size.
+
+
+$file:write (...)$ *lrv-file:write*
+------------------
+Writes the value of each of its arguments to$file$. The arguments must be
+strings or numbers. To write other values, use$tostring$|lrv-tostring| or
+$string.format$|lrv-string.format| before$write$.
+
+
+==============================================================================
+5.8 Operating System Facilities *lrv-libOS*
+
+
+This library is implemented through table$os$.
+
+
+$os.clock ()$ *lrv-os.clock*
+-------------
+Returns an approximation of the amount in seconds of CPU time used by the
+program.
+
+
+$os.date ([format [, time]])$ *lrv-os.date*
+-----------------------------
+Returns a string or a table containing date and time, formatted according to
+the given string$format$.
+
+If the$time$argument is present, this is the time to be formatted (see the
+$os.time$function |lrv-os.time| for a description of this value). Otherwise,
+$date$formats the current time.
+
+If$format$starts with$'!'$,then the date is formatted in Coordinated Universal
+Time. After this optional character, if$format$is the string$"*t"$, then$date$
+returns a table with the following fields:$year$(four digits),$month$(1-12),
+$day$(1-31),$hour$(0-23),$min$(0-59),$sec$(0-61),$wday$(weekday, Sunday is 1),
+$yday$(day of the year), and$isdst$(daylight saving flag, a boolean).
+
+If$format$is not$"*t"$, then$date$returns the date as a string, formatted
+according to the same rules as the C function$strftime$.
+
+When called without arguments,$date$returns a reasonable date and time
+representation that depends on the host system and on the current locale (that
+is,$os.date()$is equivalent to$os.date("%c")$).
+
+
+$os.difftime (t2, t1)$ *lrv-os.difftime*
+----------------------
+Returns the number of seconds from time$t1$to time$t2$. In POSIX, Windows, and
+some other systems, this value is exactly$t2 - t1$.
+
+
+$os.execute ([command])$ *lrv-os.execute*
+----------------------
+This function is equivalent to the C function$system$. It passes$command$to be
+executed by an operating system shell. It returns a status code, which is
+system-dependent. If$command$is absent, then it returns nonzero if a shell is
+available and zero otherwise.
+
+
+$os.exit ([code])$ *lrv-os.exit*
+------------------
+Calls the C function$exit$, with an optional$code$, to terminate the host
+program. The default value for$code$is the success code.
+
+
+$os.getenv (varname)$ *lrv-os.getenv*
+---------------------
+Returns the value of the process environment variable$varname$, or#nil#if the
+variable is not defined.
+
+
+$os.remove (filename)$ *lrv-os.remove*
+----------------------
+Deletes the file with the given name. Directories must be empty to be removed.
+If this function fails, it returns#nil#, plus a string describing the error.
+
+
+$os.rename (oldname, newname)$ *lrv-os.rename*
+------------------------------
+Renames file named$oldname$to$newname$. If this function fails, it returns
+#nil#, plus a string describing the error.
+
+
+$os.setlocale (locale [, category])$ *lrv-os.setlocale*
+------------------------------------
+Sets the current locale of the program.$locale$is a string specifying a
+locale;$category$is an optional string describing which category to change:
+$"all"$,$"collate"$,$"ctype"$,$"monetary"$,$"numeric"$, or$"time"$; the
+default category is$"all"$. The function returns the name of the new locale,
+or#nil#if the request cannot be honored.
+
+
+$os.time ([table])$ *lrv-os.time*
+-------------------
+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
+$year$,$month$, and$day$, and may have fields$hour$,$min$,$sec$, and$isdst$
+(for a description of these fields, see the$os.date$function |lrv-os.date|).
+
+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$time$can be used only as
+an argument to$date$and$difftime$.
+
+
+$os.tmpname ()$ *lrv-os.tmpname*
+---------------
+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 explicitly removed when no
+longer needed.
+
+
+==============================================================================
+5.9 The Debug Library *lrv-libDebug*
+
+
+This 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, several of its functions violate some
+assumptions about Lua code (e.g., that variables local to a function cannot be
+accessed from outside or that userdata metatables cannot be changed by Lua
+code) and therefore can compromise otherwise secure code.
+
+All functions in this library are provided inside the$debug$table. All
+functions that operate over a thread have an optional first argument which is
+the thread to operate over. The default is always the current thread.
+
+
+$debug.debug ()$ *lrv-debug.debug*
+----------------
+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$cont$finishes this function, so that the
+caller continues its execution.
+
+Note that commands for$debug.debug$are not lexically nested within any
+function, and so have no direct access to local variables.
+
+
+$debug.getfenv (o)$ *lrv-debug.getfenv*
+-------------------
+Returns the environment of object$o$.
+
+
+$debug.gethook ([thread])$ *lrv-debug.gethook*
+--------------------------
+Returns the current hook settings of the thread, as three values: the current
+hook function, the current hook mask, and the current hook count (as set by
+the$debug.sethook$function).
+
+
+$debug.getinfo ([thread,] function [, what])$ *lrv-debug.getinfo*
+---------------------------------------------
+Returns a table with information about a function. You can give the function
+directly, or you can give a number as the value of$function$, which means the
+function running at level$function$of the call stack of the given thread:
+level 0 is the current function ($getinfo$itself); level 1 is the function
+that called$getinfo$; and so on. If$function$is a number larger than the
+number of active functions, then$getinfo$returns#nil#.
+
+The returned table may contain all the fields returned by$lua_getinfo$(see
+|lrv-lua_getinfo|), with the string$what$describing which fields to fill in.
+The default for$what$is to get all information available, except the table of
+valid lines. If present, the option$'f'$adds a field named$func$with the
+function itself. If present, the option$'L'$adds a field named$activelines$
+with the table of valid lines.
+
+For instance, the expression$debug.getinfo(1,"n").name$returns the name of the
+current function, if a reasonable name can be found, and$debug.getinfo(print)$
+returns a table with all available information about the$print$function.
+
+
+$debug.getlocal ([thread,] level, local)$ *lrv-debug.getlocal*
+-----------------------------------------
+This function returns the name and the value of the local variable with index
+$local$of the function at level$level$of the stack. (The first parameter or
+local variable has index 1, and so on, until the last active local variable.)
+The function returns#nil#if there is no local variable with the given index,
+and raises an error when called with a$level$out of range. (You can call
+$debug.getinfo$|lrv-debug.getinfo| to check whether the level is valid.)
+
+Variable names starting with$'('$(open parentheses) represent internal
+variables (loop control variables, temporaries, and C function locals).
+
+
+$debug.getmetatable (object)$ *lrv-debug.getmetatable*
+-----------------------------
+Returns the metatable of the given$object$or#nil#if it does not have a
+metatable.
+
+
+$debug.getregistry ()$ *lrv-debug.getregistry*
+----------------------
+Returns the registry table (see |lrv-apiRegistry|).
+
+
+$debug.getupvalue (func, up)$ *lrv-debug.getupvalue*
+-----------------------------
+This function returns the name and the value of the upvalue with index$up$of
+the function$func$. The function returns#nil#if there is no upvalue with the
+given index.
+
+
+$debug.setfenv (object, table)$ *lrv-debug.setfenv*
+-------------------------------
+Sets the environment of the given$object$to the given$table$. Returns$object$.
+
+
+$debug.sethook ([thread,] hook, mask [, count])$ *lrv-debug.sethook*
+------------------------------------------------
+Sets the given function as a hook. The string$mask$and the number$count$
+describe when the hook will be called. The string mask may have the following
+characters, with the given meaning:
+
+ #o#@"c"@: The hook is called every time Lua calls a function;
+ #o#@"r"@: The hook is called every time Lua returns from a function;
+ #o#@"l"@: The hook is called every time Lua enters a new line of code.
+
+With a$count$different from zero, the hook is called after every$count$
+instructions.
+
+When called without arguments, the$debug.sethook$turns off the hook.
+
+When the hook is called, its first parameter is a string describing the
+event that triggered its call:$"call"$,$"return"$(or$"tail return"$),$"line"$,
+and$"count"$. For line events, the hook also gets the new line number as its
+second parameter. Inside a hook, you can call$getinfo$with level 2 to get
+more information about the running function (level 0 is the$getinfo$function,
+and level 1 is the hook function), unless the event is$"tail return"$. In this
+case, Lua is only simulating the return, and a call to$getinfo$will return
+invalid data.
+
+
+$debug.setlocal ([thread,] level, local, value)$ *lrv-debug.setlocal*
+------------------------------------------------
+This function assigns the value$value$to the local variable with index$local$
+of the function at level$level$of the stack. The function returns#nil#if there
+is no local variable with the given index, and raises an error when called
+with a$level$out of range. (You can call$getinfo$to check whether the level is
+valid.) Otherwise, it returns the name of the local variable.
+
+
+$debug.setmetatable (object, table)$ *lrv-debug.setmetatable*
+------------------------------------
+Sets the metatable for the given$object$to the given$table$(which can be
+#nil#).
+
+
+$debug.setupvalue (func, up, value)$ *lrv-debug.setupvalue*
+------------------------------------
+This function assigns the value$value$to the upvalue with index$up$of the
+function$func$. The function returns#nil#if there is no upvalue with the given
+index. Otherwise, it returns the name of the upvalue.
+
+
+$debug.traceback ([thread,] [message] [,level])$ *lrv-debug.traceback*
+------------------------------------------------
+Returns a string with a traceback of the call stack. An optional$message$
+string is appended at the beginning of the traceback. An optional$level$number
+tells at which level to start the traceback (default is 1, the function
+calling$traceback$).
+
+
+==============================================================================
+6 LUA STAND-ALONE *lrv-lua* *lrv-LuaSA*
+==============================================================================
+
+
+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$lua$, is provided
+with the standard distribution. The stand-alone interpreter includes all
+standard libraries, including the debug library. Its usage is:
+>
+ lua [options] [script [args]]
+>
+The options are:
+
+ #o#$-e$@stat@: executes string@stat@;
+ #o#$-l$@mod@: "requires"@mod@;
+ #o#$-i$: enters interactive mode after running@script@;
+ #o#$-v$: prints version information;
+ #o#$--$: stops handling options;
+ #o#$-$: executes$stdin$as a file and stops handling options.
+
+After handling its options,$lua$runs the given@script@, passing to it the
+given@args@as string arguments. When called without arguments,$lua$behaves
+as$lua -v -i$when the standard input ($stdin$) is a terminal, and as
+$lua -$otherwise.
+
+Before running any argument, the interpreter checks for an environment
+variable$LUA_INIT$. If its format is$@filename$, then$lua$executes the file.
+Otherwise,$lua$executes the string itself.
+
+All options are handled in order, except$-i$. For instance, an invocation
+like
+>
+ $ lua -e'a=1' -e 'print(a)' script.lua
+>
+will first set$a$to 1, then print the value of$a$(which is$'1'$), and finally
+run the file$script.lua$with no arguments. (Here, '$' is the shell prompt.
+Your prompt may be different.)
+
+Before starting to run the script,$lua$collects all arguments in the command
+line in a global table called$arg$. The script name is stored in index 0, the
+first argument after the script name goes to index 1, and so on. Any arguments
+before the script name (that is, the interpreter name plus the options) go to
+negative indices. For instance, in the call
+>
+ $ lua -la b.lua t1 t2
+>
+the interpreter first runs the file$a.lua$, then creates a table
+>
+ arg = { [-2] = "lua", [-1] = "-la",
+ [0] = "b.lua",
+ [1] = "t1", [2] = "t2" }
+>
+and finally runs the file$b.lua$. The script is called with$arg[1]$,$arg[2]$,
+... as arguments; it can also access these arguments with the vararg expression
+$'...'$.
+
+In interactive mode, if you write an incomplete statement, the interpreter
+waits for its completion by issuing a different prompt.
+
+If the global variable$_PROMPT$contains a string, then its value is used as
+the prompt. Similarly, if the global variable$_PROMPT2$contains a string, its
+value is used as the secondary prompt (issued during incomplete statements).
+Therefore, both prompts can be changed directly on the command line. For
+instance,
+>
+ $ lua -e"_PROMPT='myprompt> '" -i
+>
+(the outer pair of quotes is for the shell, the inner pair is for Lua), or in
+any Lua programs by assigning to$_PROMPT$. Note the use of$-i$to enter
+interactive mode; otherwise, the program would just end silently right after
+the assignment to$_PROMPT$.
+
+To allow the use of Lua as a script interpreter in Unix systems, the
+stand-alone interpreter skips the first line of a chunk if it starts with$#$.
+Therefore, Lua scripts can be made into executable programs by using$chmod +x$
+and the$#!$form, as in
+>
+ #!/usr/local/bin/lua
+>
+(Of course, the location of the Lua interpreter may be different in your
+machine. If$lua$is in your$PATH$, then
+>
+ #!/usr/bin/env lua
+>
+is a more portable solution.)
+
+
+==============================================================================
+A BIBLIOGRAPHY *lrv-bibliography*
+==============================================================================
+
+This help file is a minor adaptation from this main reference:
+
+ #o# R. Ierusalimschy, L. H. de Figueiredo, and W. Celes.,
+ "Lua: 5.1 reference manual",$http://www.lua.org/manual/5.1/manual.html$
+
+Lua is discussed in these references:
+
+ #o#R. Ierusalimschy, L. H. de Figueiredo, and W. Celes.,
+ "Lua --- an extensible extension language".
+ @Software: Practice & Experience@#26##6 (1996) 635-652.
+
+ #o#L. H. de Figueiredo, R. Ierusalimschy, and W. Celes.,
+ "The design and implementation of a language for extending applications".
+ @Proc. of XXI Brazilian Seminar on Software and Hardware@(1994) 273-283.
+
+ #o#L. H. de Figueiredo, R. Ierusalimschy, and W. Celes.,
+ "Lua: an extensible embedded language".
+ @Dr. Dobb's Journal@#21##12 (Dec 1996) 26-33.
+
+ #o#R. Ierusalimschy, L. H. de Figueiredo, and W. Celes.,
+ "The evolution of an extension language: a history of Lua".
+ @Proc. of V Brazilian Symposium on Programming Languages@(2001) B-14-B-28.
+
+
+==============================================================================
+B COPYRIGHT & LICENSES *lrv-copyright*
+==============================================================================
+
+
+This help file has the same copyright and license as Lua 5.1 and the Lua 5.1
+ manual:
+
+Copyright (c) 1994-2006 Lua.org, PUC-Rio.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+
+
+==============================================================================
+C LUAREFVIM DOC *luarefvim* *luarefvimdoc* *lrv-help* *lrv-doc*
+==============================================================================
+
+
+This is a Vim help file containing a reference for Lua 5.1, and it is -- with
+a few exceptions and adaptations -- a copy of the Lua 5.1 Reference Manual
+(see |lrv-bibliography|). For usage information, refer to |lrv-docUsage|; for
+instalation, refer to |lrv-docInstall|.
+
+This manual is composed of three parts: this file,$luarefvim.txt$, that is,
+the manual itself; a plugin file, $luarefvim.vim$, defining key bindings; and
+a help file syntax extension, $help.vim$. See |lrv-docInstall| for more
+information on these files. For copyright information, see |lrv-copyright|.
+
+The main ideas and concepts on how to implement this reference were taken from
+Christian Habermann's CRefVim project
+($http://www.vim.org/scripts/script.php?script_id=614$).
+
+
+==============================================================================
+C.1 Installation *lrv-docInstall*
+
+
+This reference consists of three files: the manual itself,$luarefvim.txt$,
+a plugin file,$luarefvim.vim$, to load key bindings, and a help file syntax
+extension$help.vim$. To install luarefvim, copy these files to their
+respective locations:
+
+ +-----------------+----------------+
+ |# file #|# location #|
+ + ----------------+----------------+
+ |$ luarefvim.txt $|$ doc $|
+ |$ luarefvim.vim $|$ plugin $|
+ |$ help.vim $|$ after/syntax $|
+ +-----------------+----------------+
+
+where #location# is relative to 'runtimepath', that is, $HOME/.vim for a local
+Un*x install or $HOME/vimfiles for a local Win32 install, for example.
+Finally, to generate the tags, change dir to$doc$above (where you installed
+$luarefvim.txt$), start Vim, and issue$:helptags .$For more information on
+installing help files, call$:help add-local-help$.
+
+
+==============================================================================
+C.2 Usage *lrv-docUsage*
+
+
+The usage is really simple, and similar to CRefVim:
+
+ +----------+--------------+----------------------------------------+
+ |# edit #|# key #| |
+ |# mode #|# sequence #|# action #|
+ +----------+--------------+----------------------------------------+
+ |@ normal @| <Leader>lr | reference for word under cursor |
+ |@ visual @| <Leader>lr | reference for visually selected text |
+ |$ any $| <Leader>lc | manual's table of contents |
+ +----------+--------------+----------------------------------------+
+
+Since by default <Leader> is mapped to$'\'$, just pressing$\lc$would bring the
+table of contents, for example.$lr$stands for@(l)ua (r)eference@, while$lc$
+stands for@(l)ua (c)ontents@.
+
+
+------------------------------------------------------------------------------
+ vi:tw=78:ts=4:ft=help:norl:noai
+