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