il linguaggio Lua: parte 14

segue dalla parte 13 Coroutine Come approccio alla programmazione concorrente, il linguaggio Lua non ha meccanismi interni per gestire nativamente i thread, ma si può appoggiare a ciò che offre il sistema operativo sottostante. Lua invece internamente offre il supporto alle coroutine: un programma Lua può avere diversi percorsi di esecuzione ‘parallela’ ognuno col proprio stack e variabili locali ma che condividono risorse e variabili globali con le altre coroutine. La prima differenza sostanziale col modello classico dei thread è che in un determinato istante ‘gira’ una e una sola coroutine, mentre in un sistema multiprocessore ci possono essere più thread in esecuzione in contemporanea. ...

February 15, 2019 · Andrea Manzini

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