vuoi
o PayPal
tutte le volte che vuoi
Commenti in Lua
Per i commenti multilinea, si utilizza il tag --[[ blablabla--]]
.
Numeri in Lua
I numeri in Lua sono di tipo numerico e possono essere interi o con virgola mobile. Il punto separa la parte intera dalla parte decimale e possono essere scritti anche valori elevati. Si possono utilizzare anche numeri esadecimali mettendo davanti al numero il prefisso 0x
.
Tipi e valori in Lua
Lua è un linguaggio typed dynamically, il che significa che non è necessario specificare il tipo di oggetto che viene inserito. Esistono sei tipi di base in Lua:
nil
: viene utilizzato per indicare l'assenza di un elemento, ad esempio per deallocare dalla memoria un oggetto non più utile.boolean
: rappresenta i valoritrue
efalse
. Tutti i valori che sonofalse
onil
rappresentano il falso, mentre tutti i valori diversi da quest'ultimo sono veri.- ...
true: rappresenta un valore booleano vero.
number: rappresenta un numero.
string: rappresenta una sequenza di caratteri, solitamente tra un coppia di virgolette.
function: si può assegnare una funzione ad una variabile.
table: è una lista di proprietà rappresentata da una coppia nome/valore.
Lua definisce alcune regole automatiche di conversione tra numeri e stringhe; se applichiamo un operatore che lavora su numeri ad una stringa, Lua cerca di convertire la stringa in numero. Viceversa, se applichiamo un operatore che lavora su stringhe ad un numero, Lua cerca di convertire il numero in una stringa.
= è l'operatore che serve per concatenare due stringhe.
VARIABILI IN LUA
Sistono tre tipi di variabili in Lua:
global: una variabile globale non si dichiara e nasce dal primo assegnamento che si fa. È una variabile che dura ed è visibile durante tutta l'esecuzione dell'applicazione ed è visibile in tutti i file e script del progetto. Se si vuole
eliminare una variabile si utilizza il tag htmlnil
; il garbage collector la elimina. Sono più inefficienti rispetto alle variabili locali, in quanto appesantiscono il codice.
Le variabili locali sono visibili soltanto nel blocco in cui sono state dichiarate. I blocchi si dichiarano con il tag html do
e end
. Se viene dichiarata una variabile locale all'inizio dello script, verrà visualizzata solo in quello script (come se l'intero script fosse un blocco do
end
).
Le variabili locali si possono utilizzare solo se vengono definite precedentemente.
Le tabelle sono insiemi di proprietà, ai quali viene associato un valore; sono variabili locali relative alla tabella in cui sono definite.
Tutto in Lua è modellato tramite le tabelle; la sintassi generica per dichiarare una tabella globale è:
t = { field1 = val1, field2 = val2, ..., fieldn = valn }
Se si volesse dichiarare una tabella locale, basta aggiungere prima del nome t
il tag html local
.Possono avere anche tabelle vuote, usando una coppia di graffe {} senza nessuna proprietà. I valori associati alle tabelle possono essere qualsiasi (numeri, valori, stringhe, oggetti complessi come audio o video, funzioni, ecc.)
Nelle tabelle si possono descrivere diverse proprietà come:
- friction: densità, peso
- density: elasticità
- bounce:
Per inserire elementi della tabella si possono usare due notazioni:
- = tabella, = valore
- t.x1, t.x2, t["x"]
ESEMPIO
person = {} person.name = "Gino" person["surname"] = "Rossi" person.age = 25 print(person["surname"]) print(person.age)
COMMENTO
Creo la mia tabella vuota
person = {}
Seleziono la proprietà (se non esiste viene creata) e associo la stringa "Gino"
person.name = "Gino"
Faccio la stessa cosa con la proprietà (con la notazione 2)
person["surname"] = "Rossi"
Faccio la stessa cosa con un valore
numericoperson.age = 25 Stampo in console i valori della proprietà selezionata surname print(person["surname"]) Stampo il valore di (selezionata con la notazione 1)age print(person.age) TABELLE E ARRAY Le tabelle sono un tipo di array chiamato associativo, cioè degli array in cui gli indici non sono dei numeri, ma dei nomi. Si può accedere al contenuto delle celle degli array associativi tramite il nome della proprietà. Per definire un array: a = {4,6,7,-1} Gli indici degli array in Lua partono dal valore 1. L'esempio sotto stamperà il primo valore della cella. print(a[1]) Per inserire un valore nell'array si utilizza la sintassi sottostante; verrà creata una quinta cella in coda all'array iniziale con il valore 100. a[5] = 100 MATRICI Per modellare delle matrici si utilizzano array di array; nell'esempio la prima riga sarà 1,2, la seconda 3,4, la terza 4,5. local m ={{1,2}, {3,4}, {4,5}} Output: 1 2 3 4 4 5 Se vogliamo
Stampare il valore 5 della matrice m, bisogna indicare il numero di righe e colonne dove è contenuto il valore (riga 3 e colonna 2). Verrà stampato il valore di quella cella.
print(m[3][2])
ESPRESSIONI
somma +
differenza -
moltiplicazione *
divisione /
modulo %
potenze ^
uguale a ==
diverso ~=
minore <
maggiore >
minore o uguale <=
maggiore o uguale >=
Se con l'operatore i tipi sono diversi (stringa e numero per esempio) il test fallisce già in partenza; se sono uguali il programma passa alla confrontazione del contenuto. L'esempio sottostante darà come risultato false, perché i due tipi sono diversi.
print("0" == 0)
Se i tipi sono uguali (due numeri) si passa alla comparazione. L'esempio darà true
print(2+1 == 3)
Con i dati complessi (immagini, suoni) in tabelle il test darà sempre come risultato false. Per avere come risultato true bisogna porre come uguali (=) le due tabelle.
CONNETTORI LOGICI
Le espressioni sintattiche
Possono essere collegate con dei connettori logici che sono and, or, not. Ritorna il primo argomento se il valore è true, altrimenti ritorna il secondo argomento.
and: false and nil, ritorna il primo argomento se il valore è diverso da false, altrimenti ritorna il secondo.
or: nil or false, ritorna il primo argomento se il valore è diverso da nil, altrimenti ritorna il secondo.
Qualsiasi valore diverso da e è (anche un numero).
false nil true
ESEMPI ->
10 or 20 -> 10
10 or error() -> "a"
nil or "a" -> nil
nil and 10 -> false
false and error() -> false
false and nil -> nil
false or nil -> 20
10 and 20 -> false
not(true) -> true
not(nil) -> false
not(20)
OPERATORE DI CONCATENAZIONE DI STRINGHE
Permette di concatenare insieme più stringhe ed è rappresentato da " .. ".
local s = "scia" .. "rada" .. 42
Output: sciarada42
OPERATORE DI LUNGHEZZA
L'operatore # permette di calcolare il numero di elementi di un array. Può essere applicato anche alle stringhe. È inutile applicarlo
alle tabelle perché darà sempre come risultato 0, perché l'operatore calcola solo le celle referenziate da dei numeri (indici).a= {4,6,7,-1}
print(#a)
Output: 4
STRUTTURA DI CONTROLLO IF
Il comando che ci permette di effettuare delle scelte è il comando a unico ramo.
if
if (condition) then
block of commands
end
ESEMPIO
if(number_of_lives == 0) then
game_over = true
go_to_start()
end
STRUTTURA DI CONTROLLO IF - ELSE
Il comando di controllo a due rami contiene l'else.
if
if (condition) then
block of commands 1
else
block of commands 2
end
STRUTTURA DI CONTROLLO IF - ELSEIF
In questa struttura abbiamo una serie di condizioni e verrà eseguito solo il blocco corrispondente alla condizione che è stata verificata. Se nessuna delle condizioni viene soddisfatta verrà eseguito il ramo else finale (che non è obbligatorio, in quel caso non esegue nulla).
if(condition) then
block of commands 1
elseif (condition2) then
block of commands 2
elseif(condition3)
then block of commands 3…else block of commands Nend
STRUTTURA DI CONTROLLO WHILE
La parola chiave while
esegue il blocco di istruzioni e continua a ripetere il ciclo ogni volta che la condizione associata ad essa è vera.
local i = 0
while (i <= 5) do
print(i)
i = i + 1
end
STRUTTURA DI CONTROLLO REPEAT
Il blocco ripete il blocco di istruzioni finché la condizione in coda finale è falsa.
local i = 5
repeat
print(i)
i = i - 1
until i < 0
STRUTTURA DI CONTROLLO FOR NUMERICO
È il primo modo per definire i cicli. Si definisce una variabile (v) che sarà locale al ciclo for
. Questa variabile prende tre espressioni:
- valore iniziale (e1: v)
- valore finale che deve raggiungere (e2: v)
- passo con cui arrivare da a durante l'esecuzione del ciclo (per default il valore è 1) (e3: e1 e2)
Questo valore può essere anche negativo.
for v = e1, e2, e3 do
block of commands
end
ESEMPIO
for a = 0, 8, 2
doprint(a)end
<STRONG>STRUTTURA DI CONTROLLO FOR GENERICO</STRONG>
<p>I cicli generici sfruttano delle funzioni esterne chiamati iteratori; gli iteratori sono funzioni che
permettono sequenzialmente di estrarre valori da una certa struttura. La sequenza con cui vengono
selezionati gli elementi è definita dall'iteratore.</p>
<p>for è un'operatore sequenziale che permette di selezionare due elementi dall'array; l'indice della cella
pairse il suo valore (ritorna due valori) e verranno inseriti nelle variabili edindex elem.
Successivamente verranno stampati posizione, indice e valore.</p>
<p>array = {3,7,10}
for index, elem in ipairs(array) do
print("position"..index..":"..elem)
end</p>
<STRONG>FUNZIONI</STRONG>
<p>Le funzioni si definiscono utilizzando la parola chiave <code>function</code> seguita dal nome della funzione; tra una
coppia di parentesi tonde si inseriscono eventuali elementi di input della funzione, i parametri formali.
Questi parametri sono necessari alla funzione per calcolare un determinato</p>
ate utilizzando il tag <script>
all'interno del tag <head>
del documento HTML. Ad esempio:
```html