<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://wiki.netio-products.com/index.php?action=history&amp;feed=atom&amp;title=Lua_basics_for_other_language_programmers</id>
	<title>Lua basics for other language programmers - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.netio-products.com/index.php?action=history&amp;feed=atom&amp;title=Lua_basics_for_other_language_programmers"/>
	<link rel="alternate" type="text/html" href="https://wiki.netio-products.com/index.php?title=Lua_basics_for_other_language_programmers&amp;action=history"/>
	<updated>2026-05-29T16:05:49Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.32.0</generator>
	<entry>
		<id>https://wiki.netio-products.com/index.php?title=Lua_basics_for_other_language_programmers&amp;diff=473&amp;oldid=prev</id>
		<title>Admin: Admin moved page Lua basics &amp; NETIO Lua from original Lua difference to Lua basics for other language programmers</title>
		<link rel="alternate" type="text/html" href="https://wiki.netio-products.com/index.php?title=Lua_basics_for_other_language_programmers&amp;diff=473&amp;oldid=prev"/>
		<updated>2019-07-11T18:39:04Z</updated>

		<summary type="html">&lt;p&gt;Admin moved page &lt;a href=&quot;/index.php?title=Lua_basics_%26_NETIO_Lua_from_original_Lua_difference&quot; class=&quot;mw-redirect&quot; title=&quot;Lua basics &amp;amp; NETIO Lua from original Lua difference&quot;&gt;Lua basics &amp;amp; NETIO Lua from original Lua difference&lt;/a&gt; to &lt;a href=&quot;/index.php?title=Lua_basics_for_other_language_programmers&quot; title=&quot;Lua basics for other language programmers&quot;&gt;Lua basics for other language programmers&lt;/a&gt;&lt;/p&gt;
