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.
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".
W tym rozdziale opisane są podstawowe założenia języka.
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.
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.
_ENV
lub funkcję load
.
Funckje w C nie posiadają już środowisk. Należy użyć wolnej zmiennej ze współdzieloną tabelą jeżeli jest to konieczne by przechowywać współdzielony stan dla kilku funkcji w C. (Można wykorzystać funkcję luaL_setfuncs
by otworzyć bibliotekę w C z wszystkimi funkcjami dzielącymi wspólną wolną zmienną.)
By manipulować "środowiskiem" userdata (nazywanych teraz user value), należy wykorzystać nowe funkcje lua_getuservalue
i lua_setuservalue
.
module
jest przestarzała. Przy pomocy normalnego kodu Lua możliwe jest utworzenie modułu. Moduły nie powinny ustawiać zmiennych globalnych.setenv
i getenv
zostały usunięte, z powodu zmian w środowiskach.math.log10
jest przestarzała. Należy używać math.log
z 10 jako drugim parametrem.loadstring
jest przestarzała. Zamiast niej należy używać funkcji load
; funkcja ta akceptuje ciągi znaków jako argumenty dokładnie jak loadstring
.table.maxn
jest przestarzała. Należy napisać ją w Lua jeżeli jest potrzebna.os.execute
zwraca true jeżeli poleceie zakończy się sukcesem i nil wraz z informacją o błędzie w przeciwnym wypadku.unpack
została przeniesiona do biblioteki tabel i musi być wywoływana jako table.unpack
.%z
w wzorcach jest przestarzała, od teraz wzorce mogą zawierać '\0'
jako normalny znak.package.loaders
otrzymała nową nazwę package.searchers
.load
i loadfile
mode
tych funkcji, by ograniczyć je do ładowania tylko tekstowych fragmentów kodu.
LUA_GLOBALSINDEX
został usunięnty. Globalne środowisko należy pobrać z rejesru (4.5).
LUA_ENVIRONINDEX
i funkcje lua_getenv/lua_setenv
zostały usunięte, ponieważ funkcje w C nie mają już środowisk.
luaL_register
jest przestarzała. Należy korzystać z funkcji luaL_setfuncs
, gdyż moduł nie utworzy zmiennych globalnych. (Ustawianie zmiennych globalnych przez moduły nie jest spodziewanym zachowaniem.)
osize
funkcji alokacji nie może być zerowy podczas tworzenia nowego bloku, oznacza to że ptr
jest NULL
(lua_Alloc
). Aby sprawdzić czy blok jest nowy należy sprawdzić ptr==NULL
.
__gc
) dla danych użytkownika są wywoływane w odwrotnej kolejności niż były oznaczone do finalizacji, a nie w kolejności utworzenia (2.5.1). Większość obiektów userdata jest oznaczana zaraz po utworzeniu. Ponadto, jeżeli podczas tworzenia metatabela nie posiada pola __gc
, finalizator nie zostanie wywołany, nawet jeżeli pole to zosranie ustawione później.
luaL_typerror
została usunięta. W razie potrzeby należy taką funkcję napisać.
lua_cpcall
jest przestarzała. Można łatwo umieścić nową funkcję przy pomocy lua_pushfunction
i wywołać ją przy pomocy lua_pcall
.
lua_equal
i lua_lessthan
są przestarzałe. Zamiast nich należy użyć nowej funkcji lua_compare
korzystając z odpowiednich opcji.lua_objlen
nazywa się lua_rawlen
lua_load
posiada dodatkowy parametr, mode
. Należy przkeazać NULL
by symulować poprzednie zachowanie.lua_resume
posiada dodatkowy paramter from
. Należy przekazać NULL
lub wątek podczas wywołania.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 | ‘#’