Poniższy tekst podręcznika Lua jest w trakcie tłumaczenia, sugestie i uwagi na ten temat można zgłaszać jako problem na stronie projektu w GitHub.

1. Wprowadzenie

Lua jest językiem rozszerzającym, zaprojektowanym by zapewnić możliwość normalnego programowania proceduralnego wraz z opisem danych. Język ten oferuje również wsparcie dla programowania obiektowo zorientowanego, programowania funkcjonalnego oraz programowania sterowanego danymi (data driven programming). Głównym zastosowaniem Lua jest użycie jako wszechstronnego lekkiego języka skryptowego. Lua został napisany jako biblioteka w czystym C (ANSI C i  C++).

Będąc językiem rozszerzeń, w Lua nie istnieje pojęcie "programu głównego" (main); program uruchamiany jest wewnątrz programu gospodarza. Program gospodarz może wywoływać funkcje by uruchomić fragmenty programu napisanego w Lua, może zapisywać i odczytywać zmienne Lua oraz może dołączać funkcje napisane w C by mogły być uruchamiane wewnątrz programów Lua. Poprzez użycie funkcji napisanych w C, Lua otrzymuje wsparcie w rozwiązywaniu szerokiej gamy problemów, tworząc specyficzne języki. Dystrybucja Lua zawiera przykładowy program hosta nazwany lua, który korzysta z biblioteki Lua, oferując kompletny i samodzielny interpreter Lua.

Lua jest wolnym oprogramowaniem, udostępnianym oczywiście bez żadnych gwarancji, o czym świadczy licencja. Implementacja opisana w tym podręczniku jest dostępna na oficjalnej stronie Lua: www.lua.org.

Jak w każdym podręczniku, tak i tu nie opisujemy pewnych niuansów. Dyskusja szczegółów dotyczących projektowania języka Lua została opisana w dokumentach dostępnych na stronie Lua. Szczegółowe wprowadzenie do programowania w Lua zawarte jest w książce Roberto "Programming in Lua".

2. Podstawy

W tym rozdziale opisane są podstawowe założenia języka.

2.1. Wartości i typy

Lua jest językiem dynamicznych typów. Oznacza to że zmienna nie posiada konkretnego typu, jedynie wartość określana jest przez typ. Nie występuje definicja typu w języku. Każda wartość posiada swój własny typ.

Wszystkie wartości w Lua są wartościami pierwszej klasy. Oznacza to, że wartości mogą być przechowywane w zmiennych, przekazywane w parametrach do innych funkcji, oraz zwracane jako wynik funkcji.

Występuje osiem podstawowych typów w Lua: nil (wartość pusta), boolean, number (liczba), string (ciąg znaków), function (funkcja), userdata (dane użytkownika), thread (wątek) i table (tabela)

Nil jest typem dla wartości nil, której głównym zadaniem bycie innym od reszty wartości, zazwyczaj reprezentuje brak użytecznej wartości. Boolean jest typem wartości false i true. Wartości nil i false powodują iż warunek jest fałszywy, każda inna wartość jest prawdziwa. Number przedstawia liczbę rzeczywistą (liczbę zmiennoprzecinkową podwójnej precyzji). Operacje na liczbach wykonywane są zgodnie z implementacją w języku C, która jest zwykle zgodna z normą IEEE 754. Mimo to jest możliwe skompilowanie interpretera Lua tak aby korzystał z innych reprezentacji liczbowych, takich jak liczby zmiennoprzecinkowe pojedynczej precyzji, liczby całkowite 64-bitowe - więcej w pliku luaconf.h. String opisuje niezmienne sekwencje bajtów. Ciągi znaków w Lua mogą zawierać dowolny znak 8-bitowy, łącznie z \0.

8. Rozbieżności z poprzednią wersją

Poniżej znajduje się lista rozbieżności, które można napotkać przy przenoszeniu programu z Lua 5.1 do Lua 5.2. Część z nich można uniknąć kompilując Lua z odpowiednimi opcjami (więcej w pliku luaconf.h). Jednakże, wszystkie te opcje zostaną usunięte w kolejnej wersji Lua.

8.1. Zmiany w języku

8.2. Zmiany w bibliotekach

8.3. Zmiany w API

9. Kompletna składnia Lua

Poniżej znajduje się kompletna składnia Lua w rozszerzonym BNF. (Opis ten nie zawiera kolejności operatorów)

	chunk ::= block

	block ::= {stat} [retstat]

	stat ::=  ‘;’ | 
		 varlist ‘=’ explist | 
		 functioncall | 
		 label | 
		 break | 
		 goto Name | 
		 do block end | 
		 while exp do block end | 
		 repeat block until exp | 
		 if exp then block {elseif exp then block} [else block] end | 
		 for Name ‘=’ exp ‘,’ exp [‘,’ exp] do block end | 
		 for namelist in explist do block end | 
		 function funcname funcbody | 
		 local function Name funcbody | 
		 local namelist [‘=’ explist] 

	retstat ::= return [explist] [‘;’]

	label ::= ‘::’ Name ‘::’

	funcname ::= Name {‘.’ Name} [‘:’ Name]

	varlist ::= var {‘,’ var}

	var ::=  Name | prefixexp ‘[’ exp ‘]’ | prefixexp ‘.’ Name 

	namelist ::= Name {‘,’ Name}

	explist ::= exp {‘,’ exp}

	exp ::=  nil | false | true | Number | String | ‘...’ | functiondef | 
		 prefixexp | tableconstructor | exp binop exp | unop exp 

	prefixexp ::= var | functioncall | ‘(’ exp ‘)’

	functioncall ::=  prefixexp args | prefixexp ‘:’ Name args 

	args ::=  ‘(’ [explist] ‘)’ | tableconstructor | String 

	functiondef ::= function funcbody

	funcbody ::= ‘(’ [parlist] ‘)’ block end

	parlist ::= namelist [‘,’ ‘...’] | ‘...’

	tableconstructor ::= ‘{’ [fieldlist] ‘}’

	fieldlist ::= field {fieldsep field} [fieldsep]

	field ::= ‘[’ exp ‘]’ ‘=’ exp | Name ‘=’ exp | exp

	fieldsep ::= ‘,’ | ‘;’

	binop ::= ‘+’ | ‘-’ | ‘*’ | ‘/’ | ‘^’ | ‘%’ | ‘..’ | 
		 ‘<’ | ‘<=’ | ‘>’ | ‘>=’ | ‘==’ | ‘~=’ | 
		 and | or

	unop ::= ‘-’ | not | ‘#’