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