il linguaggio Lua: parte 13

segue dalla parte 12 Upvalue e Closure Per chi non ha familiarità con i concetti di programmazione funzionale questi termini possono sembrare un po’ oscuri; vediamo di chiarirli con un semplice esempio: -- definisco una funzione che parte da un numero N e conta alla rovescia function CreaContatore(N) local v=N local function conta(x) if v>=x then v=v-x end return v end return conta end -- creo qualche istanza: contaDaDieci=CreaContatore(10) contaDaCento=CreaContatore(100) print(contaDaDieci(1)) 9 print(contaDaCento(1)) 99 print(contaDaCento(1)) 98 print(contaDaDieci(1)) 8 print(contaDaDieci(2)) 6 print(contaDaCento(10)) 88 osserviamo le variabili N,v che usate dalla funzione interna: non sono locali, ma nemmeno globali… Sono upvalue, ovvero riferimenti che provengono da uno stackframe esterno. Quando una funzione usa variabili definite in uno scope lessicale a livello superiore, Lua provvede a memorizzare lo stato, tecnicamente spostando la gestione degli upvalue dallo stack in una zona di memoria dedicata, perché altrimenti al ritorno della funzione lo stack verrebbe perso. Ogni funzione che usa uno o più upvalue è chiamata closure. Si tratta di una caratteristica molto potente perché ci permette ad esempio di implementare callback e sandbox. Un esempio a puro scopo didattico: ...

January 19, 2019 · Andrea Manzini

il linguaggio Lua: parte 12

segue dalla parte 11 segnalazioni lunari Tra le rocks più interessanti citiamo quelle che permettono le operazioni di networking, come luasocket; salendo di livello, spicca il Kepler project, che comprende un intero stack per applicazioni web: Lapis micro framework, il framework MVC Sailor, e TurboLua, un tool per costuire velocissimi microservizi REST . Concludiamo la panoramica sulle librerie accennando ai moduli per creare interfacce grafiche; al pari degli altri linguaggi di scripting, Lua offre binding per i maggiori toolkit grafici: curses, GTK, QT, fltk, wx si usano come negli altri linguaggi e sarebbe qui tedioso illustrarne le modalità. Ci focalizzeremo invece su due progetti peculiari, rispettivamente Lua Visual Controls (VCLua) e LÖVE , che hanno l’ulteriore pregio di essere leggeri e snelli. Scarichiamo e installiamo VCLua: ...

October 24, 2018 · Andrea Manzini

il linguaggio Lua: parte 11

segue dalla parte 10 Rocce di Luna Poter organizzare il codice in più file è molto utile per modularizzare i programmi, creando package che verranno caricati tramite l’istruzione require “nomefile”. Vediamo un esempio: -- geompkg.lua module("geom") local function quadrato(x) return x*x end local function rettangolo(b,h) return b*h end function area(param) if param.lato then return quadrato(param.lato) end local area=rettangolo(param.base,param.altezza) if param.triangolo or param.trapezio then return area/2 end return area end -- usepkg.lua require('geompkg') print(geom.area{base=3,altezza=5}) print(geom.area{lato=3}) --errore, quadrato è local nel modulo --quindi non accessibile esternamente print(geom.quadrato(5)) nell’esempio vogliamo separare le funzioni di calcolo geometrico dal programma principale, così le raggruppiamo in un file geompkg.lua; notiamo che nello stesso file abbiamo definito anche delle funzioni locali che non saranno visibili all’esterno, come evidenziato dall’ultima riga di usepkg.lua. più avanti impareremo come un modulo possa anche essere binario, cioè compilato come codice nativo. Verificheremo perciò come sia agevole usare da Lua le sterminate librerie disponibili in C. ...

September 7, 2018 · Andrea Manzini

il linguaggio Lua: parte 10

segue dalla parte 9 stringhe e regular expression in questa puntata apriremo una piccola digressione per analizzare le funzionalità del modulo string, in particolare l’uso delle regular expression. Il modulo string ci mette a disposizione potenti funzioni di ricerca e sostituzione basate su espressioni regolari. Una completa implementazione delle regexp POSIX occuperebbe più dell’intero linguaggio, ma tutto sommato le funzionalità principali sono state mantenute, e gli autori di Lua sono riusciti a impacchettare un “motore” di pattern matching in meno di 500 righe di codice. Vediamone per sommi capi alcune caratteristiche: La funzione string.find(s,p) cerca un pattern p dentro la stringa s e ritorna una tupla di due valori: la posizione dove inizia la corrispondenza e quella dove finisce; in caso il pattern non sia presente, ritornerà nil. ...

August 3, 2018 · Andrea Manzini