14. TopConf Tallinn 2015 @etiene_d
"Since Lua itself is so
simple, it tends to
encourage you to solve
problems simply."
Ragnar Svensson - Lead Developer at King
(Lua Workshop Oct 15 2015)
18. @etiene_dTopConf Tallinn 2015
Better Reasons
⢠It looks cool
(I heard you could make games with it)
⢠Itâs made in my home country
(In my university to be more precise)
19. @etiene_dTopConf Tallinn 2015
⢠It looks cool
(I heard you could make games with it)
⢠Itâs made in my home country
(In my university to be more precise)
⢠Itâs easy to learn
Better Reasons
20. @etiene_dTopConf Tallinn 2015
⢠The index starts at 1
⢠Thereâs no continue
⢠The non-equality operator is ~=
⢠null is nil
⢠Comments are - -
⢠Only nil and false are equivalent to false
⢠Functions can genuinely return multiple values
⢠Variables are global by default
⢠Pattern matching is not regular expression
⢠The concatenation operator is ..
Whatâs different
22. @etiene_dTopConf Tallinn 2015
⢠The index starts at 1
⢠Thereâs no continue
⢠The non-equality operator is ~=
⢠null is nil
⢠Comments are - -
⢠Only nil and false are equivalent to false
⢠Functions can genuinely return multiple values
⢠Variables are global by default
⢠Pattern matching is not regular expression
⢠The concatenation operator is ..
Whatâs different
23. @etiene_dTopConf Tallinn 2015
Quick idioms
⢠a, b = b, a
⢠Thereâs no ternary operator but you can â¨
return x==1 and âyesâ or ânoâ
⢠The access to local variables is faster than global
local match = string.match
27. @etiene_dTopConf Tallinn 2015
â¨
⢠The only way to structure data
⢠Array, dictionary, object, list, queue, moduleâŚ
⢠Any value can be a key, except nil and nan
⢠Behind the scenes: array or hash table
⢠Passed as reference
⢠The length operator: #
⢠pairs(t) x ipairs(t)
Tables
29. @etiene_dTopConf Tallinn 2015
â¨
⢠The only way to structure data
⢠Array, dictionary, object, list, queue, moduleâŚ
⢠Any value can be a key, except nil
⢠Behind the scenes: array or hash table
⢠Passed as reference
⢠The length operator: #
⢠pairs(t) x ipairs(t)
Tables
31. @etiene_dTopConf Tallinn 2015
local a = { 1, 3, 5, 7, 9}
local sum = 0
for i=1,#a do
sum = sum + a[i]
end
print(sum) -- 25
Tables
local a = {}
a[1] = 1
a[2] = 3 -- etc
local sum = 0
for _, x in ipairs(a) do
sum = sum + x
end
print(sum)
32. @etiene_dTopConf Tallinn 2015
local a = { 1, 3, 5, 7, 9}
local sum = 0
for i=1,#a do
sum = sum + a[i]
end
print(sum) -- 25
local a, x = 10, âyâ
local point = { x = a, y = 25}
print(point[âxâ], point[âyâ]) -- 10 25
print(point[x], point[y]) -- 25 nil
print(point.x, point.y) -- 10 25
Tables
33. @etiene_dTopConf Tallinn 2015
local a = { 1, 3, 5, 7, 9}
local sum = 0
for i=1,#a do
sum = sum + a[i]
end
print(sum) -- 25
local a, x = 10, âyâ
local point = { x = a, y = 25}
print(point[âxâ], point[âyâ]) -- 10 25
print(point[x], point[y]) -- 25 nil
print(point.x, point.y) -- 10 25
-- sets and multisets
local ips = { â5.101.112.0â = true, â213.35.128.0â = true }
local connections = { â5.101.112.0â = 5, â213.35.128.0â = 2 }
Tables
34. @etiene_dTopConf Tallinn 2015
-- Cipher module
--[[ Based on algorithms/caesar_cipher.lua
by Roland Yonaba ]]
local cipher = {}
local function ascii_base(s)
return s:lower() == s and ('a'):byte() or ('A'):byte()
end
function cipher.caesar( str, key )
return str:gsub('%a', function(s)
local base = ascii_base(s)
return string.char(((s:byte() - base + key) % 26) + base)
end)
end
return cipher
Modules
35. @etiene_dTopConf Tallinn 2015
-- Cipher module
--[[ Based on algorithms/caesar_cipher.lua
by Roland Yonaba ]]
local cipher = {}
local function ascii_base(s)
return s:lower() == s and ('a'):byte() or ('A'):byte()
end
function cipher.caesar( str, key )
return str:gsub('%a', function(s)
local base = ascii_base(s)
return string.char(((s:byte() - base + key) % 26) + base)
end)
end
return cipher
Modules
36. @etiene_dTopConf Tallinn 2015
-- Cipher module
--[[ Based on algorithms/caesar_cipher.lua
by Roland Yonaba ]]
local cipher = {}
local function ascii_base(s)
return s:lower() == s and ('a'):byte() or ('A'):byte()
end
function cipher.caesar( str, key ) --cipher.caesar = function(str,key)
return str:gsub('%a', function(s)
local base = ascii_base(s)
return string.char(((s:byte() - base + key) % 26) + base)
end)
end
return cipher
Modules
public
37. @etiene_dTopConf Tallinn 2015
-- Cipher module
--[[ Based on algorithms/caesar_cipher.lua
by Roland Yonaba ]]
local cipher = {}
local function ascii_base(s)
return s:lower() == s and ('a'):byte() or ('A'):byte()
end
function cipher.caesar( str, key )
return str:gsub('%a', function(s)
local base = ascii_base(s)
return string.char(((s:byte() - base + key) % 26) + base)
end)
end
return cipher
Modules
private
38. @etiene_dTopConf Tallinn 2015
-- Cipher module
--[[ Based on algorithms/caesar_cipher.lua
by Roland Yonaba ]]
local cipher = {}
local function ascii_base(s)
return s:lower() == s and ('a'):byte() or ('A'):byte()
end
function cipher.caesar( str, key )
return str:gsub('%a', function(s)
local base = ascii_base(s)
return string.char(((s:byte() - base + key) % 26) + base)
end)
end
return cipher
Modules
local cipher = require âcipherâ
print(cipher.caesar(âtestâ,3) -- whvw
39. @etiene_dTopConf Tallinn 2015
â¨
⢠Overload operators
⢠Override built-in functions such as tostring
⢠Treat missing fields or intercept new field creation
⢠Call table as a function
⢠Metamethods:â¨
__add, __sub, __mul, __div, __mod, __pow, __unm,
__concat, __len, __eq, __lt, __le, __index, __newindex,
__call, __tostring, __ipairs, __pairs, __gc
Metatables
40. @etiene_dTopConf Tallinn 2015
local mt = {}
local function new(r, i)
return setmetatable({ real = r or 0, im = i or 0}, mt)
end
local function is_complex(v)
return getmetatable(v) == mt
end
local function add(c1, c2)
if not is_complex(c1) then
return new(c2.real + c1, c2.im)
elseif not is_complex(c2) then
return new(c1.real + c2, c1.im)
end
return new(c1.real + c2.real, c1.im + c2.im)
end
local function tos(c)
return tostring(c.real) .. "+".. tostring(c.im) .. "i"
end
mt.__add = add
mt.__tostring = tos
Complex numbers
41. @etiene_dTopConf Tallinn 2015
local mt = {}
local function new(r, i)
return setmetatable({ real = r or 0, im = i or 0}, mt)
end
local function is_complex(v)
return getmetatable(v) == mt
end
local function add(c1, c2)
if not is_complex(c1) then
return new(c2.real + c1, c2.im)
elseif not is_complex(c2) then
return new(c1.real + c2, c1.im)
end
return new(c1.real + c2.real, c1.im + c2.im)
end
local function tos(c)
return tostring(c.real) .. "+".. tostring(c.im) .. "i"
end
mt.__add = add
mt.__tostring = tos
Complex numbers
42. @etiene_dTopConf Tallinn 2015
local mt = {}
local function new(r, i)
return setmetatable({ real = r or 0, im = i or 0}, mt)
end
local function is_complex(v)
return getmetatable(v) == mt
end
local function add(c1, c2)
if not is_complex(c1) then
return new(c2.real + c1, c2.im)
elseif not is_complex(c2) then
return new(c1.real + c2, c1.im)
end
return new(c1.real + c2.real, c1.im + c2.im)
end
local function tos(c)
return tostring(c.real) .. "+".. tostring(c.im) .. "i"
end
mt.__add = add
mt.__tostring = tos
Complex numbers
43. @etiene_dTopConf Tallinn 2015
local mt = {}
local function new(r, i)
return setmetatable({ real = r or 0, im = i or 0}, mt)
end
local function is_complex(v)
return getmetatable(v) == mt
end
local function add(c1, c2)
if not is_complex(c1) then
return new(c2.real + c1, c2.im)
elseif not is_complex(c2) then
return new(c1.real + c2, c1.im)
end
return new(c1.real + c2.real, c1.im + c2.im)
end
local function tos(c)
return tostring(c.real) .. "+".. tostring(c.im) .. "i"
end
mt.__add = add
mt.__tostring = tos
Complex numbers
44. @etiene_dTopConf Tallinn 2015
local mt = {}
local function new(r, i)
return setmetatable({ real = r or 0, im = i or 0}, mt)
end
local function is_complex(v)
return getmetatable(v) == mt
end
local function add(c1, c2)
if not is_complex(c1) then
return new(c2.real + c1, c2.im)
elseif not is_complex(c2) then
return new(c1.real + c2, c1.im)
end
return new(c1.real + c2.real, c1.im + c2.im)
end
local function tos(c)
return tostring(c.real) .. "+".. tostring(c.im) .. "i"
end
mt.__add = add
mt.__tostring = tos
Complex numbers
45. @etiene_dTopConf Tallinn 2015
local mt = {}
local function new(r, i)
return setmetatable({ real = r or 0, im = i or 0}, mt)
end
local function is_complex(v)
return getmetatable(v) == mt
end
local function add(c1, c2)
if not is_complex(c1) then
return new(c2.real + c1, c2.im)
elseif not is_complex(c2) then
return new(c1.real + c2, c1.im)
end
return new(c1.real + c2.real, c1.im + c2.im)
end
local function tos(c)
return tostring(c.real) .. "+".. tostring(c.im) .. "i"
end
mt.__add = add
mt.__tostring = tos
>local c1 = new(2,3)â¨
>print( c1 + 5 )â¨
7+3i
Complex numbers
46. @etiene_dTopConf Tallinn 2015
local square = { x = 10, y = 20, side = 25 }
function square.move(obj, dx, dy)
obj.x = obj.x + dx
obj.y = obj.y + dy
end
function square:area()
return self.side ^ 2
end
print(square:area()) -- 625
Objects
47. @etiene_dTopConf Tallinn 2015
local square = { x = 10, y = 20, side = 25 }
function square.move(obj, dx, dy)
obj.x = obj.x + dx
obj.y = obj.y + dy
end
function square:area()
return self.side ^ 2
end
print(square:area()) -- 625
Objects
48. @etiene_dTopConf Tallinn 2015
local square = { x = 10, y = 20, side = 25 }
function square.move(obj, dx, dy)
obj.x = obj.x + dx
obj.y = obj.y + dy
end
function square:area()
return self.side ^ 2
end
print(square:area()) -- 625
Objects
49. @etiene_dTopConf Tallinn 2015
local square = { x = 10, y = 20, side = 25 }
function square.move(obj, dx, dy)
obj.x = obj.x + dx
obj.y = obj.y + dy
end
function square:area()
return self.side ^ 2
end
print(square:area()) -- 625
Objects
50. @etiene_dTopConf Tallinn 2015
local square = { x = 10, y = 20, side = 25 }
function square.move(obj, dx, dy)
obj.x = obj.x + dx
obj.y = obj.y + dy
end
function square:area()
return self.side ^ 2
end
print(square:area()) -- 625
local square2 = (x = 30, y = 5, side = 10}
print(square.area(square2)) -- 100
Objects
51. @etiene_dTopConf Tallinn 2015
local square = { x = 10, y = 20, side = 25 }
function square.move(obj, dx, dy)
obj.x = obj.x + dx
obj.y = obj.y + dy
end
function square:area()
return self.side ^ 2
end
print(square:area()) -- 625
local square2 = (x = 30, y = 5, side = 10}
print(square.area(square2)) -- 100
Objects
52. @etiene_dTopConf Tallinn 2015
local Square = {}
function Square:new(x, y, side)
local o = { x = x, y = y, side = side}
setmetatable(o, self)
self.__index = self
return o
end
function Square:move(dx, dy)
self.x = self.x + dx
self.y = self.y + dy
end
function Square:area()
return self.side ^ 2
end
return Square
Object Orientation
53. @etiene_dTopConf Tallinn 2015
local Square = {}
function Square:new(x, y, side)
local o = { x = x, y = y, side = side}
setmetatable(o, self)
self.__index = self
return o
end
function Square:move(dx, dy)
self.x = self.x + dx
self.y = self.y + dy
end
function Square:area()
return self.side ^ 2
end
return Square
Object Orientation
54. @etiene_dTopConf Tallinn 2015
local Square = {}
function Square:new(x, y, side)
local o = { x = x, y = y, side = side}
setmetatable(o, self)
self.__index = self
return o
end
function Square:move(dx, dy)
self.x = self.x + dx
self.y = self.y + dy
end
function Square:area()
return self.side ^ 2
end
return Square
Object Orientation
55. @etiene_dTopConf Tallinn 2015
local Square = {}
function Square:new(x, y, side)
local o = { x = x, y = y, side = side}
setmetatable(o, self)
self.__index = self
return o
end
function Square:move(dx, dy)
self.x = self.x + dx
self.y = self.y + dy
end
function Square:area()
return self.side ^ 2
end
return Square
Object Orientation
56. @etiene_dTopConf Tallinn 2015
local Square = {}
function Square:new(x, y, side)
local o = { x = x, y = y, side = side}
setmetatable(o, self)
self.__index = self
return o
end
function Square:move(dx, dy)
self.x = self.x + dx
self.y = self.y + dy
end
function Square:area()
return self.side ^ 2
end
return Square
local Square = require âsquareâ
local s1 = Square:new(10,20,25)
local s2 = Square:new(30,5,10)
print(s1:area()) -- 625
print(s2:area()) -- 100
Object Orientation