Note sul linguaggio Lua 4
Note sul linguaggio Lua 4
Il runtime di scripting QS utilizza Lua 4 (non Lua 5.x). Alcune differenze rispetto al Lua moderno sono fonte di errori molto comuni negli script. Questa pagina le riassume; le singole funzioni rimandano qui dove rilevante.
1. Booleani: 1 / nil (non true/false)
Lua 4 non ha il tipo boolean. Le funzioni "booleane" ritornano 1 (vero) oppure nil (falso).
- Usarle nelle condizioni: if usrbrk() then ... end.
- NON usare tostring() direttamente sul valore di ritorno: ad es. tostring(Is2DVisualStyle()) genera l'errore "value expected". Assegnare prima a una variabile locale: local b = Is2DVisualStyle(); print(tostring(b)).
- Diverse funzioni, quando il risultato e' "falso/assente", non ritornano nemmeno nil ma nessun valore (es. FileIsDirectory, IsFileLocked, hasChildren, isChildOf, dlg:isOpen, i getter di LOG). Vanno sempre assegnate a una locale prima di stamparle o concatenarle.
2. Niente letterali esadecimali 0x
La forma 0xFF non e' valida in Lua 4. Usare i valori decimali (es. 255). Riguarda fra l'altro bitand/bitor/bitxor e l'impacchettamento dei colori.
3. % e' il prefisso degli upvalue, non il modulo
L'operatore modulo % non esiste: x % 2 e' un errore di sintassi. Per il modulo usare mod(x, 2) oppure x - floor(x/2)*2.
4. Trigonometria in GRADI
Le funzioni sin, cos, tan, atan, atan2 lavorano in gradi, non in radianti.
5. Varianti W: userdata Unicode, non stringhe
Le funzioni con suffisso W (CurrentDwgNameW, GetTempPathW, getAttrw, getNamew, getAllAttrw, ...) ritornano un oggetto string_w (userdata Unicode), NON una stringa stampabile. Non concatenarle con .. ne' passarle a tostring(). Vanno consumate con i loro metodi (es. :length()); per passare argomenti Unicode usare _U("...").
6. Closure Lua 4: il pattern degli upvalue
Lua 4 non cattura automaticamente le variabili locali nelle funzioni annidate (callback di foreach, apply, findFirst, addCustomColumn, ...).
- Per leggere una locale da una funzione annidata si usa il prefisso %: local n = 5; local f = function() return %n end.
- Per scrivere stato mutabile dalla callback usare una tabella come upvalue: local acc = {tot=0}; ss:apply(function(e) %acc.tot = %acc.tot + 1 end).
Created with the Personal Edition of HelpNDoc: Easily create Web Help sites