Lua cheatsheet
-- Prints to the screen (Can end with semicolon) print("Hello World")
--[[ Multiline comment ]]
-- Variable names can't start with a number, but can contain letters, numbers -- and underscores
-- Lua is dynamically typed based off of the data stored there -- This is a string and it can be surrounded by ' or " name = "Derek"
-- Another way to print to the screen -- Escape Sequences : \n \b \t \ \" \' -- Get the string size by proceeding it with a # io.write("Size of string ", #name, "\n")
-- You can store any data type in a variable even after initialization name = 4 io.write("My name is ", name, "\n")
-- Lua only has floating point numbers and this is the max number bigNum = 9223372036854775807 + 1 io.write("Big Number ", bigNum, "\n")
io.write("Big Number ", type(bigNum), "\n")
-- Floats are precise up to 13 digits floatPrecision = 1.999999999999 + 0.0000000000005 io.write(floatPrecision, "\n")
-- We can create long strings and maintain white space longString = [[ I am a very very long string that goes on for ever]] io.write(longString, "\n")
-- Combine Strings with .. longString = longString .. name io.write(longString, "\n")
-- Booleans store with true or false isAbleToDrive = true io.write(type(isAbleToDrive), "\n")
-- Every variable gets the value of nil by default meaning it has no value io.write(type(madeUpVar), "\n")
-- ---------- MATH ---------- io.write("5 + 3 = ", 5+3, "\n") io.write("5 - 3 = ", 5-3, "\n") io.write("5 * 3 = ", 5*3, "\n") io.write("5 / 3 = ", 5/3, "\n") io.write("5.2 % 3 = ", 5%3, "\n")
-- Shorthand like number++ and number += 1 aren't in Lua
-- Math Functions: floor, ceil, max, min, sin, cos, tan, -- asin, acos, exp, log, log10, pow, sqrt, random, randomseed
io.write("floor(2.345) : ", math.floor(2.345), "\n") io.write("ceil(2.345) : ", math.ceil(2.345), "\n") io.write("max(2, 3) : ", math.max(2, 3), "\n") io.write("min(2, 3) : ", math.min(2, 3), "\n") io.write("pow(8, 2) : ", math.pow(8, 2), "\n") io.write("sqrt(64) : ", math.sqrt(64), "\n")
-- Generate random number between 0 and 1 io.write("math.random() : ", math.random(), "\n")
-- Generate random number between 1 and 10 io.write("math.random(10) : ", math.random(10), "\n")
-- Generate random number between 1 and 100 io.write("math.random(1,100) : ", math.random(1,100), "\n")
-- Used to set a seed value for random math.randomseed(os.time())
-- Print float to 10 decimals print(string.format("Pi = %.10f", math.pi))
-- ---------- CONDITIONALS ---------- -- Relational Operators : > < >= <= == ~= -- Logical Operators : and or not
age = 13
if age < 16 then io.write("You can go to school", "\n") local localVar = 10 elseif (age >= 16) and (age < 18) then io.write("You can drive", "\n") else io.write("You can vote", "\n") end
-- A variable marked local is local only to this if statement -- io.write("Local Variable : ", localvar)
if (age < 14) or (age > 67) then io.write("You shouldn't work\n") end
-- Format, convert to string and place boolean value with string.format print(string.format("not true = %s", tostring(not true)))
-- There is no ternary operator in Lua -- canVote = age > 18 ? true : false
-- This is similar to the ternary operator canVote = age > 18 and true or false io.write("Can I Vote : ", tostring(canVote), "\n")
-- There is no Switch statement in Lua
-- ---------- STRINGS ---------- quote = "I changed my password everywhere to 'incorrect.' That way when I forget it,it always reminds me, 'Your password is incorrect.'"
io.write("Quote Length : ", string.len(quote), "\n")
-- Return the string after replacing io.write("Replace I with me : ", string.gsub(quote, "I", "me"), "\n")
-- Find the index of a matching String io.write("Index of password : ", string.find(quote, "password"), "\n")
-- Set characters to upper and lowercase io.write("Quote Upper : ", string.upper(quote), "\n") io.write("Quote Lower : ", string.lower(quote), "\n")
-- ---------- LOOPING ---------- i = 1 while (i <= 10) do io.write(i) i = i + 1
-- break throws you out of a loop -- continue doesn't exist with Lua if i == 8 then break end end print("\n")
-- Repeat will cycle through the loop at least once repeat io.write("Enter your guess : ")
-- Gets input from the user guess = io.read()
-- Either surround the number with quotes, or convert the string into -- a number until tonumber(guess) == 15
-- Value to start with, value to stop at, increment each loop for i = 1, 10, 1 do io.write(i) end
print()
-- Create a table which is a list of items like an array months = {"January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"}
-- Cycle through table where k is the key and v the value of each item for k, v in pairs(months) do io.write(v, " ") end
print()
-- ---------- TABLES ---------- -- Tables take the place of arrays, dictionaries, tuples, etc.
-- Create a Table aTable = {}
-- Add values to a table for i = 1, 10 do aTable[i] = i end
-- Access value by index io.write("First Item : ", aTable[1], "\n")
-- Items in Table io.write("Number of Items : ", #aTable, "\n")
-- Insert in table, at index, item to insert table.insert(aTable, 1, 0)
-- Combine a table as a String and seperate with provided seperator print(table.concat(aTable, ", "))
-- Remove item at index table.remove(aTable, 1) print(table.concat(aTable, ", "))
-- Sort items in reverse table.sort(aTable, function(a,b) return a>b end) print(table.concat(aTable, ", "))
-- Create a multidimensional Table aMultiTable = {}
for i = 0, 9 do aMultiTable[i] = {} for j = 0, 9 do aMultiTable[i][j] = tostring(i) .. tostring(j) end end
-- Access value in cell io.write("Table[0][0] : ", aMultiTable[1][2], "\n")
-- Cycle through and print a multidimensional Table for i = 0, 9 do for j = 0, 9 do io.write(aMultiTable[i][j], " : ") end print() end
-- ---------- FUNCTIONS ---------- function getSum(num1, num2) return num1 + num2 end
print(string.format("5 + 2 = %d", getSum(5,2)))
function splitStr(theString)
stringTable = {} local i = 1
-- Cycle through the String and store anything except for spaces -- in the table for str in string.gmatch(theString, "[^%s]+") do stringTable[i] = str i = i + 1 end
-- Return multiple values return stringTable, i end
-- Receive multiple values splitStrTable, numOfStr = splitStr("The Turtle")
for j = 1, numOfStr do print(string.format("%d : %s", j, splitStrTable[j])) end
-- Variadic Function recieve unknown number of parameters function getSumMore(...) local sum = 0
for k, v in pairs{...} do sum = sum + v end return sum end
io.write("Sum : ", getSumMore(1,2,3,4,5,6), "\n")
-- A function is a variable in that we can store them under many variable -- names as well as in tables and we can pass and return them though functions
-- Saving an anonymous function to a variable doubleIt = function(x) return x * 2 end print(doubleIt(4))
-- A Closure is a function that can access local variables of an enclosing -- function function outerFunc() local i = 0 return function() i = i + 1 return i end end
-- When you include an inner function in a function that inner function -- will remember changes made on variables in the inner function getI = outerFunc() print(getI()) print(getI())
-- ---------- COROUTINES ---------- -- Coroutines are like threads except that they can't run in parallel -- A coroutine has the status of running, susepnded, dead or normal
-- Use create to create one that performs some action co = coroutine.create(function() for i = 1, 10, 1 do print(i) print(coroutine.status(co)) if i == 5 then coroutine.yield() end end end)
-- They start off with the status suspended print(coroutine.status(co))
-- Call for it to run with resume during which the status changes to running coroutine.resume(co)
-- After execution it has the status of dead print(coroutine.status(co))
co2 = coroutine.create(function() for i = 101, 110, 1 do print(i) end end)
coroutine.resume(co2) coroutine.resume(co)
-- ---------- FILE I/O ---------- -- Different ways to work with files -- r: Read only (default) -- w: Overwrite or create a new file -- a: Append or create a new file -- r+: Read & write existing file -- w+: Overwrite read or create a file -- a+: Append read or create file
-- Create new file for reading and writing file = io.open("test.lua", "w+")
-- Write text to the file file:write("Random string of text\n") file:write("Some more text\n")
-- Move back to the beginning of the file file:seek("set", 0)
-- Read from the file print(file:read("*a"))
-- Close the file file:close()
-- Open file for appending and reading file = io.open("test.lua", "a+")
file:write("Even more text\n")
file:seek("set", 0)
print(file:read("*a"))
file:close()
-- ---------- MODULES ---------- -- A Module is like a library full of functions and variables
-- Use require to gain access to the functions in the module convertModule = require("convert")
-- Execute the function in the module print(string.format("%.3f cm", convertModule.ftToCm(12)))
-- ---------- METATABLES ---------- -- Used to define how operations on tables should be carried out in regards -- to adding, subtracting, multiplying, dividing, concatenating, or -- comparing tables
-- Create a table and put default values in it aTable = {} for x = 1, 10 do aTable[x] = x end
mt = { -- Define how table values should be added -- You can also define _sub, _mul, _div, _mod, _concat (..) __add = function (table1, table2)
sumTable = {}
for y = 1, #table1 do
if (table1[y] ~= nil) and (table2[y] ~= nil) then
sumTable[y] = table1[y] + table2[y]
else
sumTable[y] = 0
end
end
return sumTable
end,
-- Define how table values should be checked for equality __eq = function (table1, table2) return table1.value == table2.value end,
-- For homework figure out how to check if less then __lt = function (table1, table2) return table1.value < table2.value end,
-- For homework figure out how to check if less then or equal __le = function (table1, table2) return table1.value <= table2.value end, }
-- Attach the metamethods to this table setmetatable(aTable, mt)
-- Check if tables are equal print(aTable == aTable)
addTable = {}
-- Add values in tables addTable = aTable + aTable
-- print the results of the addition for z = 1, #addTable do print(addTable[z]) end
-- ---------- OBJECT ORIENTED PROGRAMMING ---------- -- Lua is not an OOP language and it doesn't allow you to define classes -- but you can fake it using tables and metatables
-- Define the defaults for our table Animal = {height = 0, weight = 0, name = "No Name", sound = "No Sound"}
-- Used to initialize Animal objects function Animal:new (height, weight, name, sound)
setmetatable({}, Animal)
-- Self is a reference to values for this Animal self.height = height self.weight = weight self.name = name self.sound = sound
return self end
-- Outputs a string that describes the Animal function Animal:toString()
animalStr = string.format("%s weighs %.1f lbs, is %.1f in tall and says %s", self.name, self.weight, self.height, self.sound)
return animalStr end
-- Create an Animal spot = Animal:new(10, 15, "Spot", "Roof")
-- Get variable values print(spot.weight)
-- Call a function in Animal print(spot:toString())
-- ---------- INHERITANCE ---------- -- Extends the properties and functions in another object
Cat = Animal:new()
function Cat:new (height, weight, name, sound, favFood) setmetatable({}, Cat)
-- Self is a reference to values for this Animal self.height = height self.weight = weight self.name = name self.sound = sound self.favFood = favFood
return self end
-- Overide an Animal function function Cat:toString()
catStr = string.format("%s weighs %.1f lbs, is %.1f in tall, says %s and loves %s", self.name, self.weight, self.height, self.sound, self.favFood)
return catStr end
-- Create a Cat fluffy = Cat:new(10, 15, "Fluffy", "Meow", "Tuna")
print(fluffy:toString())
-- Another file
-- The module name and filename are the same local convert = {} function convert.ftToCm(feet) return feet * 30.48 end return convert