Libreria Standard di Lua
Lua offre una libreria standard compatta ma potente, coerente con la filosofia del linguaggio: leggera, veloce e facile da integrare. Le librerie principali coprono operazioni matematiche, manipolazione di tabelle, interazione con il sistema operativo e gestione delle stringhe.
Panoramica delle Librerie Standard
Lua include le seguenti librerie di base:
- math – funzioni matematiche
- table – manipolazione di tabelle (array e sequenze)
- string – operazioni sulle stringhe
- os – interazione con il sistema operativo
- io – input/output su file
- coroutine – gestione delle coroutine
- debug – strumenti di debug e introspezione
La Libreria math
La libreria math fornisce funzioni matematiche standard. Tutte le funzioni operano su numeri in virgola mobile (float) o interi a seconda della versione di Lua.
Costanti e Funzioni di Base
-- Costanti
print(math.pi) -- 3.1415926535898
print(math.huge) -- inf (infinito)
print(math.maxinteger) -- 9223372036854775807 (Lua 5.3+)
print(math.mininteger) -- -9223372036854775808 (Lua 5.3+)
-- Arrotondamento
print(math.floor(3.7)) -- 3 (arrotonda verso il basso)
print(math.ceil(3.2)) -- 4 (arrotonda verso l'alto)
print(math.floor(-2.3)) -- -3
print(math.ceil(-2.3)) -- -2
Valore Assoluto, Massimo e Minimo
print(math.abs(-42)) -- 42
print(math.abs(15)) -- 15
print(math.max(10, 25, 7, 43, 3)) -- 43
print(math.min(10, 25, 7, 43, 3)) -- 3
-- Esempio pratico: clamp di un valore in un intervallo
local function clamp(valore, minimo, massimo)
return math.max(minimo, math.min(massimo, valore))
end
print(clamp(150, 0, 100)) -- 100
print(clamp(-20, 0, 100)) -- 0
print(clamp(50, 0, 100)) -- 50
Radice Quadrata e Funzioni Trigonometriche
print(math.sqrt(144)) -- 12.0
print(math.sqrt(2)) -- 1.4142135623731
-- Le funzioni trigonometriche lavorano in radianti
print(math.sin(math.pi / 2)) -- 1.0
print(math.cos(0)) -- 1.0
print(math.sin(0)) -- 0.0
-- Conversione gradi <-> radianti
local function gradi_a_radianti(gradi)
return gradi * math.pi / 180
end
print(math.sin(gradi_a_radianti(90))) -- 1.0
print(math.cos(gradi_a_radianti(180))) -- -1.0
Numeri Casuali
-- Inizializza il generatore di numeri casuali
math.randomseed(os.time())
print(math.random()) -- float tra 0 e 1
print(math.random(10)) -- intero tra 1 e 10
print(math.random(5, 20)) -- intero tra 5 e 20
-- Esempio: simulazione lancio dado
local function lancia_dado(facce)
facce = facce or 6
return math.random(1, facce)
end
for i = 1, 5 do
print("Lancio " .. i .. ": " .. lancia_dado())
end
La Libreria table
La libreria table fornisce funzioni per manipolare tabelle usate come array (sequenze con indici numerici a partire da 1).
Inserimento e Rimozione
local frutti = {"mela", "banana", "arancia"}
-- Inserisce alla fine
table.insert(frutti, "uva")
-- frutti = {"mela", "banana", "arancia", "uva"}
-- Inserisce in posizione specifica
table.insert(frutti, 2, "kiwi")
-- frutti = {"mela", "kiwi", "banana", "arancia", "uva"}
-- Rimuove l'ultimo elemento
local rimosso = table.remove(frutti)
print(rimosso) -- "uva"
-- Rimuove in posizione specifica
local rimosso2 = table.remove(frutti, 1)
print(rimosso2) -- "mela"
-- frutti = {"kiwi", "banana", "arancia"}
Ordinamento
local numeri = {45, 12, 78, 3, 56, 23}
table.sort(numeri)
-- numeri = {3, 12, 23, 45, 56, 78}
-- Ordinamento personalizzato (decrescente)
table.sort(numeri, function(a, b) return a > b end)
-- numeri = {78, 56, 45, 23, 12, 3}
-- Ordinamento di tabelle complesse
local studenti = {
{nome = "Marco", voto = 28},
{nome = "Anna", voto = 30},
{nome = "Luca", voto = 25},
}
table.sort(studenti, function(a, b) return a.voto > b.voto end)
for _, s in ipairs(studenti) do
print(s.nome .. ": " .. s.voto)
end
-- Anna: 30, Marco: 28, Luca: 25
Concatenazione e Spostamento
local parole = {"Lua", "e'", "un", "linguaggio", "potente"}
-- Concatena gli elementi con un separatore
local frase = table.concat(parole, " ")
print(frase) -- "Lua e' un linguaggio potente"
-- Concatena con separatore diverso
local csv = table.concat({"Mario", "Rossi", "42"}, ",")
print(csv) -- "Mario,Rossi,42"
-- table.move (Lua 5.3+): copia elementi tra posizioni
local t = {1, 2, 3, 4, 5, 6}
table.move(t, 3, 5, 1) -- copia posizioni 3-5 a partire dalla posizione 1
-- t = {3, 4, 5, 4, 5, 6}
La Libreria os
La libreria os permette di interagire con il sistema operativo per gestire tempo, data e comandi di sistema.
Tempo e Data
-- Timestamp corrente (secondi dal 1 gennaio 1970)
local timestamp = os.time()
print(timestamp) -- es. 1738972800
-- Data formattata
print(os.date("%d/%m/%Y")) -- "08/02/2026"
print(os.date("%H:%M:%S")) -- "14:30:25"
print(os.date("%A, %d %B %Y")) -- "Sunday, 08 February 2026"
-- Data da un timestamp specifico
local data = os.date("*t", timestamp)
print(data.year) -- 2026
print(data.month) -- 2
print(data.day) -- 8
print(data.hour) -- 14
print(data.wday) -- giorno della settimana (1 = domenica)
-- Creare un timestamp da una data
local ts = os.time({year = 2026, month = 12, day = 25, hour = 0})
print(os.date("%d/%m/%Y", ts)) -- "25/12/2026"
Misurare il Tempo di Esecuzione
local inizio = os.clock()
-- Operazione da misurare
local somma = 0
for i = 1, 1000000 do
somma = somma + i
end
local fine = os.clock()
print(string.format("Tempo impiegato: %.4f secondi", fine - inizio))
Esecuzione di Comandi di Sistema
-- Eseguire un comando del sistema operativo
os.execute("echo Ciao dal terminale")
-- Variabili d'ambiente
local home = os.getenv("HOME") or os.getenv("USERPROFILE")
print("Directory home: " .. (home or "non trovata"))
Riepilogo della Libreria string
La libreria string offre funzioni fondamentali per la manipolazione del testo.
local testo = "Programmazione in Lua"
print(string.upper(testo)) -- "PROGRAMMAZIONE IN LUA"
print(string.lower(testo)) -- "programmazione in lua"
print(string.len(testo)) -- 21
print(string.sub(testo, 1, 15)) -- "Programmazione "
print(string.rep("Lua ", 3)) -- "Lua Lua Lua "
print(string.reverse(testo)) -- "auL ni enoizammargorP"
-- Ricerca con pattern
local inizio, fine = string.find(testo, "Lua")
print(inizio, fine) -- 20 22
-- Sostituzione
local nuovo = string.gsub(testo, "Lua", "Lua 5.4")
print(nuovo) -- "Programmazione in Lua 5.4"
-- Formattazione
print(string.format("Nome: %s, Eta': %d, Media: %.2f", "Marco", 25, 27.85))
-- "Nome: Marco, Eta': 25, Media: 27.85"
Esempio Pratico Completo
Creiamo un sistema di gestione voti che utilizza tutte le librerie viste.
-- Sistema di gestione voti studenti
math.randomseed(os.time())
local registro = {}
-- Popola il registro con dati di esempio
local nomi = {"Marco", "Anna", "Luca", "Sara", "Paolo"}
for _, nome in ipairs(nomi) do
local voti = {}
for i = 1, 5 do
table.insert(voti, math.random(18, 30))
end
table.insert(registro, {nome = nome, voti = voti})
end
-- Calcola la media per ogni studente
for _, studente in ipairs(registro) do
local somma = 0
for _, voto in ipairs(studente.voti) do
somma = somma + voto
end
studente.media = somma / #studente.voti
end
-- Ordina per media decrescente
table.sort(registro, function(a, b) return a.media > b.media end)
-- Stampa il report
print(string.format("%-10s %-25s %s", "Nome", "Voti", "Media"))
print(string.rep("-", 45))
for _, s in ipairs(registro) do
local voti_str = table.concat(s.voti, ", ")
print(string.format("%-10s %-25s %.1f", s.nome, voti_str, s.media))
end
print("\nReport generato il: " .. os.date("%d/%m/%Y alle %H:%M"))
Conclusione
La libreria standard di Lua, pur essendo minimalista rispetto ad altri linguaggi, fornisce tutti gli strumenti necessari per le operazioni piu’ comuni. La libreria math copre il calcolo numerico, table gestisce le strutture dati, os interagisce con il sistema e string manipola il testo. Questa compattezza rende Lua ideale come linguaggio embedded leggero e veloce.