Sintassi di Base
Lua e un linguaggio dalla sintassi minimalista ed elegante. Comprendere le regole di base della sintassi e il primo passo per scrivere programmi corretti e leggibili. In questo articolo esploreremo le convenzioni sintattiche fondamentali, i blocchi di codice, le parole riservate e la struttura generale di un programma Lua.
Regole Fondamentali
La sintassi di Lua segue alcune regole semplici ma importanti:
Punti e Virgola Opzionali
In Lua, i punti e virgola alla fine delle istruzioni sono opzionali. La maggior parte dei programmatori Lua non li utilizza:
-- Entrambe le forme sono valide
print("Ciao")
print("Ciao");
-- Piu istruzioni sulla stessa riga (il punto e virgola aiuta la leggibilita)
local x = 10; local y = 20; print(x + y)
La convenzione nella comunita Lua e di non usare i punti e virgola, a meno che non si mettano piu istruzioni sulla stessa riga.
Case Sensitivity
Lua e case-sensitive, ovvero distingue tra lettere maiuscole e minuscole:
local nome = "Marco"
local Nome = "Giulia"
local NOME = "Alessandro"
-- Queste sono tre variabili completamente diverse
print(nome) --> Marco
print(Nome) --> Giulia
print(NOME) --> Alessandro
Questo vale anche per le parole chiave: and e una parola riservata, ma And o AND sono identificatori validi (anche se sconsigliati per chiarezza).
Identificatori
I nomi delle variabili, funzioni e tabelle in Lua seguono queste regole:
- Devono iniziare con una lettera o un underscore (
_) - Possono contenere lettere, cifre e underscore
- Non possono essere parole riservate
-- Identificatori validi
local contatore = 0
local _valore_privato = 42
local camelCase = "valido"
local nome2 = "anche questo e valido"
-- Identificatori NON validi
-- local 2nome = "errore" -- inizia con un numero
-- local mio-valore = 10 -- contiene un trattino
-- local for = "errore" -- parola riservata
Per convenzione, gli identificatori che iniziano con un underscore seguito da lettere maiuscole (come _VERSION) sono riservati per variabili interne di Lua.
Spazi Bianchi e Indentazione
Lua ignora gli spazi bianchi extra, le tabulazioni e le righe vuote. L’indentazione non e significativa dal punto di vista sintattico (a differenza di Python), ma e fondamentale per la leggibilita:
-- Corretto ma illeggibile
if true then print("ciao") local x=10 print(x) end
-- Molto meglio con l'indentazione corretta
if true then
print("ciao")
local x = 10
print(x)
end
Parole Riservate
Lua ha solo 22 parole riservate, un numero molto contenuto rispetto ad altri linguaggi:
and break do else elseif end
false for function goto if in
local nil not or repeat return
then true until while
Queste parole non possono essere usate come nomi di variabili o funzioni. La loro scarsita contribuisce alla semplicita del linguaggio.
Commenti
I commenti in Lua possono essere su singola riga o multilinea:
-- Questo e un commento su singola riga
--[[
Questo e un commento
su piu righe (multilinea).
Utile per documentazione estesa.
]]
--[[ Un trucco utile: per riattivare il codice commentato,
basta aggiungere un trattino all'apertura: ---[[ ]]
-- Commento inline
local x = 10 -- valore iniziale
Un trucco molto usato dai programmatori Lua e il seguente:
--[[
print("Questo codice e commentato")
--]]
-- Per riattivarlo, basta aggiungere un trattino:
---[[
print("Questo codice e attivo!")
--]]
Chunk: L’Unita di Esecuzione
In Lua, un chunk e un’unita di codice che viene compilata e eseguita come un blocco unico. Un chunk puo essere un file intero, una stringa passata all’interprete o il contenuto della REPL interattiva:
-- Questo intero file e un chunk
local messaggio = "Ciao"
print(messaggio)
-- Ogni chunk e trattato internamente come una funzione anonima
-- Quindi puoi usare return al livello piu alto
return messaggio -- valido: restituisce un valore dal chunk
Quando esegui lua script.lua, l’intero file script.lua viene trattato come un singolo chunk. Nella REPL interattiva, ogni riga e un chunk separato.
Blocchi do…end
Il costrutto do..end permette di creare blocchi di codice espliciti. Questi blocchi definiscono un scope per le variabili locali:
local x = 10
do
local y = 20 -- y esiste solo in questo blocco
local x = 30 -- questa x "nasconde" quella esterna
print(x) --> 30
print(y) --> 20
end
print(x) --> 10 (la x originale)
-- print(y) --> errore! y non esiste qui
I blocchi do..end sono particolarmente utili per:
- Limitare lo scope di variabili temporanee
- Raggruppare logicamente sezioni di codice
- Evitare inquinamento del namespace
-- Esempio pratico: calcolo temporaneo
local risultato
do
local a = math.sin(1.5)
local b = math.cos(1.5)
risultato = math.sqrt(a * a + b * b)
end
-- a e b non esistono piu, ma risultato si
print("Risultato: " .. risultato) --> Risultato: 1.0
Stringhe Multilinea con [[]]
Lua offre una sintassi speciale per le stringhe letterali su piu righe tramite le doppie parentesi quadre [[ ]]:
local testo = [[
Questa e una stringa
su piu righe.
Non serve usare caratteri di escape
per le "virgolette" o gli 'apostrofi'.
]]
print(testo)
Per le stringhe che contengono ]] al loro interno, puoi usare una variante con segni di uguale:
local codice_html = [==[
<div class="container">
<p>Esempio con [[parentesi]] dentro la stringa</p>
</div>
]==]
print(codice_html)
Il numero di segni = deve corrispondere tra apertura e chiusura. Puoi usarne quanti ne vuoi: [=[, [==[, [===[, ecc.
Struttura di un Programma Lua
Un programma Lua tipico segue una struttura organizzata in questo modo:
-- 1. Importazione dei moduli
local socket = require("socket")
local json = require("cjson")
-- 2. Dichiarazione delle costanti e configurazione
local PORTA = 8080
local MAX_CONNESSIONI = 100
-- 3. Definizione delle funzioni
local function saluta(nome)
return "Ciao, " .. nome .. "!"
end
local function calcola_area(base, altezza)
return (base * altezza) / 2
end
-- 4. Logica principale del programma
local messaggio = saluta("Mondo")
print(messaggio)
local area = calcola_area(5, 10)
print("Area del triangolo: " .. area)
Differenze Chiave con Altri Linguaggi
Alcune particolarita della sintassi Lua rispetto ad altri linguaggi:
-- Lua usa "end" invece delle parentesi graffe
if x > 0 then
print("positivo")
end
-- L'operatore di disuguaglianza e ~= (non != come in C/Java)
if x ~= 0 then
print("diverso da zero")
end
-- La concatenazione di stringhe usa .. (non + come in JS/Python)
local nome_completo = "Mario" .. " " .. "Rossi"
-- Gli array partono da 1, non da 0
local frutti = {"mela", "pera", "banana"}
print(frutti[1]) --> mela
-- Non esiste l'operatore ++ o --
local contatore = 0
contatore = contatore + 1 -- l'unico modo per incrementare
Conclusione
La sintassi di Lua e volutamente minimale: poche parole riservate, regole semplici e una struttura chiara. Questa semplicita non e una limitazione, ma un punto di forza che rende il linguaggio facile da apprendere, leggere e integrare. Comprendere queste basi sintattiche e fondamentale per procedere con lo studio delle variabili, dei tipi di dato e delle strutture di controllo nei capitoli successivi.