lua · 2017-03-17 · 47 metatabelas se tentamos fazer algo que lua não sabe fazer, obtemos um...

80
Lua Lua Uma linguagem de Uma linguagem de extensão extensível extensão extensível GDS – 6 de novembro de 02007 (atualizações em 30 de abril de 02009) Leandro Motta Barros [email protected] [email protected]

Upload: others

Post on 24-Jul-2020

4 views

Category:

Documents


0 download

TRANSCRIPT

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

80

Referências

http://www.lua.org Manual Programming in Lua Lista de discussão Wiki