&lt;table class=&quot;diff diff-contentalign-left&quot; data-mw=&quot;interface&quot;&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;en&quot;&gt;
				&lt;td colspan=&quot;1&quot; style=&quot;background-color: #fff; color: #222; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan=&quot;1&quot; style=&quot;background-color: #fff; color: #222; text-align: center;&quot;&gt;Revision as of 18:39, 11 July 2019&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-notice&quot; lang=&quot;en&quot;&gt;&lt;div class=&quot;mw-diff-empty&quot;&gt;(No difference)&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;</summary>
		<author><name>Admin</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.netio-products.com/index.php?title=Lua_basics_for_other_language_programmers&amp;diff=458&amp;oldid=prev</id>
		<title>Bbakala: Created page with &quot; == Data types and variables == Lua supports these data types: * &lt;i&gt;nil&lt;/i&gt; (to assign &lt;i&gt;nil&lt;/i&gt; value effectively deletes the variable) * &lt;i&gt;boolean&lt;/i&gt; (falsy values are &lt;i...&quot;</title>
		<link rel="alternate" type="text/html" href="https://wiki.netio-products.com/index.php?title=Lua_basics_for_other_language_programmers&amp;diff=458&amp;oldid=prev"/>
		<updated>2019-07-11T16:58:41Z</updated>

		<summary type="html">&lt;p&gt;Created page with &amp;quot; == Data types and variables == Lua supports these data types: * &amp;lt;i&amp;gt;nil&amp;lt;/i&amp;gt; (to assign &amp;lt;i&amp;gt;nil&amp;lt;/i&amp;gt; value effectively deletes the variable) * &amp;lt;i&amp;gt;boolean&amp;lt;/i&amp;gt; (falsy values are &amp;lt;i...&amp;quot;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;&lt;br /&gt;
== Data types and variables ==&lt;br /&gt;
Lua supports these data types:&lt;br /&gt;
* &amp;lt;i&amp;gt;nil&amp;lt;/i&amp;gt; (to assign &amp;lt;i&amp;gt;nil&amp;lt;/i&amp;gt; value effectively deletes the variable)&lt;br /&gt;
* &amp;lt;i&amp;gt;boolean&amp;lt;/i&amp;gt; (falsy values are &amp;lt;i&amp;gt;nil&amp;lt;/i&amp;gt; and &amp;lt;i&amp;gt;false&amp;lt;/i&amp;gt; only; &amp;quot;&amp;quot; and 0 evaluates as &amp;lt;i&amp;gt;true&amp;lt;/i&amp;gt;)&lt;br /&gt;
* &amp;lt;i&amp;gt;number&amp;lt;/i&amp;gt; (decimals only in standard Lua, integers only in Netio Lua)&lt;br /&gt;
* &amp;lt;i&amp;gt;string&amp;lt;/i&amp;gt; (same strings share same address, so equality operator measures both address and value)&lt;br /&gt;
* &amp;lt;i&amp;gt;tables&amp;lt;/i&amp;gt; are associative arrays. (Tables with numeric indices are, well, just arrays.)&lt;br /&gt;
&lt;br /&gt;
 local numbers = {2,3,7,5} -- array (first index = 1)&lt;br /&gt;
 local dictionary = {one=1, two=2, three=3} -- table&lt;br /&gt;
 local numbersZeroBased = {[0]=2,3,7,5} -- array (first index = 0)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;i&amp;gt;local&amp;lt;/i&amp;gt; keyword limits the variable scope to the block (ended by &amp;lt;i&amp;gt;end&amp;lt;/i&amp;gt;) where it is declared. To access an &amp;lt;i&amp;gt;upvalue&amp;lt;/i&amp;gt; (variable defined outside of the scope), just omit the &amp;lt;i&amp;gt;local&amp;lt;/i&amp;gt; keyword.&lt;br /&gt;
&lt;br /&gt;
== Operators ==&lt;br /&gt;
Lua has its own manners:&lt;br /&gt;
* &amp;lt;code&amp;gt;~=&amp;lt;/code&amp;gt; is inequality operator&lt;br /&gt;
* &amp;lt;code&amp;gt;..&amp;lt;/code&amp;gt; is string concatenation (don't use plus)&lt;br /&gt;
* &amp;lt;code&amp;gt;&amp;lt;s&amp;gt;i++&amp;lt;/s&amp;gt;&amp;lt;/code&amp;gt; no increment/decrement operator &amp;lt;code&amp;gt;i = i + 1&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;&amp;lt;s&amp;gt;max = a&amp;lt;b ? b : a&amp;lt;/s&amp;gt;&amp;lt;/code&amp;gt; no ternary operator. Use (and get used to) &amp;lt;i&amp;gt;and idiom&amp;lt;/i&amp;gt; instead: &amp;lt;code&amp;gt;max = (a&amp;lt;b) and b or a&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;i&amp;gt;or idiom&amp;lt;/i&amp;gt; works: &amp;lt;code&amp;gt;x = x or 42&amp;lt;/code&amp;gt; is equivalent to &amp;lt;code&amp;gt;if not x then x = 42 end&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Conditions ==&lt;br /&gt;
Lua conditions has casual syntax, see [https://www.lua.org/pil/4.3.1.html here]. Just keep in mind to merge &amp;lt;code&amp;gt;else&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;if&amp;lt;/code&amp;gt; to &amp;lt;code&amp;gt;elseif&amp;lt;/code&amp;gt; or multiple &amp;lt;code&amp;gt;end&amp;lt;/code&amp;gt;s are required.&lt;br /&gt;
&lt;br /&gt;
Note that falsy values are &amp;lt;i&amp;gt;nil&amp;lt;/i&amp;gt; and &amp;lt;i&amp;gt;false&amp;lt;/i&amp;gt; only. Empty string and 0 evaluates as true. If you come from C, you might be surprised by following snippet:&lt;br /&gt;
&lt;br /&gt;
 if devices.system.output1_consumption then&lt;br /&gt;
   -- always happens, even if the consumption is 0&lt;br /&gt;
   log(&amp;quot;Outlet 1 supplies power&amp;quot;)&lt;br /&gt;
 end&lt;br /&gt;
&lt;br /&gt;
 if not devices.system.output1_consumption then&lt;br /&gt;
   -- never happens, even if the consumption is 0&lt;br /&gt;
   log(&amp;quot;Outlet 1 is idle&amp;quot;)&lt;br /&gt;
 end&lt;br /&gt;
&lt;br /&gt;
== Loops ==&lt;br /&gt;
Lua has &amp;lt;code&amp;gt;break&amp;lt;/code&amp;gt; statement, but no &amp;lt;code&amp;gt;continue&amp;lt;/code&amp;gt; (use condition inside loop instead). Additionally, Netio Lua implementation limits the loop iterations to 32k.&lt;br /&gt;
&lt;br /&gt;
=== While ===&lt;br /&gt;
While syntax is not different to other languages:&lt;br /&gt;
 local i = 0&lt;br /&gt;
 while i~=3 do&lt;br /&gt;
   i = i + 1&lt;br /&gt;
   logf(&amp;quot;%d&amp;quot;,i)&lt;br /&gt;
 end&lt;br /&gt;
&lt;br /&gt;
=== Repeat until ===&lt;br /&gt;
Repeat until syntax is the same as Pascal's, other languages have similar do-while loops:&lt;br /&gt;
 local i = 0&lt;br /&gt;
 repeat&lt;br /&gt;
   i = i + 1&lt;br /&gt;
   logf(&amp;quot;%d&amp;quot;,i)&lt;br /&gt;
 until i==3&lt;br /&gt;
&lt;br /&gt;
=== Numeric for ===&lt;br /&gt;
Arrays in Lua are one-based (in indices are not specified, the first one is 1, not 0).&lt;br /&gt;
 local arr = {2,3,7,5}&lt;br /&gt;
 for i=1,#arr do logf(&amp;quot;%d&amp;quot;,arr[i]) end&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;b&amp;gt;for&amp;lt;/b&amp;gt; initVar,limit,increment &amp;lt;b&amp;gt;do&amp;lt;/b&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;i&amp;gt;number assignment&amp;lt;/i&amp;gt; &amp;lt;code&amp;gt;initVar&amp;lt;/code&amp;gt; inits loop-local variable&lt;br /&gt;
* &amp;lt;i&amp;gt;number&amp;lt;/i&amp;gt; &amp;lt;code&amp;gt;limit&amp;lt;/code&amp;gt; loops until initVar reaches this value&lt;br /&gt;
* &amp;lt;i&amp;gt;optional number&amp;lt;/i&amp;gt; &amp;lt;code&amp;gt;increment&amp;lt;/code&amp;gt; after each loop initVar increment by this value (default 1)&lt;br /&gt;
&lt;br /&gt;
=== Generic for ===&lt;br /&gt;
Is rather sophisticated. Most common example (the order of elements in &amp;lt;code&amp;gt;pairs()&amp;lt;/code&amp;gt; is not guaranteed):&lt;br /&gt;
 local tab = {one=1, two=2, three=3}&lt;br /&gt;
 for key,val in pairs(tab) do logf(&amp;quot;%s:%d&amp;quot;,key,val) end&lt;br /&gt;
Generic for syntax&lt;br /&gt;
 &amp;lt;b&amp;gt;for&amp;lt;/b&amp;gt; var_1, ..., var_n &amp;lt;b&amp;gt;in&amp;lt;/b&amp;gt; explist &amp;lt;b&amp;gt;do&amp;lt;/b&amp;gt; block end&lt;br /&gt;
is equivalent to (Full explanation [https://www.lua.org/pil/7.2.html here].)&lt;br /&gt;
 do&lt;br /&gt;
   local _f, _s, _var = explist&lt;br /&gt;
   while true do&lt;br /&gt;
     local var_1, ... , var_n = _f(_s, _var)&lt;br /&gt;
     _var = var_1&lt;br /&gt;
     if _var == nil then break end&lt;br /&gt;
     block&lt;br /&gt;
   end&lt;br /&gt;
 end&lt;br /&gt;
&lt;br /&gt;
Iterator closure that holds its state&lt;br /&gt;
 function iter(a)&lt;br /&gt;
   local i = 0&lt;br /&gt;
   return function()&lt;br /&gt;
     i = i+1&lt;br /&gt;
     return a[i]&lt;br /&gt;
   end&lt;br /&gt;
 end&lt;br /&gt;
 &lt;br /&gt;
 local arr = {2,3,7,5}&lt;br /&gt;
 for value in iter(arr) do&lt;br /&gt;
   logf(&amp;quot;%d&amp;quot;,value)&lt;br /&gt;
 end&lt;br /&gt;
&lt;br /&gt;
Stateless iterator (in this case returns variable list: key and value)&lt;br /&gt;
 function iter(a,i)&lt;br /&gt;
   i = i+1&lt;br /&gt;
   if a[i] then return i,a[i] end&lt;br /&gt;
 end&lt;br /&gt;
 &lt;br /&gt;
 local arr = {2,3,7,5}&lt;br /&gt;
 for k,v in iter,arr,0 do&lt;br /&gt;
   logf(&amp;quot;%d:%d&amp;quot;,k,v)&lt;br /&gt;
 end&lt;br /&gt;
&lt;br /&gt;
Same effect using &amp;lt;code&amp;gt;ipairs()&amp;lt;/code&amp;gt; Lua function (without initial state)&lt;br /&gt;
 for k,v in ipairs(arr) do&lt;br /&gt;
   logf(&amp;quot;%d:%d&amp;quot;,k,v)&lt;br /&gt;
 end&lt;br /&gt;
&lt;br /&gt;
Now return to the most common example above using &amp;lt;code&amp;gt;pairs()&amp;lt;/code&amp;gt; Lua function and read about &amp;lt;code&amp;gt;pairs()&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;ipairs()&amp;lt;/code&amp;gt; implementation [https://www.lua.org/pil/7.3.html here].&lt;br /&gt;
&lt;br /&gt;
== Functions ==&lt;br /&gt;
&lt;br /&gt;
Lua allows multiple results (comma separated):&lt;br /&gt;
&lt;br /&gt;
 function diskSpace()&lt;br /&gt;
   return devices.system.freeSpace, devices.system.totalSpace&lt;br /&gt;
 end&lt;br /&gt;
 &lt;br /&gt;
 logf(&amp;quot;Free space: %d MB&amp;quot;, diskSpace()) -- only first return value is used&lt;br /&gt;
 local free,total = diskSpace() -- values are stored into LHS var-list&lt;br /&gt;
 logf(&amp;quot;Free space: %d %%&amp;quot;, 100*free/total)&lt;br /&gt;
&lt;br /&gt;
Variable-length arguments are also available:&lt;br /&gt;
&lt;br /&gt;
 function sum(...)&lt;br /&gt;
   local result = 0&lt;br /&gt;
   for _,v in ipairs(arg) do&lt;br /&gt;
     result = result + v&lt;br /&gt;
   end&lt;br /&gt;
   return result&lt;br /&gt;
 end&lt;br /&gt;
 &lt;br /&gt;
 logf(&amp;quot;Sum: %d&amp;quot;, sum(2,3,5))&lt;/div&gt;</summary>
		<author><name>Bbakala</name></author>
		
	</entry>
</feed>