--- title: Lua --- ## 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)](http://lua.gts-stolberg.de/en/Basis.php) 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)](http://lua-users.org/wiki/MathLibraryTutorial) 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