il linguaggio Lua: parte 9

segue dalla parte 8 il modulo lunare Per mantenere la sua natura minimalista, Lua ha ben poche funzionalità incluse nel linguaggio e delega molti aspetti a librerie e moduli esterni. Ad esempio le operazioni matematiche sono accessibili nel package, o se preferite, namespace col prefisso math: $ lua >print(math.sin(math.pi/2)) 1 sarebbe oltremodo noioso elencare tutte le funzioni presenti, basti dire che oltre alle funzioni trigonometriche abbiamo logaritmi, esponenziali, modulo, minimo, massimo, arrotondamenti e generazione di valori random. Per operare in modo agevole con tabelle e vettori abbiamo a disposizione il modulo table: ...

June 22, 2018 · Andrea Manzini

il linguaggio Lua: ottava parte

segue dalla settima parte Oggetti volanti e non Lua non è un linguaggio nativamente object-oriented. Se nei nostri script volessimo adottare uno stile OOP, ad esempio per modellare le operazioni su un conto corrente la cosa più naturale sarebbe usare una tabella: Conto = { saldo = 200.0 } Questa sintassi potrebbe essere assimilata al ‘costruttore’ dell’oggetto Conto. Possiamo anche definire dei metodi: function Conto.preleva(cifra) Conto.saldo = Conto.saldo - cifra end e quindi potremmo comodamente chiamare, problemi economici a parte: ...

April 23, 2018 · Andrea Manzini

il linguaggio Lua: settima parte

segue dalla sesta parte Iteratori e lua funzionale Cos’è un iteratore? Informaticamente parlando, è un costrutto che ci permette di scorrere strutture dati come liste, array, elenchi. In pratica, dato un elemento della struttura il compito dell’iteratore è farci avere il prossimo su cui operare. Non ci stupirà apprendere che in Lua gli iteratori sono funzioni. Vediamo un semplice esempio: function reverse_iter(t) local i=#t+1 return function() i=i-1 if i>=0 then return t[i] end end end reverse_iter è una fabbrica (factory) di funzioni: ogni volta che la chiamiamo, ci crea una nuova closure, ossia l’iteratore specifico per l’array che gli passiamo. La funzione che otteniamo mantiene il suo stato grazie alle variabili i e t ; quando non ci sono più elementi, restituisce nil. L’iteratore si potrebbe usare così: ...

March 3, 2018 · Andrea Manzini

a simple PNG decoder in Go

while working with image files, I needed a simple way to analyze content of a picture; so I wrote this tool that “walks” inside a PNG file and reports all the chunks seen; this is intended to be expanded with more features in a future. package main import ( "encoding/binary" "fmt" "io" "os" ) type chunk struct { Length uint32 ChunkType [4]byte } func main() { if len(os.Args) != 2 { fmt.Printf("Usage: %s filename.png\n", os.Args[0]) os.Exit(1) } f, err := os.Open(os.Args[1]) if err != nil { panic(err) } defer f.Close() header := make([]byte, 8) _, err = f.Read(header) fmt.Printf("header: %v\n", header) if err != nil { panic(err) } var data chunk var offset int64 offset = 8 for { err = binary.Read(f, binary.BigEndian, &data) if err != nil { if err == io.EOF { break } panic(err) } fmt.Printf("Offset: %d chunk len=%d, type: %s\n", offset, data.Length, string(data.ChunkType[:4])) f.Seek(int64(data.Length+4), io.SeekCurrent) offset += int64(data.Length) + 4 } } usage: ...

January 28, 2018 · Andrea Manzini