Lua


Lua is a lightweight, high-level, multi-paradigm programming language designed mainly for embedded use in applications. Lua is cross-platform software, since the interpreter of compiled bytecode is written in ANSI C, and Lua has a relatively simple C application programming interface to embed it into applications.
Lua originated in 1993 as a language for extending software applications to meet the increasing demand for customization at the time. It provided the basic facilities of most procedural programming languages, but more complicated or domain-specific features were not included; rather, it included mechanisms for extending the language, allowing programmers to implement such features. As Lua was intended to be a general embeddable extension language, the designers of Lua focused on improving its speed, portability, extensibility and ease-of-use in development.

History

Lua was created in 1993 by Roberto Ierusalimschy, Luiz Henrique de Figueiredo, and Waldemar Celes, members of the Computer Graphics Technology Group at the Pontifical Catholic University of Rio de Janeiro, in Brazil.
From 1977 until 1992, Brazil had a policy of strong trade barriers for computer hardware and software, believing that Brazil could and should produce its own hardware and software. In that climate, Tecgraf's clients could not afford, either politically or financially, to buy customized software from abroad; under the market reserve, clients would have to go through a complex bureaucratic process to prove their needs couldn't be met by Brazilian companies. Those reasons led Tecgraf to implement the basic tools it needed from scratch.
Lua's predecessors were the data-description and configuration languages Simple Object Language and Data-Entry Language. They had been independently developed at Tecgraf in 1992–1993 to add some flexibility into two different projects. There was a lack of any flow-control structures in SOL and DEL, and Petrobras felt a growing need to add full programming power to them.
In The Evolution of Lua, the language's authors wrote:
Lua 1.0 was designed in such a way that its object constructors, being then slightly different from the current light and flexible style, incorporated the data-description syntax of SOL . Lua syntax for control structures was mostly borrowed from Modula, but also had taken influence from CLU, C++, SNOBOL and AWK. In an article published in Dr. Dobb's Journal, Lua's creators also state that LISP and Scheme with their single, ubiquitous data-structure mechanism were a major influence on their decision to develop the table as the primary data structure of Lua.
Lua semantics have been increasingly influenced by Scheme over time, especially with the introduction of anonymous functions and full lexical scoping. Several features were added in new Lua versions.
Versions of Lua prior to version 5.0 were released under a license similar to the BSD license. From version 5.0 onwards, Lua has been licensed under the MIT License. Both are permissive free software licences and are almost identical.

Features

Lua is commonly described as a "multi-paradigm" language, providing a small set of general features that can be extended to fit different problem types. Lua does not contain explicit support for inheritance, but allows it to be implemented with [|metatables]. Similarly, Lua allows programmers to implement namespaces, classes and other related features using its single table implementation; first-class functions allow the employment of many techniques from functional programming and full lexical scoping allows fine-grained information hiding to enforce the principle of least privilege.
In general, Lua strives to provide simple, flexible meta-features that can be extended as needed, rather than supply a feature-set specific to one programming paradigm. As a result, the base language is light; the full reference interpreter is only about 247 kB compiled and easily adaptable to a broad range of applications.
As a dynamically typed language intended for use as an extension language or scripting language, Lua is compact enough to fit on a variety of host platforms. It supports only a small number of atomic data structures such as Boolean values, numbers and strings. Typical data structures such as arrays, sets, lists and records can be represented using Lua's single native data structure, the table, which is essentially a heterogeneous associative array.
Lua implements a small set of advanced features such as first-class functions, garbage collection, closures, proper tail calls, coercion, coroutines and dynamic module loading.

Syntax

The classic "Hello, World!" program can be written as follows, with or without parentheses:

print


print "Hello, World!"

The declaration of a variable, without a value.

local variable

The declaration of a variable with a value of 10.

local students = 10

A comment in Lua starts with a double-hyphen and runs to the end of the line, similar to Ada, Eiffel, Haskell, SQL and VHDL. Multi-line strings and comments are marked with double square brackets.

-- Single line comment
--
Multi-line comment
--

The factorial function is implemented in this example:

function factorial
local x = 1
for i = 2, n do
x = x * i
end
return x
end

Control flow

Lua has one type of conditional test: if then end with optional else and elseif then execution control constructs.
The generic if then end statement requires all three keywords:

if condition then
--statement body
end

An example of an if statement

if x ~= 10 then
print
end

The else keyword may be added with an accompanying statement block to control execution when the if condition evaluates to false:

if condition then
--statement body
else
--statement body
end

An example of an if else statement

if x 10 then
print
else
print
end

Execution may also be controlled according to multiple conditions using the elseif then keywords:

if condition then
--statement body
elseif condition then
--statement body
else -- optional
--optional default statement body
end

An example of an if elseif else statement

if x y then
print
elseif x z then
print
else -- optional
print
end

Lua has four types of conditional loops: the while loop, the repeat loop, the numeric for loop and the generic for loop.

--condition = true
while condition do
--statements
end
repeat
--statements
until condition
for i = first, last, delta do --delta may be negative, allowing the for loop to count down or up
--statements
--example: print
end

This generic for loop would iterate over the table _G using the standard iterator function pairs, until it returns nil:

for key, value in pairs do
print
end

Loops can also be nested.

local grid =
for y, row in pairs do
for x, value in pairs do
print
end
end

Functions

Lua's treatment of functions as first-class values is shown in the following example, where the print function's behavior is modified:

do
local oldprint = print
-- Store current print function as oldprint
function print
-- Redefine print function. The usual print function can still be used
through oldprint. The new one has only one argument.
oldprint
end
end

Any future calls to print will now be routed through the new function, and because of Lua's lexical scoping, the old print function will only be accessible by the new, modified print.
Lua also supports closures, as demonstrated below:

function addto
-- Return a new function that adds x to the argument
return function
-- When we refer to the variable x, which is outside the current
scope and whose lifetime would be shorter than that of this anonymous
function, Lua creates a closure.
return x + y
end
end
fourplus = addto
print -- Prints 7
--This can also be achieved by calling the function in the following way:
print)
-- This is because we are calling the returned function from 'addto' with the argument '3' directly.
This also helps to reduce data cost and up performance if being called iteratively.

A new closure for the variable x is created every time addto is called, so that each new anonymous function returned will always access its own x parameter. The closure is managed by Lua's garbage collector, just like any other object.

Tables

Tables are the most important data structures in Lua and are the foundation of all user-created types. They are associative arrays with addition of automatic numeric key and special syntax.
A table is a set of key and data pairs, where the data is referenced by key; in other words, it is a hashed heterogeneous associative array.
Tables are created using the constructor syntax.

a_table = -- Creates a new, empty table

Tables are always passed by reference.
A key can be any value except nil and NaN, including functions.

a_table = -- Creates a new table, with one entry mapping "x" to the number 10.
print -- Prints the value associated with the string key, in this case 10.
b_table = a_table
b_table = 20 -- The value in the table has been changed to 20.
print -- Prints 20.
print -- Also prints 20, because a_table and b_table both refer to the same table.

A table is often used as structure by using strings as keys. Because such use is very common, Lua features a special syntax for accessing such fields.

point = -- Create new table
print -- Prints 10
print -- Has exactly the same meaning as line above. The easier-to-read dot notation is just syntactic sugar.

By using a table to store related functions, it can act as a namespace.

Point =
Point.new = function
return -- return
end
Point.set_x = function
point.x = x -- point = x;
end

Tables are automatically assigned a numerical key, enabling them to be used as an array data type. The first automatic index is 1 rather than 0 as it is for many other programming languages.
A numeric key 1 is distinct from a string key "1".

array = -- Indices are assigned automatically.
print -- Prints "b". Automatic indexing in Lua starts at 1.
print -- Prints 4. # is the length operator for tables and strings.
array = "z" -- Zero is a legal index.
print -- Still prints 4, as Lua arrays are 1-based.

The length of a table t is defined to be any integer index n such that t is not nil and t is nil; moreover, if t is nil, n can 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", then #t can be any of the indices that directly precedes a nil value.

ExampleTable =
print -- Prints "3"
print -- Prints "8"

A table can be an array of objects.

function Point -- "Point" object constructor
return -- Creates and returns a new object
end
array = -- Creates array of points
-- array = ;
print -- Prints 40

Using a hash map to emulate an array is normally slower than using an actual array; however, Lua tables are optimized for use as arrays to help avoid this issue.