![Page 1: Lua · 2017-03-17 · 47 Metatabelas Se tentamos fazer algo que Lua não sabe fazer, obtemos um erro A menos que ensinemos Lua fazer o queremos! Uma metatable é uma tabela associada](https://reader033.vdocuments.pub/reader033/viewer/2022042806/5f6bf6bae9c5b655d96dd62b/html5/thumbnails/1.jpg)
LuaLuaUma linguagem de Uma linguagem de extensão extensívelextensão extensível
GDS – 6 de novembro de 02007(atualizações em 30 de abril de 02009)
Leandro Motta [email protected]@unisinos.br
![Page 2: Lua · 2017-03-17 · 47 Metatabelas Se tentamos fazer algo que Lua não sabe fazer, obtemos um erro A menos que ensinemos Lua fazer o queremos! Uma metatable é uma tabela associada](https://reader033.vdocuments.pub/reader033/viewer/2022042806/5f6bf6bae9c5b655d96dd62b/html5/thumbnails/2.jpg)
2
Sumário
Introdução A Linguagem Lua Extendendo e Integrando
API C tolua/tolua++ Luabind Diluculum
![Page 3: Lua · 2017-03-17 · 47 Metatabelas Se tentamos fazer algo que Lua não sabe fazer, obtemos um erro A menos que ensinemos Lua fazer o queremos! Uma metatable é uma tabela associada](https://reader033.vdocuments.pub/reader033/viewer/2022042806/5f6bf6bae9c5b655d96dd62b/html5/thumbnails/3.jpg)
Introdução
![Page 4: Lua · 2017-03-17 · 47 Metatabelas Se tentamos fazer algo que Lua não sabe fazer, obtemos um erro A menos que ensinemos Lua fazer o queremos! Uma metatable é uma tabela associada](https://reader033.vdocuments.pub/reader033/viewer/2022042806/5f6bf6bae9c5b655d96dd62b/html5/thumbnails/4.jpg)
4
O que é Lua, afinal de contas?
Uma biblioteca que provê uma linguagem de programação
Uma linguagem de programação implementada com uma biblioteca
Linguagem de extensão Linguagem extensível
![Page 5: Lua · 2017-03-17 · 47 Metatabelas Se tentamos fazer algo que Lua não sabe fazer, obtemos um erro A menos que ensinemos Lua fazer o queremos! Uma metatable é uma tabela associada](https://reader033.vdocuments.pub/reader033/viewer/2022042806/5f6bf6bae9c5b655d96dd62b/html5/thumbnails/5.jpg)
5
Brevíssimo histórico
Criada no Tecgraf da PUC-Rio, em 01993 Usada “de verdade” desde a primeira
versão Primeiro, em projetos do Tecgraf Depois, o Mundo! Atualmente na versão 5.1 (fevereiro de
02006) Atualização [30/abril/02009]: Versão atual é
Lua 5.1.4, (lançada em agosto de 02008)
![Page 6: Lua · 2017-03-17 · 47 Metatabelas Se tentamos fazer algo que Lua não sabe fazer, obtemos um erro A menos que ensinemos Lua fazer o queremos! Uma metatable é uma tabela associada](https://reader033.vdocuments.pub/reader033/viewer/2022042806/5f6bf6bae9c5b655d96dd62b/html5/thumbnails/6.jpg)
6
Algumas características
Interpretada (compilada para bytecodes)
print “Lua”
lua
print “Lua” luac bytecodes
Resu
ltados
![Page 7: Lua · 2017-03-17 · 47 Metatabelas Se tentamos fazer algo que Lua não sabe fazer, obtemos um erro A menos que ensinemos Lua fazer o queremos! Uma metatable é uma tabela associada](https://reader033.vdocuments.pub/reader033/viewer/2022042806/5f6bf6bae9c5b655d96dd62b/html5/thumbnails/7.jpg)
7
Algumas características
Interpretada (compilada para bytecodes)
print “Lua”
lua
print “Lua” luac bytecodes
Resu
ltados
A idéia não é ter “bytecodes
multiplataforma”!
![Page 8: Lua · 2017-03-17 · 47 Metatabelas Se tentamos fazer algo que Lua não sabe fazer, obtemos um erro A menos que ensinemos Lua fazer o queremos! Uma metatable é uma tabela associada](https://reader033.vdocuments.pub/reader033/viewer/2022042806/5f6bf6bae9c5b655d96dd62b/html5/thumbnails/8.jpg)
8
Algumas características
Boa para “descrição de dados”Hero = { name = “Freddy Hardest”, speed = 3, strength = 12, intelligence = 7, model = “freddy.dae”, inventory = { “LaserGun”, “Boots”, “AstroSuit” }}
![Page 9: Lua · 2017-03-17 · 47 Metatabelas Se tentamos fazer algo que Lua não sabe fazer, obtemos um erro A menos que ensinemos Lua fazer o queremos! Uma metatable é uma tabela associada](https://reader033.vdocuments.pub/reader033/viewer/2022042806/5f6bf6bae9c5b655d96dd62b/html5/thumbnails/9.jpg)
9
Algumas características
Boa para “descrição de dados”Hero = { name = “Freddy Hardest”, speed = 3, strength = 12, intelligence = 7, model = “freddy.dae”, inventory = { “LaserGun”, “Boots”, “AstroSuit” }}
![Page 10: Lua · 2017-03-17 · 47 Metatabelas Se tentamos fazer algo que Lua não sabe fazer, obtemos um erro A menos que ensinemos Lua fazer o queremos! Uma metatable é uma tabela associada](https://reader033.vdocuments.pub/reader033/viewer/2022042806/5f6bf6bae9c5b655d96dd62b/html5/thumbnails/10.jpg)
10
Algumas características
Simples Sintaxe clara Uso por não programadores Simplicidade tem ótimos efeitos colaterais!
-- Define uma funçãofunction Testa (a, b) if a > b then print (“Maior!”) else print (“Menor!”) endend
-- Chama a funçãoTesta (10.4, 38)
![Page 11: Lua · 2017-03-17 · 47 Metatabelas Se tentamos fazer algo que Lua não sabe fazer, obtemos um erro A menos que ensinemos Lua fazer o queremos! Uma metatable é uma tabela associada](https://reader033.vdocuments.pub/reader033/viewer/2022042806/5f6bf6bae9c5b655d96dd62b/html5/thumbnails/11.jpg)
11
Algumas características
Poderosa Funcionalidades criteriosamente incluídas
![Page 12: Lua · 2017-03-17 · 47 Metatabelas Se tentamos fazer algo que Lua não sabe fazer, obtemos um erro A menos que ensinemos Lua fazer o queremos! Uma metatable é uma tabela associada](https://reader033.vdocuments.pub/reader033/viewer/2022042806/5f6bf6bae9c5b655d96dd62b/html5/thumbnails/12.jpg)
12
Algumas características
Poderosa Funcionalidades criteriosamente incluídas
Um dia, alguém perguntou algo como:
“Why doesn't Lua have ⟨some feature⟩?”
Luiz Henrique de Figueiredo respondeu:
“Lua evolves by answering 'why?' not 'why not?'”
![Page 13: Lua · 2017-03-17 · 47 Metatabelas Se tentamos fazer algo que Lua não sabe fazer, obtemos um erro A menos que ensinemos Lua fazer o queremos! Uma metatable é uma tabela associada](https://reader033.vdocuments.pub/reader033/viewer/2022042806/5f6bf6bae9c5b655d96dd62b/html5/thumbnails/13.jpg)
13
Algumas características
Não força políticas Provê funcionalidades básicas Vide programação OO em Lua
LOOP: http://oil.luaforge.net/loop
![Page 14: Lua · 2017-03-17 · 47 Metatabelas Se tentamos fazer algo que Lua não sabe fazer, obtemos um erro A menos que ensinemos Lua fazer o queremos! Uma metatable é uma tabela associada](https://reader033.vdocuments.pub/reader033/viewer/2022042806/5f6bf6bae9c5b655d96dd62b/html5/thumbnails/14.jpg)
14
Algumas características
Pequena Meu liblua.a tem 208 kB E isso inclui todos os “opcionais”, como a
biblioteca padrão e o compilador!
Rápida Para os padrões de linguagem interpretada
Altamente portável Implementada em ANSI/ISO C
![Page 15: Lua · 2017-03-17 · 47 Metatabelas Se tentamos fazer algo que Lua não sabe fazer, obtemos um erro A menos que ensinemos Lua fazer o queremos! Uma metatable é uma tabela associada](https://reader033.vdocuments.pub/reader033/viewer/2022042806/5f6bf6bae9c5b655d96dd62b/html5/thumbnails/15.jpg)
15
Algumas características
Robusta Diversas aplicações rodando muito bem
“Software aberto com desenvolvimento fechado” Licença MIT
![Page 16: Lua · 2017-03-17 · 47 Metatabelas Se tentamos fazer algo que Lua não sabe fazer, obtemos um erro A menos que ensinemos Lua fazer o queremos! Uma metatable é uma tabela associada](https://reader033.vdocuments.pub/reader033/viewer/2022042806/5f6bf6bae9c5b655d96dd62b/html5/thumbnails/16.jpg)
16
Alguns usuários
LucasArts: Substituindo o SCUMM
''
''
![Page 17: Lua · 2017-03-17 · 47 Metatabelas Se tentamos fazer algo que Lua não sabe fazer, obtemos um erro A menos que ensinemos Lua fazer o queremos! Uma metatable é uma tabela associada](https://reader033.vdocuments.pub/reader033/viewer/2022042806/5f6bf6bae9c5b655d96dd62b/html5/thumbnails/17.jpg)
17
Alguns usuários
Blizzard: World of Warcraft
''
![Page 18: Lua · 2017-03-17 · 47 Metatabelas Se tentamos fazer algo que Lua não sabe fazer, obtemos um erro A menos que ensinemos Lua fazer o queremos! Uma metatable é uma tabela associada](https://reader033.vdocuments.pub/reader033/viewer/2022042806/5f6bf6bae9c5b655d96dd62b/html5/thumbnails/18.jpg)
18
Alguns usuários
Crytec: Far Cry, Crysis
''
![Page 19: Lua · 2017-03-17 · 47 Metatabelas Se tentamos fazer algo que Lua não sabe fazer, obtemos um erro A menos que ensinemos Lua fazer o queremos! Uma metatable é uma tabela associada](https://reader033.vdocuments.pub/reader033/viewer/2022042806/5f6bf6bae9c5b655d96dd62b/html5/thumbnails/19.jpg)
19
Alguns usuários
Adobe: Lightroom
''
![Page 20: Lua · 2017-03-17 · 47 Metatabelas Se tentamos fazer algo que Lua não sabe fazer, obtemos um erro A menos que ensinemos Lua fazer o queremos! Uma metatable é uma tabela associada](https://reader033.vdocuments.pub/reader033/viewer/2022042806/5f6bf6bae9c5b655d96dd62b/html5/thumbnails/20.jpg)
20
Alguns usuários
Olivetti: Configuração de impressoras
![Page 21: Lua · 2017-03-17 · 47 Metatabelas Se tentamos fazer algo que Lua não sabe fazer, obtemos um erro A menos que ensinemos Lua fazer o queremos! Uma metatable é uma tabela associada](https://reader033.vdocuments.pub/reader033/viewer/2022042806/5f6bf6bae9c5b655d96dd62b/html5/thumbnails/21.jpg)
21
Alguns usuários
Eu :-)
![Page 22: Lua · 2017-03-17 · 47 Metatabelas Se tentamos fazer algo que Lua não sabe fazer, obtemos um erro A menos que ensinemos Lua fazer o queremos! Uma metatable é uma tabela associada](https://reader033.vdocuments.pub/reader033/viewer/2022042806/5f6bf6bae9c5b655d96dd62b/html5/thumbnails/22.jpg)
A Linguagem Lua
![Page 23: Lua · 2017-03-17 · 47 Metatabelas Se tentamos fazer algo que Lua não sabe fazer, obtemos um erro A menos que ensinemos Lua fazer o queremos! Uma metatable é uma tabela associada](https://reader033.vdocuments.pub/reader033/viewer/2022042806/5f6bf6bae9c5b655d96dd62b/html5/thumbnails/23.jpg)
23
Primeiro programa
Como não podia deixar de ser...
print ("Hello, World!")
![Page 24: Lua · 2017-03-17 · 47 Metatabelas Se tentamos fazer algo que Lua não sabe fazer, obtemos um erro A menos que ensinemos Lua fazer o queremos! Uma metatable é uma tabela associada](https://reader033.vdocuments.pub/reader033/viewer/2022042806/5f6bf6bae9c5b655d96dd62b/html5/thumbnails/24.jpg)
24
Primeiro programa
Como não podia deixar de ser...
Variações...
print ("Hello, World!")
print ("Hello, World!");
print "Hello, World!"
print 'Hello, World!'
print [[Hello,World!]]
print ([[Hello, World!]]);
![Page 25: Lua · 2017-03-17 · 47 Metatabelas Se tentamos fazer algo que Lua não sabe fazer, obtemos um erro A menos que ensinemos Lua fazer o queremos! Uma metatable é uma tabela associada](https://reader033.vdocuments.pub/reader033/viewer/2022042806/5f6bf6bae9c5b655d96dd62b/html5/thumbnails/25.jpg)
25
Comentários
-- Isso é um comentário de uma linha
--[[E isso é um comentáriofeio de múltiplaslinhas--]]
![Page 26: Lua · 2017-03-17 · 47 Metatabelas Se tentamos fazer algo que Lua não sabe fazer, obtemos um erro A menos que ensinemos Lua fazer o queremos! Uma metatable é uma tabela associada](https://reader033.vdocuments.pub/reader033/viewer/2022042806/5f6bf6bae9c5b655d96dd62b/html5/thumbnails/26.jpg)
26
Variáveis
Por padrão, são globais!
local message = "Hello, World!"
print (message)
![Page 27: Lua · 2017-03-17 · 47 Metatabelas Se tentamos fazer algo que Lua não sabe fazer, obtemos um erro A menos que ensinemos Lua fazer o queremos! Uma metatable é uma tabela associada](https://reader033.vdocuments.pub/reader033/viewer/2022042806/5f6bf6bae9c5b655d96dd62b/html5/thumbnails/27.jpg)
27
Variáveis
Variáveis não têm tipo, valores têm
-- 'var' contém uma stringlocal var = "Blá, blá, blá"print (var)
-- agora um númerovar = 3.1415print (var)
-- e agora um booleanovar = trueprint (var)
![Page 28: Lua · 2017-03-17 · 47 Metatabelas Se tentamos fazer algo que Lua não sabe fazer, obtemos um erro A menos que ensinemos Lua fazer o queremos! Uma metatable é uma tabela associada](https://reader033.vdocuments.pub/reader033/viewer/2022042806/5f6bf6bae9c5b655d96dd62b/html5/thumbnails/28.jpg)
28
Tipos
Nil Tipicamente, representa a ausência de um
valor útil Somente nil tem tipo Nil nil é diferente de qualquer outro valor Variáveis não inicializadas têm valor nil
if hero == nil thenhero = InitializeHero()
end
Display (hero)
![Page 29: Lua · 2017-03-17 · 47 Metatabelas Se tentamos fazer algo que Lua não sabe fazer, obtemos um erro A menos que ensinemos Lua fazer o queremos! Uma metatable é uma tabela associada](https://reader033.vdocuments.pub/reader033/viewer/2022042806/5f6bf6bae9c5b655d96dd62b/html5/thumbnails/29.jpg)
29
Tipos
Booleanos true e falselocal x, y = true, false -- atribuição múltipla
if not ((x and y) or y) then print "blá"end
if x == y then print "blé"end
if x ~= y thenprint "bli"
end
![Page 30: Lua · 2017-03-17 · 47 Metatabelas Se tentamos fazer algo que Lua não sabe fazer, obtemos um erro A menos que ensinemos Lua fazer o queremos! Uma metatable é uma tabela associada](https://reader033.vdocuments.pub/reader033/viewer/2022042806/5f6bf6bae9c5b655d96dd62b/html5/thumbnails/30.jpg)
30
Tipos
Booleanos Em testes, apenas nil e false são
considerados falsos String vazia ("") e zero (0) são considerados
verdadeiros
![Page 31: Lua · 2017-03-17 · 47 Metatabelas Se tentamos fazer algo que Lua não sabe fazer, obtemos um erro A menos que ensinemos Lua fazer o queremos! Uma metatable é uma tabela associada](https://reader033.vdocuments.pub/reader033/viewer/2022042806/5f6bf6bae9c5b655d96dd62b/html5/thumbnails/31.jpg)
31
Tipos
Números Equivale a um double (por padrão) Sem problema para representar inteiros
for i = 1, 10 do if i % 2 == 0 then print (tostring(i).." é par.") else print (tostring(i).." é ímpar.") endend
![Page 32: Lua · 2017-03-17 · 47 Metatabelas Se tentamos fazer algo que Lua não sabe fazer, obtemos um erro A menos que ensinemos Lua fazer o queremos! Uma metatable é uma tabela associada](https://reader033.vdocuments.pub/reader033/viewer/2022042806/5f6bf6bae9c5b655d96dd62b/html5/thumbnails/32.jpg)
32
Tipos
Strings Comprimento e conteúdo arbitrário Conversão automática entre números e
stringslocal str1 = "As armas "local str2 = "e os barões assinalados"local concatenada = str1..str2
print ("1.234" + 4.321) --> 5.555print ("Valor: "..171) --> "Valor: 171"
![Page 33: Lua · 2017-03-17 · 47 Metatabelas Se tentamos fazer algo que Lua não sabe fazer, obtemos um erro A menos que ensinemos Lua fazer o queremos! Uma metatable é uma tabela associada](https://reader033.vdocuments.pub/reader033/viewer/2022042806/5f6bf6bae9c5b655d96dd62b/html5/thumbnails/33.jpg)
33
Tipos
Tabelas (tables) O único tipo “composto” em Lua Array associativo: valores de qualquer tipo
indexados por chaves de qualquer tipo Variáveis contém apenas referências para
tabelas!
![Page 34: Lua · 2017-03-17 · 47 Metatabelas Se tentamos fazer algo que Lua não sabe fazer, obtemos um erro A menos que ensinemos Lua fazer o queremos! Uma metatable é uma tabela associada](https://reader033.vdocuments.pub/reader033/viewer/2022042806/5f6bf6bae9c5b655d96dd62b/html5/thumbnails/34.jpg)
34
Tipos
Tabelas (tables)local t = { nome = "Fulano", idade = 33, [5] = "cinco", [false] = "blá", pais = { pai = "Ivo", mae = "Ana"}}
print (t["nome"]) --> "Fulano"print (t.nome) --> "Fulano"print (t[5]) --> "cinco"print (t[false]) --> "blá"print (t["pais"]["pai"]) --> "Ivo"print (t.pais.mae) --> "Ana"
![Page 35: Lua · 2017-03-17 · 47 Metatabelas Se tentamos fazer algo que Lua não sabe fazer, obtemos um erro A menos que ensinemos Lua fazer o queremos! Uma metatable é uma tabela associada](https://reader033.vdocuments.pub/reader033/viewer/2022042806/5f6bf6bae9c5b655d96dd62b/html5/thumbnails/35.jpg)
35
Tipos
Tabelas (tables)local t = { nome = "Fulano", idade = 33, [5] = "cinco", [false] = "blá", pais = { pai = "Ivo", mae = "Ana"}}
print (t["nome"]) --> "Fulano"print (t.nome) --> "Fulano"print (t[5]) --> "cinco"print (t[false]) --> "blá"print (t["pais"]["pai"]) --> "Ivo"print (t.pais.mae) --> "Ana"
![Page 36: Lua · 2017-03-17 · 47 Metatabelas Se tentamos fazer algo que Lua não sabe fazer, obtemos um erro A menos que ensinemos Lua fazer o queremos! Uma metatable é uma tabela associada](https://reader033.vdocuments.pub/reader033/viewer/2022042806/5f6bf6bae9c5b655d96dd62b/html5/thumbnails/36.jpg)
36
Tipos
Tabelas (tables) Usadas como listas/arrays: índice inteiro é
implicitamente adicionadoinventory = { "LaserGun", "Boots", "AstroSuit" }
print (inventory[1]) --> "LaserGun"print (inventory[3]) --> "AstroSuit"
print (inventory[0]) --> nilprint (inventory[4]) --> nil
print (#inventory) --> 3
![Page 37: Lua · 2017-03-17 · 47 Metatabelas Se tentamos fazer algo que Lua não sabe fazer, obtemos um erro A menos que ensinemos Lua fazer o queremos! Uma metatable é uma tabela associada](https://reader033.vdocuments.pub/reader033/viewer/2022042806/5f6bf6bae9c5b655d96dd62b/html5/thumbnails/37.jpg)
37
Tipos
Tabelas (tables) Também possuem synctatic sugar quando
usadas como único parâmetro de uma função
-- Isso:ProcessItems ({"LaserGun", "Boots", "AstroSuit"})
-- ...é o mesmo que isso:ProcessItems {"LaserGun", "Boots", "AstroSuit"}
![Page 38: Lua · 2017-03-17 · 47 Metatabelas Se tentamos fazer algo que Lua não sabe fazer, obtemos um erro A menos que ensinemos Lua fazer o queremos! Uma metatable é uma tabela associada](https://reader033.vdocuments.pub/reader033/viewer/2022042806/5f6bf6bae9c5b655d96dd62b/html5/thumbnails/38.jpg)
38
Tipos
Funções
function Soma (a, b) return a + bend
print (Soma(10, 20)) --> 30
function SomaSubtrai (a, b) return a + b, a - bend
a, b = SomaSubtrai (10, 20)print (a, b) --> 30, -10
![Page 39: Lua · 2017-03-17 · 47 Metatabelas Se tentamos fazer algo que Lua não sabe fazer, obtemos um erro A menos que ensinemos Lua fazer o queremos! Uma metatable é uma tabela associada](https://reader033.vdocuments.pub/reader033/viewer/2022042806/5f6bf6bae9c5b655d96dd62b/html5/thumbnails/39.jpg)
39
Tipos
Funções São um tipo como outro qualquer
hero = { name = "Freddy Hardest", strength = 13, attack = function() print "I'm attacking!!!" end}
hero.attack()
![Page 40: Lua · 2017-03-17 · 47 Metatabelas Se tentamos fazer algo que Lua não sabe fazer, obtemos um erro A menos que ensinemos Lua fazer o queremos! Uma metatable é uma tabela associada](https://reader033.vdocuments.pub/reader033/viewer/2022042806/5f6bf6bae9c5b655d96dd62b/html5/thumbnails/40.jpg)
40
Tipos
Outros Threads: não é bem o que você está
pensando Mas veja, entre outros, o Lua Lanes
http://kotisivu.dnainternet.net/askok/bin/lanes
Userdata: tipo definido pelo usuário,em C/C++
![Page 41: Lua · 2017-03-17 · 47 Metatabelas Se tentamos fazer algo que Lua não sabe fazer, obtemos um erro A menos que ensinemos Lua fazer o queremos! Uma metatable é uma tabela associada](https://reader033.vdocuments.pub/reader033/viewer/2022042806/5f6bf6bae9c5b655d96dd62b/html5/thumbnails/41.jpg)
41
Iteradores e o for genérico
Já vimos um exemplo do “for padrão” antes...
Mas como, por exemplo, fazer um laço que percorra todos os elementos de uma tabela?
for i = 1, 10 do if i % 2 == 0 then print (tostring(i).." é par.") else print (tostring(i).." é ímpar.") endend
![Page 42: Lua · 2017-03-17 · 47 Metatabelas Se tentamos fazer algo que Lua não sabe fazer, obtemos um erro A menos que ensinemos Lua fazer o queremos! Uma metatable é uma tabela associada](https://reader033.vdocuments.pub/reader033/viewer/2022042806/5f6bf6bae9c5b655d96dd62b/html5/thumbnails/42.jpg)
42
Iteradores e o for genérico
Iteradores! Basicamente, uma função que retorna o
próximo elemento de uma seqüência Trabalha junto com o for genérico
hero = { name = "Freddy Hardest", speed = 3, strength = 12, intelligence = 7}
for k, v in pairs (t) do print (k, "-->", v)end
![Page 43: Lua · 2017-03-17 · 47 Metatabelas Se tentamos fazer algo que Lua não sabe fazer, obtemos um erro A menos que ensinemos Lua fazer o queremos! Uma metatable é uma tabela associada](https://reader033.vdocuments.pub/reader033/viewer/2022042806/5f6bf6bae9c5b655d96dd62b/html5/thumbnails/43.jpg)
43
Iteradores e o for genérico
ipairs() Para percorrer apenas índices numéricos (de
1 até o primeiro buraco)inventory = { "LaserGun", "Boots", "AstroSuit"}
for k, v in ipairs (inventory) do print ("Item: "..v)end
![Page 44: Lua · 2017-03-17 · 47 Metatabelas Se tentamos fazer algo que Lua não sabe fazer, obtemos um erro A menos que ensinemos Lua fazer o queremos! Uma metatable é uma tabela associada](https://reader033.vdocuments.pub/reader033/viewer/2022042806/5f6bf6bae9c5b655d96dd62b/html5/thumbnails/44.jpg)
44
Iteradores e o for genérico
Outros iteradores na biblioteca padrão io.lines ("some_file.txt") string.gmatch (some_string, regexp)
![Page 45: Lua · 2017-03-17 · 47 Metatabelas Se tentamos fazer algo que Lua não sabe fazer, obtemos um erro A menos que ensinemos Lua fazer o queremos! Uma metatable é uma tabela associada](https://reader033.vdocuments.pub/reader033/viewer/2022042806/5f6bf6bae9c5b655d96dd62b/html5/thumbnails/45.jpg)
45
Iteradores e o for genérico
Nós também podemos escrever nossos próprios iteradores Como iterar apenas pelas armas?
inventory = { { name = "LaserGun", type = "weapon" }, { name = "Boots", type = "armor” }, { name = "AstroSuit", type = "armor” }, { name = "Chainsaw", type = "weapon" },}
for k, weapon in weapons (inventory) do print ("Weapon: "..weapon.name)end
![Page 46: Lua · 2017-03-17 · 47 Metatabelas Se tentamos fazer algo que Lua não sabe fazer, obtemos um erro A menos que ensinemos Lua fazer o queremos! Uma metatable é uma tabela associada](https://reader033.vdocuments.pub/reader033/viewer/2022042806/5f6bf6bae9c5b655d96dd62b/html5/thumbnails/46.jpg)
46
Metatabelas
Vetores 3D em Lua...
local v1 = { 1, 2, 3 }local v2 = { 4, 5, 6 }
print (v1)
local v3 = v1 + v2
![Page 47: Lua · 2017-03-17 · 47 Metatabelas Se tentamos fazer algo que Lua não sabe fazer, obtemos um erro A menos que ensinemos Lua fazer o queremos! Uma metatable é uma tabela associada](https://reader033.vdocuments.pub/reader033/viewer/2022042806/5f6bf6bae9c5b655d96dd62b/html5/thumbnails/47.jpg)
47
Metatabelas
Se tentamos fazer algo que Lua não sabe fazer, obtemos um erro A menos que ensinemos Lua fazer o
queremos!
Uma metatable é uma tabela associada a outra tabela Indica o que fazer quando tentamos realizar
alguma operação que de outra forma seria inválida
Por exemplo, como somar ou imprimir um vetor 3D
![Page 48: Lua · 2017-03-17 · 47 Metatabelas Se tentamos fazer algo que Lua não sabe fazer, obtemos um erro A menos que ensinemos Lua fazer o queremos! Uma metatable é uma tabela associada](https://reader033.vdocuments.pub/reader033/viewer/2022042806/5f6bf6bae9c5b655d96dd62b/html5/thumbnails/48.jpg)
48
Metatabelas
VectorMetatable = { __tostring = function(v) return "("..v[1]..", "..v[2] ..", "..v[3]..")" end,
__add = function(v1, v2) local t = { v1[1]+v2[1], v1[2]+v2[2], v1[3]+v2[3] } setmetatable (t, VectorMetatable) return t end}
Uma metatabela é uma tabela normal... Com metamétodos!
![Page 49: Lua · 2017-03-17 · 47 Metatabelas Se tentamos fazer algo que Lua não sabe fazer, obtemos um erro A menos que ensinemos Lua fazer o queremos! Uma metatable é uma tabela associada](https://reader033.vdocuments.pub/reader033/viewer/2022042806/5f6bf6bae9c5b655d96dd62b/html5/thumbnails/49.jpg)
49
Metatabelas
v1 = { 1, 2, 0 }v2 = { 5, 2, 3 }
setmetatable (v1, VectorMetatable)setmetatable (v2, VectorMetatable)
print (v1 + v2)
A mágica acontece quando associamos a metatabela a uma tabela que representa um vetor 3D
![Page 50: Lua · 2017-03-17 · 47 Metatabelas Se tentamos fazer algo que Lua não sabe fazer, obtemos um erro A menos que ensinemos Lua fazer o queremos! Uma metatable é uma tabela associada](https://reader033.vdocuments.pub/reader033/viewer/2022042806/5f6bf6bae9c5b655d96dd62b/html5/thumbnails/50.jpg)
50
Rudimentos de OO em Lua
Antes de mais nada, como OO é implementada em uma linguagem como C++?
![Page 51: Lua · 2017-03-17 · 47 Metatabelas Se tentamos fazer algo que Lua não sabe fazer, obtemos um erro A menos que ensinemos Lua fazer o queremos! Uma metatable é uma tabela associada](https://reader033.vdocuments.pub/reader033/viewer/2022042806/5f6bf6bae9c5b655d96dd62b/html5/thumbnails/51.jpg)
51
Rudimentos de OO em Lua
Sem querer ser repetitivo, mas... Lua não tem suporte “nativo” a OO Lua não força políticas Várias formas diferentes de OO podem ser
implementadas!
Aqui, veremos apenas uma forma simples, básica e incompleta Que nem pode ser chamada de OO de
verdade Não veremos herança, por exemplo!
![Page 52: Lua · 2017-03-17 · 47 Metatabelas Se tentamos fazer algo que Lua não sabe fazer, obtemos um erro A menos que ensinemos Lua fazer o queremos! Uma metatable é uma tabela associada](https://reader033.vdocuments.pub/reader033/viewer/2022042806/5f6bf6bae9c5b655d96dd62b/html5/thumbnails/52.jpg)
52
Rudimentos de OO em Lua
Em Lua Objetos são tabelas Atributos são valores armazenados na tabela Métodos são funções armazenadas na tabela
Parâmetro self (equivalente ao ponteiro this no C++) deve ser passado explicitamente
Chamada de métodos: mais synctatic sugar
![Page 53: Lua · 2017-03-17 · 47 Metatabelas Se tentamos fazer algo que Lua não sabe fazer, obtemos um erro A menos que ensinemos Lua fazer o queremos! Uma metatable é uma tabela associada](https://reader033.vdocuments.pub/reader033/viewer/2022042806/5f6bf6bae9c5b655d96dd62b/html5/thumbnails/53.jpg)
53
Rudimentos de OO em Lua
hero = { name = "Freddy", strength = 12, sayHello = function (self) print ("Hi, my name is "..self.name.." and my strength is " ..tostring(self.strength)..".") end}
hero.sayHello (hero)
hero:sayHello()
![Page 54: Lua · 2017-03-17 · 47 Metatabelas Se tentamos fazer algo que Lua não sabe fazer, obtemos um erro A menos que ensinemos Lua fazer o queremos! Uma metatable é uma tabela associada](https://reader033.vdocuments.pub/reader033/viewer/2022042806/5f6bf6bae9c5b655d96dd62b/html5/thumbnails/54.jpg)
54
Rudimentos de OO em Lua
hero = { name = "Freddy", strength = 12, sayHello = function (self) print ("Hi, my name is "..self.name.." and my strength is " ..tostring(self.strength)..".") end}
hero.sayHello (hero)
hero:sayHello()
![Page 55: Lua · 2017-03-17 · 47 Metatabelas Se tentamos fazer algo que Lua não sabe fazer, obtemos um erro A menos que ensinemos Lua fazer o queremos! Uma metatable é uma tabela associada](https://reader033.vdocuments.pub/reader033/viewer/2022042806/5f6bf6bae9c5b655d96dd62b/html5/thumbnails/55.jpg)
55
Rudimentos de OO em Lua
Até aqui, não temos o conceito de classe Classes podem ser implementadas
através de metatables Campo __index
![Page 56: Lua · 2017-03-17 · 47 Metatabelas Se tentamos fazer algo que Lua não sabe fazer, obtemos um erro A menos que ensinemos Lua fazer o queremos! Uma metatable é uma tabela associada](https://reader033.vdocuments.pub/reader033/viewer/2022042806/5f6bf6bae9c5b655d96dd62b/html5/thumbnails/56.jpg)
Estendendo e Integrando
![Page 57: Lua · 2017-03-17 · 47 Metatabelas Se tentamos fazer algo que Lua não sabe fazer, obtemos um erro A menos que ensinemos Lua fazer o queremos! Uma metatable é uma tabela associada](https://reader033.vdocuments.pub/reader033/viewer/2022042806/5f6bf6bae9c5b655d96dd62b/html5/thumbnails/57.jpg)
57
Possibilidades
Arquivos de configuração/dados em Lua Comentários, funções, for, os.getenv()...
Permitir que o usuário estenda, modifique, personalize nosso aplicativo
Prover novas funcionalidades para scripts em Lua
![Page 58: Lua · 2017-03-17 · 47 Metatabelas Se tentamos fazer algo que Lua não sabe fazer, obtemos um erro A menos que ensinemos Lua fazer o queremos! Uma metatable é uma tabela associada](https://reader033.vdocuments.pub/reader033/viewer/2022042806/5f6bf6bae9c5b655d96dd62b/html5/thumbnails/58.jpg)
58
A API C de Lua
Interpretador Lua é baseado numa pilha Mas com acesso “livre”
Índices positivos: posição absoluta (1 representa o primeiro item pushado)
Índices negativos: similar, mas contando do topo (-1 é o elemento no topo da pilha)
Pseudo-Índices LUA_GLOBALSINDEX
![Page 59: Lua · 2017-03-17 · 47 Metatabelas Se tentamos fazer algo que Lua não sabe fazer, obtemos um erro A menos que ensinemos Lua fazer o queremos! Uma metatable é uma tabela associada](https://reader033.vdocuments.pub/reader033/viewer/2022042806/5f6bf6bae9c5b655d96dd62b/html5/thumbnails/59.jpg)
59
A API C de Lua
Executando uma “string Lua”
lua_State* ls = luaL_newstate();luaL_openlibs (ls);
luaL_dostring ("print ('Bla!')");
lua_close (ls);
![Page 60: Lua · 2017-03-17 · 47 Metatabelas Se tentamos fazer algo que Lua não sabe fazer, obtemos um erro A menos que ensinemos Lua fazer o queremos! Uma metatable é uma tabela associada](https://reader033.vdocuments.pub/reader033/viewer/2022042806/5f6bf6bae9c5b655d96dd62b/html5/thumbnails/60.jpg)
60
A API C de Lua
Implementando uma função em C Implementa uma lua_CFunction
int Func (lua_State* ls) Troca parâmetros e valores de retorno com o
“lado Lua” via pilha Retorna o número de valores de retorno lua_push*(), luato*()
Exemplo Função que recebe dois parâmetros
numéricos e retorna a sua soma e produto
![Page 61: Lua · 2017-03-17 · 47 Metatabelas Se tentamos fazer algo que Lua não sabe fazer, obtemos um erro A menos que ensinemos Lua fazer o queremos! Uma metatable é uma tabela associada](https://reader033.vdocuments.pub/reader033/viewer/2022042806/5f6bf6bae9c5b655d96dd62b/html5/thumbnails/61.jpg)
61
A API C de Lua
int soma_prod (lua_State* ls){ lua_Number a = lua_tonumber (ls, -1); lua_Number b = lua_tonumber (ls, -2);
lua_pushnumber (ls, a + b); lua_pushnumber (ls, a * b);
return 2;}
![Page 62: Lua · 2017-03-17 · 47 Metatabelas Se tentamos fazer algo que Lua não sabe fazer, obtemos um erro A menos que ensinemos Lua fazer o queremos! Uma metatable é uma tabela associada](https://reader033.vdocuments.pub/reader033/viewer/2022042806/5f6bf6bae9c5b655d96dd62b/html5/thumbnails/62.jpg)
62
A API C de Lua
É preciso ainda “registrar” a função C num lua_State.
A função C soma_prod() é atribuída ao índice SomaProd da tabela de globais Ou seja: em Lua, temos uma nova função
global chamada SomaProd()
lua_pushstring (ls, "SomaProd");lua_pushcfunction (ls, soma_prod);lua_settable (ls, LUA_GLOBALSINDEX);
![Page 63: Lua · 2017-03-17 · 47 Metatabelas Se tentamos fazer algo que Lua não sabe fazer, obtemos um erro A menos que ensinemos Lua fazer o queremos! Uma metatable é uma tabela associada](https://reader033.vdocuments.pub/reader033/viewer/2022042806/5f6bf6bae9c5b655d96dd62b/html5/thumbnails/63.jpg)
63
A API C de Lua
E para usar “arquivos de configuração em Lua”? Na mesma linha
lua_gettable()
![Page 64: Lua · 2017-03-17 · 47 Metatabelas Se tentamos fazer algo que Lua não sabe fazer, obtemos um erro A menos que ensinemos Lua fazer o queremos! Uma metatable é uma tabela associada](https://reader033.vdocuments.pub/reader033/viewer/2022042806/5f6bf6bae9c5b655d96dd62b/html5/thumbnails/64.jpg)
64
Ferramentas...
Usar a API C de Lua não é coisa de outro mundo...
Mas a vida pode ser melhor! (Ou pior! Tudo depende do ponto-de-vista!)
Ferramentas podem auxiliar na integração de C/C++ com Lua
![Page 65: Lua · 2017-03-17 · 47 Metatabelas Se tentamos fazer algo que Lua não sabe fazer, obtemos um erro A menos que ensinemos Lua fazer o queremos! Uma metatable é uma tabela associada](https://reader033.vdocuments.pub/reader033/viewer/2022042806/5f6bf6bae9c5b655d96dd62b/html5/thumbnails/65.jpg)
65
LuaBind
Na linha de Boost.Python Templates, templates, templates... Sem necessidade de uma ferramenta externa Complexo
Projeto órfão: apenas Lua 5.0 suportada Atualização [30/abril/02009]: Parece que o projeto
está ativo de novo!
http://luabind.sourceforge.net
![Page 66: Lua · 2017-03-17 · 47 Metatabelas Se tentamos fazer algo que Lua não sabe fazer, obtemos um erro A menos que ensinemos Lua fazer o queremos! Uma metatable é uma tabela associada](https://reader033.vdocuments.pub/reader033/viewer/2022042806/5f6bf6bae9c5b655d96dd62b/html5/thumbnails/66.jpg)
66
LuaBind
Exemplo básicovoid hello(){ std::cout << "Hello, World\n!";}
// ...using namesace luabind;open (ls);
module(ls)[ def ("Hello", hello)];
![Page 67: Lua · 2017-03-17 · 47 Metatabelas Se tentamos fazer algo que Lua não sabe fazer, obtemos um erro A menos que ensinemos Lua fazer o queremos! Uma metatable é uma tabela associada](https://reader033.vdocuments.pub/reader033/viewer/2022042806/5f6bf6bae9c5b655d96dd62b/html5/thumbnails/67.jpg)
67
LuaBind
Uma classe em C++...class TestClass{ public: TestClass(const std::string& s) : string_(s) { }
void printString() { std::cout << string_ << "\n"; }
private: std::string string_;};
![Page 68: Lua · 2017-03-17 · 47 Metatabelas Se tentamos fazer algo que Lua não sabe fazer, obtemos um erro A menos que ensinemos Lua fazer o queremos! Uma metatable é uma tabela associada](https://reader033.vdocuments.pub/reader033/viewer/2022042806/5f6bf6bae9c5b655d96dd62b/html5/thumbnails/68.jpg)
68
LuaBind
...exportada para Lua
Module (ls)[ class_<TestClass>("TestClass") .def(constructor<const std::string&>()) .def("print_string", &TestClass::printString)];
![Page 69: Lua · 2017-03-17 · 47 Metatabelas Se tentamos fazer algo que Lua não sabe fazer, obtemos um erro A menos que ensinemos Lua fazer o queremos! Uma metatable é uma tabela associada](https://reader033.vdocuments.pub/reader033/viewer/2022042806/5f6bf6bae9c5b655d96dd62b/html5/thumbnails/69.jpg)
69
tolua e tolua++
Ferramenta externa Processa um arquivo “.h limpo” Gera o código C que faz a exportação Adiciona um mecanismo OO a Lua http://www.tecgraf.puc-rio.br/~celes/tolua
tolua++ Versão com algumas melhorias (em particular,
sabe o que são std::strings) http://www.codenix.com/~tolua
![Page 70: Lua · 2017-03-17 · 47 Metatabelas Se tentamos fazer algo que Lua não sabe fazer, obtemos um erro A menos que ensinemos Lua fazer o queremos! Uma metatable é uma tabela associada](https://reader033.vdocuments.pub/reader033/viewer/2022042806/5f6bf6bae9c5b655d96dd62b/html5/thumbnails/70.jpg)
70
tolua e tolua++
Exemplo Character, hero, “My name is Freddy”...
De novo!
![Page 71: Lua · 2017-03-17 · 47 Metatabelas Se tentamos fazer algo que Lua não sabe fazer, obtemos um erro A menos que ensinemos Lua fazer o queremos! Uma metatable é uma tabela associada](https://reader033.vdocuments.pub/reader033/viewer/2022042806/5f6bf6bae9c5b655d96dd62b/html5/thumbnails/71.jpg)
71
tolua e tolua++
Para “arquivos de configuração em Lua” Nenhuma funcionalidade específica Mas até que dá prá se virar com algumas
coisas fáceis de implementar
DoString ("_number_ = GetFavoriteNumber('lmb')");double favoriteNumber = GetGlobal("_number_");
![Page 72: Lua · 2017-03-17 · 47 Metatabelas Se tentamos fazer algo que Lua não sabe fazer, obtemos um erro A menos que ensinemos Lua fazer o queremos! Uma metatable é uma tabela associada](https://reader033.vdocuments.pub/reader033/viewer/2022042806/5f6bf6bae9c5b655d96dd62b/html5/thumbnails/72.jpg)
72
Diluculum
Foco em “arquivos de configuração em Lua” Incluindo bom suporte a chamada de funções
Lua a partir de C++
Suporte à exportação de funções e classes C++ para Lua Intrusivo Limitado Com implementação, ahm, simples (macros)
http://www.stackedboxes.org/Projects/Diluculum
![Page 73: Lua · 2017-03-17 · 47 Metatabelas Se tentamos fazer algo que Lua não sabe fazer, obtemos um erro A menos que ensinemos Lua fazer o queremos! Uma metatable é uma tabela associada](https://reader033.vdocuments.pub/reader033/viewer/2022042806/5f6bf6bae9c5b655d96dd62b/html5/thumbnails/73.jpg)
73
Diluculum
Principais classes Diluculum::LuaState
Um interpretador Lua Diluculum::LuaValue
Pode conter uma string, número, tabela, função... Diluculum::LuaVariable
Referência a uma variável dentro de um LuaState
![Page 74: Lua · 2017-03-17 · 47 Metatabelas Se tentamos fazer algo que Lua não sabe fazer, obtemos um erro A menos que ensinemos Lua fazer o queremos! Uma metatable é uma tabela associada](https://reader033.vdocuments.pub/reader033/viewer/2022042806/5f6bf6bae9c5b655d96dd62b/html5/thumbnails/74.jpg)
74
Diluculum
Arquivos de configuração em Lua
Variáveis Lua têm acesso de leitura e escrita
Diluculum::LuaState ls;ls.doFile ("config.lua");
double favePi = ls["FavoritePiApproximation"].value().asNumber();
std::string color = ls["FavoriteColor"].value().asString()
if (ls["UserInfo"]["Name"].value() != "lmb"){ ... }
![Page 75: Lua · 2017-03-17 · 47 Metatabelas Se tentamos fazer algo que Lua não sabe fazer, obtemos um erro A menos que ensinemos Lua fazer o queremos! Uma metatable é uma tabela associada](https://reader033.vdocuments.pub/reader033/viewer/2022042806/5f6bf6bae9c5b655d96dd62b/html5/thumbnails/75.jpg)
75
Diluculum
Exportando funções para LuaDiluculum::LuaValueListFunc (const Diluculum::LuaValueList& params){ /* ... */ }
// ...
DILUCULUM_WRAP_FUNCTION (Func);
Diluculum::LuaState ls;
ls["MyFunction"] = DILUCULUM_WRAPPER_FUNCTION (Func);
ls.doString ("a, b, c = Func (4.5)");
![Page 76: Lua · 2017-03-17 · 47 Metatabelas Se tentamos fazer algo que Lua não sabe fazer, obtemos um erro A menos que ensinemos Lua fazer o queremos! Uma metatable é uma tabela associada](https://reader033.vdocuments.pub/reader033/viewer/2022042806/5f6bf6bae9c5b655d96dd62b/html5/thumbnails/76.jpg)
76
Diluculum
Exportando classes para Lua Limitações similares Construtor recebendo um LuaValueList Métodos exportados devem receber e
retornar um LuaValueListDILUCULUM_BEGIN_CLASS (MyClass); DILUCULUM_CLASS_METHOD (MyClass, myMethod);DILUCULUM_END_CLASS (MyClass);
DILUCULUM_REGISTER_CLASS (ls["MyClass"], MyClass);
ls.doString ("obj = MyClass.new (3)");ls.doString ("obj:myMethod()");
![Page 77: Lua · 2017-03-17 · 47 Metatabelas Se tentamos fazer algo que Lua não sabe fazer, obtemos um erro A menos que ensinemos Lua fazer o queremos! Uma metatable é uma tabela associada](https://reader033.vdocuments.pub/reader033/viewer/2022042806/5f6bf6bae9c5b655d96dd62b/html5/thumbnails/77.jpg)
77
Diluculum
Exportando objetos para Lua Permite, em Lua, chamar métodos de um
objeto instanciado no lado C++ Objeto não será “limpado” por Lua
MyClass obj (params);
DILUCULUM_REGISTER_OBJECT (ls["obj"], MyClass, o);
ls.doString ("o:myMethod()");
![Page 78: Lua · 2017-03-17 · 47 Metatabelas Se tentamos fazer algo que Lua não sabe fazer, obtemos um erro A menos que ensinemos Lua fazer o queremos! Uma metatable é uma tabela associada](https://reader033.vdocuments.pub/reader033/viewer/2022042806/5f6bf6bae9c5b655d96dd62b/html5/thumbnails/78.jpg)
78
Diluculum
Módulos em bibliotecas dinâmicas Em Lua, require("Modulo”)
DILUCULUM_BEGIN_MODULE (MyFineModule); DILUCULUM_MODULE_ADD_CLASS (ValueBox, "ValueBox"); DILUCULUM_MODULE_ADD_FUNCTION( DILUCULUM_WRAPPER_FUNCTION(MyFunction), "MyFunction");DILUCULUM_END_MODULE();
![Page 79: Lua · 2017-03-17 · 47 Metatabelas Se tentamos fazer algo que Lua não sabe fazer, obtemos um erro A menos que ensinemos Lua fazer o queremos! Uma metatable é uma tabela associada](https://reader033.vdocuments.pub/reader033/viewer/2022042806/5f6bf6bae9c5b655d96dd62b/html5/thumbnails/79.jpg)
Referências
![Page 80: Lua · 2017-03-17 · 47 Metatabelas Se tentamos fazer algo que Lua não sabe fazer, obtemos um erro A menos que ensinemos Lua fazer o queremos! Uma metatable é uma tabela associada](https://reader033.vdocuments.pub/reader033/viewer/2022042806/5f6bf6bae9c5b655d96dd62b/html5/thumbnails/80.jpg)
80
Referências
http://www.lua.org Manual Programming in Lua Lista de discussão Wiki