Difference between revisions of "NETIO Lua Manual"
(→Numeric for) |
|||
Line 1: | Line 1: | ||
== Debugging == | == Debugging == | ||
To debug your code, use [[Function log()|log()]] and [[Function logf()|logf()]] functions. See the output in system events log. | To debug your code, use [[Function log()|log()]] and [[Function logf()|logf()]] functions. See the output in system events log. | ||
+ | |||
+ | == Data types == | ||
+ | Lua supports these data types: | ||
+ | * <i>nil</i> to assign <i>nil</i> value effectively deletes the variable | ||
+ | * <i>boolean</i> falsy values are <i>nil</i> and <i>false</i> only; "" and 0 evaluates as <i>true</i> | ||
+ | * <i>number</i> (decimals only in standard Lua, integers only in Netio Lua) | ||
+ | * <i>string</i> (same strings share same address, so equality operator measures both address and value) | ||
+ | * <i>tables</i> are associative arrays. Tables with numeric indices are, well, just arrays. | ||
+ | |||
+ | local numbers = {2,3,7,5} -- array (first index = 1) | ||
+ | local dictionary = {one=1, two=2, three=3} -- table | ||
+ | local numbersZeroBased = {[0]=2,3,7,5} -- array (first index = 0) | ||
== Operators == | == Operators == |
Revision as of 12:34, 25 April 2017
Contents
Debugging
To debug your code, use log() and logf() functions. See the output in system events log.
Data types
Lua supports these data types:
- nil to assign nil value effectively deletes the variable
- boolean falsy values are nil and false only; "" and 0 evaluates as true
- number (decimals only in standard Lua, integers only in Netio Lua)
- string (same strings share same address, so equality operator measures both address and value)
- tables are associative arrays. Tables with numeric indices are, well, just arrays.
local numbers = {2,3,7,5} -- array (first index = 1) local dictionary = {one=1, two=2, three=3} -- table local numbersZeroBased = {[0]=2,3,7,5} -- array (first index = 0)
Operators
Lua has its own manners:
~=
is inequality operator..
is string concatenation (don't use plus)
no increment/decrement operatori++i = i + 1
no ternary operator. Use (and get used to) and idiom instead:max = a<b ? b : amax = (a<b) and b or a
- or idiom works:
x = x or 42
is equivalent toif not x then x = 42 end
Conditions
Lua conditions has casual syntax, see here. Just keep in mind to merge else
and if
to elseif
or multiple end
s are required.
Note that falsy values are nil and false only. Empty string and 0 evaluates as true. If you come from C, you might be surprised by following snippet:
if devices.system.output1_consumption then -- always happens, even if the consumption is 0 log("Outlet 1 is on") end
if not devices.system.output1_consumption then -- never happens, even if the consumption is 0 log("Outlet 1 is off") end
Loops
Lua has break
statement, but no continue
(use condition inside loop instead).
While
While syntax is not different to other languages:
local i = 0 while i~=3 do i = i + 1 logf("%d",i) end
Repeat until
Repeat until syntax is the same as Pascal's, other languages have similar do-while loops:
local i = 0 repeat i = i + 1 logf("%d",i) until i==3
Numeric for
Arrays in Lua are one-based (in indices are not specified, the first one is 1, not 0).
local arr = {2,3,7,5} for i=1,#arr do logf("%d",arr[i]) end
for initVar,limit,increment do
- number assignment
initVar
inits loop-local variable - number
limit
loops until initVar reaches this value - optional number
increment
after each loop initVar increment by this value (default 1)
Generic for
Is rather sophisticated. Most common example (the order of elements in pairs()
is not guaranteed):
local tab = {one=1, two=2, three=3} for key,val in pairs(tab) do logf("%s:%d",key,val) end
Generic for syntax
for var_1, ..., var_n in explist do block end
is equivalent to (Full explanation here.)
do local _f, _s, _var = explist while true do local var_1, ... , var_n = _f(_s, _var) _var = var_1 if _var == nil then break end block end end
Iterator closure that holds its state
function iter(a) local i = 0 return function() i = i+1 return a[i] end end local arr = {2,3,7,5} for value in iter(arr) do logf("%d",value) end
Stateless iterator (in this case returns variable list: key and value)
function iter(a,i) i = i+1 if a[i] then return i,a[i] end end local arr = {2,3,7,5} for k,v in iter,arr,0 do logf("%d:%d",k,v) end
Same effect using ipairs()
Lua function (without initial state)
for k,v in ipairs(arr) do logf("%d:%d",k,v) end
Now return to the most common example above using pairs()
Lua function and read about pairs()
and ipairs()
implementation here.
Functions
Lua allows multiple results (comma separated):
function diskSpace() return devices.system.freeSpace, devices.system.totalSpace end logf("Free space: %d MB", diskSpace()) local free,total = diskSpace() logf("Free space: %d %%", 100*free/total)
Variable-length arguments are also available:
function sum(...) local result = 0 for _,v in ipairs(arg) do result = result + v end return result end logf("Sum: %d", sum(2,3,5))