Escolar Documentos
Profissional Documentos
Cultura Documentos
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)
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.
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
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))
Descobrindo Lua 6
Convenoes Lxicas c e
-indica um comentrio de uma linha; a --[[ abre um comentrio que termina com um a ]]
Descobrindo Lua 7
Tipos e Valores
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
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.
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
Descobrindo Lua 11
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
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
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"
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
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
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
casa
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
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
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.
Descobrindo Lua 21
Tabelas
a = {} --cria uma tabela e armazena refer^ncia em a e
Descobrindo Lua 22
Tabelas
a = {} --cria uma tabela e armazena refer^ncia em a e
k = "x" a[k] = 10
Descobrindo Lua 23
Tabelas
a = {} --cria uma tabela e armazena refer^ncia em a e
Descobrindo Lua 24
Tabelas
a = {} --cria uma tabela e armazena refer^ncia em a e
--nova entrada, chave="x" e valor=10 --nova entrada, chave=20 e valor="Lua" --> 10 --> Lua
Descobrindo Lua 25
Tabelas
a = {} --cria uma tabela e armazena refer^ncia em a e
--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
Construtores de Tabelas
Tabelas podem ser inicializadas como arrays: dias = {"Domingo", "Segunda", "Tera", "Quarta", c "Quinta", "Sexta", "Sbado"} a print (dias [4]) --> Quarta
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
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
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
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
Descobrindo Lua 32
Descobrindo Lua 33
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;
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
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
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
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
Descobrindo Lua 38
Funoes c
Valores de primeira classe; Podem ser redenidas; Mltiplos valores de retorno; u Bom suporte para programao funcional. ca
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
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
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
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")
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
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
Descobrindo Lua 46
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
Descobrindo Lua 47
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
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
Descobrindo Lua 49
Usando map
Incrementando elementos da tabela: function inc (v) return v + 1 end t = {1, 2, 3} map (inc, t)
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)
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
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
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
Descobrindo Lua 55
Fim
www.lua.org
Descobrindo Lua 56