Wprowadzenie do języka Lua

Podstawowe informacje

Lua jest językiem dynamicznie typowanym, co oznacza, że nie ma potrzeby określania typu przy deklracji zmiennej. Język oczywiście posiada wbudowane typy proste takieje jak: liczba całkowita i zmienno przecinkowa oraz typ logiczny. Jednym typem złożonym jest tablica asocjacyjna (słownik), która może zostać wykorzystana do implementacji innych struktur danych oraz do emulacji obiektowści.

Lua posiada kilka zaawansowanych funkcjonalności znanych z innych języków programowanie, takich jak: funkcje pierwszej klasy, funkcje wyższego rzędu, domknięcia, odśmiecacz pamięci, rekurencja ogonowa, współprogramy. Istnieje również możliwośc rozszerzania możliwości Lua poprzez zastosowanie modyfikowanie tzw. "metatables". Pozwala to na przykład na przęciążanie operatorów. Wszystkie te właściowości czynią język wieloparadygmatowym.

Ważną informacją, szczególnie dla osób mających doświadczenie w innych języka, jest fakt, że w Lua tablice indeksowane są od jedynki, a nie od zera. Drugą ważną informacją jest to, że każda zmienna jest domyślnie globalna, aby uczynić ją lokalną należy użyć przed nazwą słowa kluczowego local.

--komentarz zaczynają się od podwójnego minusa
day = 10 --deklaracja zmiennej globalnej
local month = "marzec" --deklaracja zmiennej lokalnej
print(day .. " " .. month .. " " .. 2020) 

Funkcja print służy do wypisywania w oknie konsoli tekstu. Widoczne dwie kropki to operator konkatenacji. Alternatywnie można było użyć przecinków, wtedy wszytkie argumenty po wypisaniu byłyby oddzielone tabulatorami. Po uruchomieniu powyższego skryptu zostanie wypisany ciąg 10 marzec 2020.

Sterowanie przepływem

Instrukcje warunkowe

Lua nie posiada intrukcji typu switch-case, do dyspozycji mamy tylko instrukcje if-elseif-else.

if op == "+" then
  r = a + b
elseif op == "-" then
  r = a - b
elseif op == "*" then
  r = a*b
elseif op == "/" then
  r = a/b
else
  error("invalid operation")
end 

Pętle

Do dyspozcyji mamy pętle typu: while, repeate-until, for.

while condition do
  --operacje
end

repeat
  --operacje
until condition

--delta - dodawan do wartość początkowej
--        w każdym obiegu pętli, może być ujemna
for i = first, last, delta do
  --operacje
end 

Funkcje

Funkcje definiowane są za pomocą słowa kluczowego function. W Lua mamy do czynienia z funkcjami pierwszej klasy, więc można je przypisywać do zmiennych lub przekazywać do innych funkcji jako argument.

function add_one(num)
  return num + 1
end

local number = 10
new_add_one = add_one

print(new_add_one(number)) 

Tablice

Jedyną wbudowaną strukturą danych w Lua jest tablica asocjacyjna. Warto zauważyć, że jeżeli utworzym tablice pojedynczych elementów (a nie par klucz wartośc), zostanie automatycznie dodany indeks do każdego elementu.

Tablice deklaruje się wnastępujący sposób:

a_table = {} --tworzy pustą tablice
b_table = {x = 10}  --tworzy nową tablicę z jednym elementem x, do którego przypisana jest wartość 10
print(b_table["x"]) --wypisuje wartość przypisaną do klucza - 10
c_table = b_table   --taki przypisanie powoduje utworzenie referencji c_table to b_table
c_table["x"] = 20   --zmiana wartości na 20
print(c_table["x"]) --zostanie wypisane 20
print(b_table["x"]) --równierz zostanie wypisane 20

Tablice posiadają specjalną składnie, która umożliwia korzystanie z nich jak z obiektów w innych językach:

point = { x = 10, y = 20 }
print(point["x"]) --wypisze 10
print(point.x) --równierz wypisze 10 - wyrażenie jest równoważne z powyższym