Sei sulla pagina 1di 56

Descobrindo Lua

Srgio Queiroz de Medeiros e


smedeiros@inf.puc-rio.br LabLua

Campus Party 2009


Srgio Queiroz de Medeiros e Descobrindo Lua 1

Instalando o Interpretador

Para baixar o fonte: www.lua.org Para obter os arquivos binrios: a http://luaforge.net/projects/luabinaries/ Para obter uma distribuio com bateriaspara o Windows: ca http://luaforwindows.luaforge.net/ Se voc est no Ubuntu, tente: e a sudo apt-get install lua5.1 sudo apt-get install liblua5.1.0-dev (Para a API C)

Srgio Queiroz de Medeiros e

Descobrindo Lua 2

Compilando o Interpretador

Descompacte o cdigo fonte de Lua e entre no diretrio o o correspondente; No Linux, digite: make linux Para testar: make test Para instalar: make linux install Se no conseguir compilar Lua, provavelmente falta instalar a libncurses.

Srgio Queiroz de Medeiros e

Descobrindo Lua 3

Primeiros Passos

Um pedao de cdigo Lua (um arquivo ou uma linha digitada c o no modo interativo) chamado de trecho; e Ponto e v rgula opcional no m da linha: e a b a a = = = = 1; 2 1 ; b = 2 33 b = 44

Variveis so globais por padro. a a a

Srgio Queiroz de Medeiros e

Descobrindo Lua 4

Primeiro Programa
01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 function odd (n) if n == 0 then return false else return even (n-1) end end function even (n) if n == 0 then return true else return odd (n-1) end end local n = io.read ("*number") print (even (n))
Srgio Queiroz de Medeiros e Descobrindo Lua 5

Operador de Mdulo o

Lua tambm possui um operador de mdulo % e o Uma forma mais simples de escrever o programa anterior seria: 01 02 03 04 05 06 07 08 09 10 function odd (n) return n % 2 == 1 end function even (n) return n % 2 == 0 end local n = io.read ("*number") print (even (n))

Srgio Queiroz de Medeiros e

Descobrindo Lua 6

Convenoes Lxicas c e

Lua case sensitive: e


bola; BOLA; bOlA.

-indica um comentrio de uma linha; a --[[ abre um comentrio que termina com um a ]]

Srgio Queiroz de Medeiros e

Descobrindo Lua 7

Tipos e Valores

No h denio de tipos em Lua; a a ca Existem oito tipos bsicos: a


nil; boolean; number; function; string; userdata; function; thread; table.

Variveis podem conter valores de qualquer tipo. a

Srgio Queiroz de Medeiros e

Descobrindo Lua 8

Exercitando

--usamos --> para indicar a sada do comando print (type (a)) a = 10 print (type (a)) a = "uma cadeia" print (type (a)) a = print a (type (a)) --> nil --> number --> string --> function

Srgio Queiroz de Medeiros e

Descobrindo Lua 9

Tipos e Valores

nil diferente de qualquer outro valor e tambm usado para e e e indicar ausncia de um valor; e false e true so valores do tipo Boolean; a Lua considera nil e false como um valor falso e qualquer outro valor como verdadeiro.

Srgio Queiroz de Medeiros e

Descobrindo Lua 10

Nmeros u

O tipo Number representa nmeros reais (no h um tipo u a a inteiro); Nmeros so representados com preciso dupla (double); u a a a E fcil compilar Lua para usar preciso simples ou valores a inteiros como tipo numrico bsico. e a

Srgio Queiroz de Medeiros e

Descobrindo Lua 11

Cadeias de Caracteres (Strings)

So imutveis: a a a = "uma cadeia" b = string.gsub (a,"uma","outra") -- muda a cadeia "a" print (a) --> uma cadeia print (b) --> outra cadeia print (a .. b) --> uma cadeiaoutra cadeia So delimitadas por aspas simples ou duplas: a a = "um texto" b = outro texto

Srgio Queiroz de Medeiros e

Descobrindo Lua 12

Operadores Relacionais
Operadores relacionais de Lua: < > <= >= == ~= Um objeto (function, userdata, thread, table) somente igual e a ele mesmo: local tab1 = {} local tab2 = {} -- cria uma tabela

tab1.x = 33 tab2.x = 33 print (tab1 == tab2) --> false tab2 = tab1 print (tab1 == tab2) --> true tab2.x = 20 print (tab1.x) --> 20
Srgio Queiroz de Medeiros e Descobrindo Lua 13

