0% found this document useful (0 votes)
15 views9 pages

Luatutorial

This document provides an overview of the Lua programming language by demonstrating basic syntax and features like variables, data types, operators, control flow, functions, tables and modules. It shows how to perform common tasks like input/output, math operations, string manipulation and looping. The document also introduces concepts like coroutines, closures and metatables.

Uploaded by

Alan
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as TXT, PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
15 views9 pages

Luatutorial

This document provides an overview of the Lua programming language by demonstrating basic syntax and features like variables, data types, operators, control flow, functions, tables and modules. It shows how to perform common tasks like input/output, math operations, string manipulation and looping. The document also introduces concepts like coroutines, closures and metatables.

Uploaded by

Alan
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as TXT, PDF, TXT or read online on Scribd
You are on page 1/ 9

-- 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())

You might also like