Comments
-- comment
--[[ Multiline
     comment ]]
Invoking functions
print()
print("Hi")
-- You can omit parentheses if the argument is one string or table literal
print "Hello World"     <-->     print("Hello World")
dofile 'a.lua'          <-->     dofile ('a.lua')
print [[a multi-line    <-->     print([[a multi-line
 message]]                        message]])
f{x=10, y=20}           <-->     f({x=10, y=20})
type{}                  <-->     type({})
Tables / arrays
t = {}
t = { a = 1, b = 2 }
t.a = function() ... end
t = { ["hello"] = 200 }
t.hello
-- Remember, arrays are also tables
array = { "a", "b", "c", "d" }
print(array[2])       -- "b" (one-indexed)
print(#array)         -- 4 (length)
Loops
while condition do
end
for i = 1,5 do
end
for i = start,finish,delta do
end
for k,v in pairs(tab) do
end
repeat
until condition
-- Breaking out:
while x do
  if condition then break end
end
Conditionals
if condition then
  print("yes")
elseif condition then
  print("maybe")
else
  print("no")
end
Variables
local x = 2
two, four = 2, 4
Functions
function myFunction()
  return 1
end
function myFunctionWithArgs(a, b)
  -- ...
end
myFunction()
anonymousFunctions(function()
  -- ...
end)
-- Not exported in the module
local function myPrivateFunction()
end
-- Splats
function doAction(action, ...)
  print("Doing '"..action.."' to", ...)
  --> print("Doing 'write' to", "Shirley", "Abed")
end
doAction('write', "Shirley", "Abed")
Lookups
mytable = { x = 2, y = function() .. end }
-- The same:
mytable.x
mytable['x']
-- Syntactic sugar, these are equivalent:
mytable.y(mytable)
mytable:y()
mytable.y(mytable, a, b)
mytable:y(a, b)
function X:y(z) .. end
function X.y(self, z) .. end
Metatables
mt = {}
-- A metatable is simply a table with functions in it.
mt.__tostring = function() return "lol" end
mt.__add      = function(b) ... end       -- a + b
mt.__mul      = function(b) ... end       -- a * b
mt.__index    = function(k) ... end       -- Lookups (a[k] or a.k)
mt.__newindex = function(k, v) ... end    -- Setters (a[k] = v)
-- Metatables allow you to override behavior of another table.
mytable = {}
setmetatable(mytable, mt)
print(myobject)
Classes
Account = {}
function Account:new(balance)
  local t = setmetatable({}, { __index = Account })
  -- Your constructor stuff
  t.balance = (balance or 0)
  return t
end
function Account:withdraw(amount)
  print("Withdrawing "..amount.."...")
  self.balance = self.balance - amount
  self:report()
end
function Account:report()
  print("Your current balance is: "..self.balance)
end
a = Account:new(9000)
a:withdraw(200)    -- method call
Constants
nil
false
true
Operators (and their metatable names)
-- Relational (binary)
-- __eq  __lt  __gt  __le  __ge
   ==    <     >     <=    >=
~=   -- Not equal, just like !=
-- Arithmetic (binary)
-- __add  __sub  __muv  __div  __mod  __pow
   +      -      *      /      %      ^
-- Arithmetic (unary)
-- __unm (unary minus)
   -
-- Logic (and/or)
nil and false  --> nil
false and nil  --> false
0 and 20       --> 20
10 and 20      --> 20
-- Length
-- __len(array)
#array
-- Indexing
-- __index(table, key)
t[key]
t.key
-- __newindex(table, key, value)
t[key]=value
-- String concat
-- __concat(left, right)
"hello, "..name
-- Call
-- __call(func, ...)
API: Global functions (ref)
dofile("hello.lua")
loadfile("hello.lua")
assert(x)    -- x or (raise an error)
assert(x, "failed")
type(var)   -- "nil" | "number" | "string" | "boolean" | "table" | "function" | "thread" | "userdata"
-- Does /not/ invoke meta methods (__index and __newindex)
rawset(t, index, value)    -- Like t[index] = value
rawget(t, index)           -- Like t[index]
_G  -- Global context
setfenv(1, {})  -- 1: current function, 2: caller, and so on -- {}: the new _G
pairs(t)     -- iterable list of {key, value}
ipairs(t)    -- iterable list of {index, value}
tonumber("34")
tonumber("8f", 16)
API: Strings
'string'..'concatenation'
s = "Hello"
s:upper()
s:lower()
s:len()    -- Just like #s
s:find()
s:gfind()
s:match()
s:gmatch()
s:sub()
s:gsub()
s:rep()
s:char()
s:dump()
s:reverse()
s:byte()
s:format()
API: Tables
table.foreach(t, function(row) ... end)
table.setn
table.insert(t, 21)          -- append (--> t[#t+1] = 21)
table.insert(t, 4, 99)
table.getn
table.concat
table.sort
table.remove(t, 4)
API: Math (ref)
math.abs     math.acos    math.asin       math.atan    math.atan2
math.ceil    math.cos     math.cosh       math.deg     math.exp
math.floor   math.fmod    math.frexp      math.ldexp   math.log
math.log10   math.max     math.min        math.modf    math.pow
math.rad     math.random  math.randomseed math.sin     math.sinh
math.sqrt    math.tan     math.tanh
math.sqrt(144)
math
API: Misc
io.output(io.open("file.txt", "w"))
io.write(x)
io.close()
for line in io.lines("file.txt")
file = assert(io.open("file.txt", "r"))
file:read()
file:lines()
file:close()
Reference
https://www.lua.org/pil/13.html http://lua-users.org/wiki/ObjectOrientedProgramming