Operadores Lgicos o

a = 3 b = nil print (a or b) print (a and b) print (not a) print (not 0) print (not b) --> 3 --> nil --> false --> false --> true

Srgio Queiroz de Medeiros e

Descobrindo Lua 14

Operadores Lgicos o

Uso do operador or para inicializar variveis: a function initX (v) x = v or 100 end O operador ternrio de C pode ser simulado com a expresso a a x and y or z: s = (n % 2 == 0) and "par" or "mpar"

Srgio Queiroz de Medeiros e

Descobrindo Lua 15

Variveis a

Um identicador pode ser qualquer cadeia (string) de letras, d gitos e sublinhados que no comea com um d a c gito: bola _bola _bola_2008 declarando_uma_variavel_com_um_nome_bem_grande Lua usa identicadores comeando com um sublinhado c seguido por letras maisculas para alguns propsitos especiais: u o _VERSION _G

Srgio Queiroz de Medeiros e

Descobrindo Lua 16

Variveis a

Quando no atribu a mos um valor a uma varivel, ela a e inicializada com nil x = 1 b, c = "bola", 3 y print (b, y) -- x recebe 1 -- b recebe "bola" e c o valor 3 -- o valor de y nil e --> bola nil

Srgio Queiroz de Medeiros e

Descobrindo Lua 17

Atribuio ca

O nmero de variveis no lado direito de uma atribuio no u a ca a precisa ser igual ao nmero de valores no lado esquerdo: u a, b, sobrei = 1, 2 print (a, b, sobrei) --> 1 2 nil

x, y = "bola", "casa", "sobrei" print (x, y) --> bola x, y = y, x print (x, y)

casa

-- faz a troca de valores --> casa bola

Srgio Queiroz de Medeiros e

Descobrindo Lua 18

Escopo
Uma varivel declarada fora de qualquer bloco vis em a e vel todo o arquivo Usamos do-end ou estruturas de controle para criar blocos: local x, y = 33 print (x, y) if x > 10 then local x = 5 y = 9 print (x, y) else x = 2 print (x, y) end print (x, y) --> 33 nil

-- alterando um "x" local --> 5 9

-- alterando o "x" mais externo --> 2 nil --> 33 9


Descobrindo Lua 19

Srgio Queiroz de Medeiros e

Escopo

Acesso a variveis locais mais rpido a e a comum salvar em variveis locais valores que esto em E a a variveis globais: a local sqrt = math.sqrt local bola = bola local print = _G.print

Srgio Queiroz de Medeiros e

Descobrindo Lua 20

Tabelas

Unico mecanismo de estruturao de dados em Lua; ca Implementa arrays associativos; Tabelas tambm so usadas para representar mdulos, e a o pacotes e objetos.

Srgio Queiroz de Medeiros e

Descobrindo Lua 21

Tabelas
a = {} --cria uma tabela e armazena refer^ncia em a e

Srgio Queiroz de Medeiros e

Descobrindo Lua 22

Tabelas
a = {} --cria uma tabela e armazena refer^ncia em a e

k = "x" a[k] = 10

--nova entrada, chave="x" e valor=10

Srgio Queiroz de Medeiros e

Descobrindo Lua 23

Tabelas
a = {} --cria uma tabela e armazena refer^ncia em a e

k = "x" a[k] = 10 a[20] = "Lua"

--nova entrada, chave="x" e valor=10 --nova entrada, chave=20 e valor="Lua"

Srgio Queiroz de Medeiros e

Descobrindo Lua 24

Tabelas
a = {} --cria uma tabela e armazena refer^ncia em a e

k = "x" a[k] = 10 a[20] = "Lua" print (a["x"]) k = 20 print (a[k])

--nova entrada, chave="x" e valor=10 --nova entrada, chave=20 e valor="Lua" --> 10 --> Lua

Srgio Queiroz de Medeiros e

Descobrindo Lua 25

Tabelas
a = {} --cria uma tabela e armazena refer^ncia em a e

k = "x" a[k] = 10 a[20] = "Lua" print (a["x"]) k = 20 print (a[k])

--nova entrada, chave="x" e valor=10 --nova entrada, chave=20 e valor="Lua" --> 10 --> Lua ---> ---> incrementa entrada "x" 11 mesmo que a["x"] 42 42
Descobrindo Lua 26

a["x"] = a["x"] + 1 print (a["x"]) a.x = 42 print(a.x,a["x"])

Srgio Queiroz de Medeiros e

Construtores de Tabelas

Tabelas podem ser inicializadas como arrays: dias = {"Domingo", "Segunda", "Tera", "Quarta", c "Quinta", "Sexta", "Sbado"} a print (dias [4]) --> Quarta

Srgio Queiroz de Medeiros e

Descobrindo Lua 27

Construtores de Tabelas

Tabelas podem ser inicializadas como estruturas: ponto = { x=10, y=20 } Equivalente a: ponto = {} ponto.x = 10 ponto.y = 20

Srgio Queiroz de Medeiros e

Descobrindo Lua 28

Inserindo elementos

Podemos inserir elementos usando a funo table.insert: ca local t = {10, 20, 30} table.insert (t, 2, 15) -- Insere 15 na posi~o 2 ca

-- Agora temos t[1] = 10, t[2] = 15, -t[3] = 20 e t[4] = 30 table.insert (t, 35) print (t[1], t[3], t[5]) -- Insere 35 no fim --> 10 20 35

Srgio Queiroz de Medeiros e

Descobrindo Lua 29

Tamanho da Tabela
Se a tabela representa um array, podemos usar o operador de comprimento #: local t = {"a", "b", "c"} print (#t) table.insert (t, "d") print (#t) --> 3 --> 4

t [6] = "8" -- Temos um valor nil no meio do array (t[5]) print (#t) --> ?? t [5] = "e" -- Agora o array n~o tem "buracos" a print (#t) --> 6
Srgio Queiroz de Medeiros e Descobrindo Lua 30

If

Estrutura de controle bsica de Lua: a local x = 44 if x > 30 then print ("maior que 30") elseif x > 20 then print ("maior que 20") elseif x > 10 then print ("maior que 10") else print ("que x pequeno") end

Srgio Queiroz de Medeiros e

Descobrindo Lua 31

While

Declare sempre a varivel que controla o lao como local a c local i while i print i = i end = 0 < 10 do (i) + 1

Srgio Queiroz de Medeiros e

Descobrindo Lua 32

Laos - for numrico c e


Usando o for numrico: e for var=exp1, exp2, exp3 do <corpo> end Exemplo: t = {"um", "dois", "tr^s"} e local n = #t for i=1, n do print (t [i]) end

Srgio Queiroz de Medeiros e

Descobrindo Lua 33

Laos - for genrico c e

Pecorre os valores retornados por uma funo iteradora; ca --imprime os valores do array a for i, v in ipairs (a) do print (v) end Lua fornece vrias delas: a
ipairs; pairs; io.lines;

Srgio Queiroz de Medeiros e

Descobrindo Lua 34

ipairs
Usado para percorrer arrays: local t = {"um", "dois", "tr^s"} e for i, v in ipairs (t) do print (i, v) end Percorre at encontrar um valor nil: e local t = {"um", "dois", nil, "tr^s"} e for i, v in ipairs (t) do print (i, v) end

Srgio Queiroz de Medeiros e

Descobrindo Lua 35

pairs
Usado para pecorrer todas as chaves de um tabela: local t = {"um", "dois", nil, "tr^s"} e for k, v in pairs (t) do print (k, v) end Chaves podem ser numricas ou no: e a local t = {one = "um", two = "dois", three = "tr^s"} e for k, v in pairs (t) do print (k, v) end

Srgio Queiroz de Medeiros e

Descobrindo Lua 36

Saindo de um bloco

Para sair de um bloco, utilize os comandos break ou return Um comando break ou return deve ser o ultimo comando de um bloco i = 5 while i < 10 do break -- Erro! break deve ser o ltimo comando u i = i + 1 -- Atribui~o ltimo comando do "while" ca e u end

Srgio Queiroz de Medeiros e

Descobrindo Lua 37

Saindo de um bloco

Reorganize o cdigo ou coloque um bloco do-end: o i = 5 while i < 10 do do break -- Ok! break o ltimo comando do bloco e u end i = i + 1 -- Atribui~o ltimo comando do "while" ca e u end

Srgio Queiroz de Medeiros e

Descobrindo Lua 38

Funoes c

Valores de primeira classe; Podem ser redenidas; Mltiplos valores de retorno; u Bom suporte para programao funcional. ca

Srgio Queiroz de Medeiros e

Descobrindo Lua 39

Declarao ca

A declarao ca function foo () return 1, 2, 3 end c E aucar sinttico para: a foo = function () return 1, 2, 3 end

Srgio Queiroz de Medeiros e

Descobrindo Lua 40

Funoes c

Varivel foo no possui nenhum signicado especial: a a local a = foo foo = "bola" print (a ()) print (foo) --> 1 2 --> bola 3

Srgio Queiroz de Medeiros e

Descobrindo Lua 41

Parmetros a

Lua ajusta automaticamente o nmero de parmetros de uma u a funo; ca function foo (a, b) print (a, b) end Parmetors no fornecidos recebem nil e parmetros extra so a a a a descartados: foo (4) foo (4, 5) foo (4, 5, 6) --> 4 --> 4 --> 4 nil 5 5

Srgio Queiroz de Medeiros e

Descobrindo Lua 42

Parmetros a
Indicamos um nmero varivel de parmetros com u a a Exemplo: function add (...) local s = 0 -- percorre a lista de par^metros a for i, v in ipairs {...} do s = s + v end return s end print (add (3, 4, 10, 25, 12)) --> 54
Srgio Queiroz de Medeiros e Descobrindo Lua 43

Parmetros a

Exemplo: function maior3 (...) for i, v in ipairs {...} do if #v > 3 then -- # o operador de tamanho e print (v) end end end maior3 ("bola", "sol", "lua", "balao")

Srgio Queiroz de Medeiros e

Descobrindo Lua 44

Retornando

Funo pode retornar 0, 1 ou mltiplos valores; ca u Nem sempre poss obter todos os valores retornados por e vel uma funo ca function foo (a, b) local x = a or 1 local y = b or 1 return x + y, x * y end

Srgio Queiroz de Medeiros e

Descobrindo Lua 45

Retornando

Chamando foo: a, b, c, d = foo (1, 2), foo (3, 4), foo (5, 6) print (a, b, c, d) --> 3 7 11 30

Srgio Queiroz de Medeiros e

Descobrindo Lua 46

Retornando um unico valor

Coloque parnteses ao redor da chamada para retornar um e unico valor: a, b = foo (5, 10) print (a, b) a, b = (foo (5, 10)) print (a, b) a, b, c = foo (1, 2), print (a, b, c) --> 15 50

--> 15 nil (foo (3, 4)) --> 3 7 nil

Srgio Queiroz de Medeiros e

Descobrindo Lua 47

Valores de Primeira Classe

Qualquer varivel Lua pode armazenar uma funo; a ca Podemos passar funes como argumentos para outras co funes; co Funes podem retornar funes. co co

Srgio Queiroz de Medeiros e

Descobrindo Lua 48

map

Denio de map: ca function map (f, t) for k, v in pairs (t) do t [k] = f (v) end end

Srgio Queiroz de Medeiros e

Descobrindo Lua 49

Usando map

Incrementando elementos da tabela: function inc (v) return v + 1 end t = {1, 2, 3} map (inc, t)

Srgio Queiroz de Medeiros e

Descobrindo Lua 50

Usando map

Denindo a funo de incremento durante a chamada: ca t = {1, 2, 3} map (function (v) return v + 1 end, t)

Srgio Queiroz de Medeiros e

Descobrindo Lua 51

Fechos (Closures)

Variveis externas podem ser associadas a funes a co Funes possuem um estado co Empacotamos a funo junto com as variveis externas, ca a criando um fecho

Srgio Queiroz de Medeiros e

Descobrindo Lua 52

Fechos

Exemplo: function generateinc (init, step) local n = init or 0 local s = step or 1 return function () n = n + s -- referencia as variveis n e s a return n end end

Srgio Queiroz de Medeiros e

Descobrindo Lua 53

Fechos
Usando generateinc: local i = 3 local inc = generateinc () print (inc ()) --> 1 local inc_ = generateinc (i) print (inc (), inc_ ()) --> 2 i = 10 print (inc (), inc_ ())

--> 3

local inc10 = generateinc (5, i) print (inc (), inc_ (), inc10 ())
Srgio Queiroz de Medeiros e Descobrindo Lua 54

--> 4

15

Treinamento

Conceitos Bsicos (funes, tabelas, etc) a co Orientao a Objetos em Lua ca Descrio de dados usando Lua ca Usando a API C de Lua
Scripts Lua para congurar aplicaes C co Exportando funes e objetos C para Lua co

smedeiros@inf.puc-rio.br carregal@fabricadigital.com.br

Srgio Queiroz de Medeiros e

Descobrindo Lua 55

Fim

www.lua.org

Srgio Queiroz de Medeiros e

Descobrindo Lua 56

Potrebbero piacerti anche