18
Lua – O simples é tudo

A Linguagem Lua - Uma abordagem inicial

Embed Size (px)

Citation preview

Page 1: A Linguagem Lua - Uma abordagem inicial

Lua – O simples é tudo

Aluno: Flávio Henrique Schuindt da Silva

Características das Linguagens de Programação

Page 2: A Linguagem Lua - Uma abordagem inicial

A origem de Lua

Lua foi criada no Tecgraf, o laboratório de computação gráfica da PUC-Rio. Atualmente, seu desenvolvimento e manutenção é responsabilidade do laboratório Lablua, também localizado na PUC-Rio.

Page 3: A Linguagem Lua - Uma abordagem inicial

Usos de Lua

Jogos "Is Lua the ultimate game scripting language?"

(GDC 2010) Angry Birds, Civilization V, Fable II, Ragnarok

Online, World of Warcraft, The Sims, Farcry Linguagem de extensão

Sistemas Embarcados Câmeras, Teclado, Impressoras e, claro, TV

DIGITAL! Ginga

Page 4: A Linguagem Lua - Uma abordagem inicial

Por que Lua?

Rapidez Uma das linguagens de script com melhores

resultados em testes de benchmark Portabilidade

Basta a plataforma possuir um compilador ANSI/ISO C. Roda em Unix, Windows e em dispositivos móveis (BREW, Symbian, Pocket PC, Android, iPhone, DS, PSP, PS3) e microprocessadores embutidos (ARM, Rabbit) para aplicações como Lego MindStorms.

Page 5: A Linguagem Lua - Uma abordagem inicial

Por que Lua?

EmbutívelAPI bem documentada e engine rápida,

favorecendo a extensão da sua aplicação em C, C++, C#, Java, Smalltalk, Ruby, Python, etc.

Pequena

Page 6: A Linguagem Lua - Uma abordagem inicial

Por que Lua?

LivreCódigo aberto distribuído na licença MIT. Pode ser

usada para qualquer propósito, inclusive comerciais.

Page 7: A Linguagem Lua - Uma abordagem inicial

Uma visão geral de Lua

Tipagem dinâmicaNão exige declaração de tipo de dado

Interpretada a partir de bytecodes para uma máquina virtual baseada em registradores (LVM)

Gerenciamento automático de memória com coleta de lixo incremental (Garbage Collector)

Linguagem de extensão e embutidaInterface com C, por exemplo

Page 8: A Linguagem Lua - Uma abordagem inicial

Talk is cheap...SHOW ME THE CODE!

Page 9: A Linguagem Lua - Uma abordagem inicial

Interface com C – A extensabilidade de Lua

Escrevendo o script em Lua...Escrevendo o script em Lua...

--script.lua--script.lua

io.write("A tabela recebida pelo script foi: \n");io.write("A tabela recebida pelo script foi: \n");x = 0x = 0for i = 1, #foo dofor i = 1, #foo do print(i, foo[i])print(i, foo[i]) x = x + foo[i]x = x + foo[i]endendio.write("Retornando dados para o C...\n");io.write("Retornando dados para o C...\n");return xreturn x

Page 10: A Linguagem Lua - Uma abordagem inicial

Interface com C – A extensabilidade de Lua

Escrevendo o código em C e invocando o script em LuaEscrevendo o código em C e invocando o script em Lua#include <lua.h>#include <lua.h>#include <lauxlib.h>#include <lauxlib.h>#include <stdlib.h>#include <stdlib.h>#include <stdio.h>#include <stdio.h>intintmain(void)main(void){{ int status, result, i;int status, result, i; double sum;double sum; lua_State Llua_State L;; /* Guarda todos os contextos de lua nesta estrutura */ Guarda todos os contextos de lua nesta estrutura */ L = luaL_newstate();L = luaL_newstate(); luaL_openlibs(L); /* Carrega as bibliotecas de Lua*/luaL_openlibs(L); /* Carrega as bibliotecas de Lua*/ status = luaL_loadfile(L, "script.lua"); /*Carrega o script desejado*/status = luaL_loadfile(L, "script.lua"); /*Carrega o script desejado*/ if (status) {if (status) { fprintf(stderr, "Falha ao carregar o arquivo: %s\n", lua_tostring(L, -1));fprintf(stderr, "Falha ao carregar o arquivo: %s\n", lua_tostring(L, -1)); exit(1);exit(1); }} lua_newtable(L); /* Passaremos uma tabela */lua_newtable(L); /* Passaremos uma tabela */ for (i = 1; i <= 5; i++) {for (i = 1; i <= 5; i++) { lua_pushnumber(L, i); /* Empilha o index da tabela na pilha */lua_pushnumber(L, i); /* Empilha o index da tabela na pilha */ lua_pushnumber(L, i*2); /* Empilha o valor da célula */lua_pushnumber(L, i*2); /* Empilha o valor da célula */ lua_rawset(L, -3); /* Guarda o par na tabela */ /*-1 refere-se ao topo da pilha. -3 é a posição da tabela na pilha.*/lua_rawset(L, -3); /* Guarda o par na tabela */ /*-1 refere-se ao topo da pilha. -3 é a posição da tabela na pilha.*/ }} lua_setglobal(L, "foo"); /*Referência da tabela no script Lua*/lua_setglobal(L, "foo"); /*Referência da tabela no script Lua*/ result = lua_pcall(L, 0, LUA_MULTRET, 0);result = lua_pcall(L, 0, LUA_MULTRET, 0); if (result) {if (result) { fprintf(stderr, "Falha ao iniciar o script: %s\n", lua_tostring(L, -1));fprintf(stderr, "Falha ao iniciar o script: %s\n", lua_tostring(L, -1)); exit(1);exit(1); }}sum = lua_tonumber(L, -1);sum = lua_tonumber(L, -1);printf("Script retornou: %.0f\n", sum);printf("Script retornou: %.0f\n", sum);lua_pop(L, 1); /*Retira o valor retornado da pilha*/ lua_pop(L, 1); /*Retira o valor retornado da pilha*/ lua_close(L); lua_close(L); Return 0;Return 0;}}

Page 11: A Linguagem Lua - Uma abordagem inicial

Pode isso, Arnaldo!?

Afinal, que raio de tabela mágica é essa!?

Page 12: A Linguagem Lua - Uma abordagem inicial

Entendendo a tabela de Lua

O tipo table representa um vetor associativo, implementado internamente com o uso de uma eficiente combinação de array e hash (tabela de dispersão). As tabelas são a única forma de estruturação de dados em Lua. Todas as estruturas de dados comumente encontradas em programação (tais como vetores, listas, filas, conjuntos e hash) podem ser eficientemente (e facilmente) implementadas com o uso de tabelas.

Page 13: A Linguagem Lua - Uma abordagem inicial

Um pouquinho mais de tabela...

local t = {} -- cria nova tabela

t[1] = 4 -- armazena 4 no índice 1

t[2] = "alo" -- armazena "alo" no índice 2

t["alo"] = 5 -- armazena 5 no índice "alo"

t[t[2]] = 0 -- armazena 0 no índice "alo" (sobrescrevendo) armas = {

faca = {agressao = 0.3,faixaDeAtaque = 0.5,precisao = 1.0,

},espada = {

agressao = 0.5,faixaDeAtaque = 1.5,precisao = 0.8,

}}

Page 14: A Linguagem Lua - Uma abordagem inicial

Conceitos básicos de Lua

Variáveis e Tipos

Lua apresenta tipagem dinâmica, isto é, o interpretador, em tempo de execução pressupõe qual o tipo de dado da variável. Os tipos estão associados diretamente aos valores armazendos nas variáveis e não às variáveis em si.

a = "Exemplo" -- a armazena string

b = 1.23 -- b armazena número

b = nil -- b armazena nil

a = 3 -- a armazena número

Page 15: A Linguagem Lua - Uma abordagem inicial

Conceitos básicos de Lua

Variáveis e Tipos

Toda variável em lua, por padrão, é declarada como global, a menos que a palavra reservada ”local” seja usada.

local a -- a é local dentro do bloco declarado ou a um chunk (sequência de comandos Lua em um arquivo de script)

a = 3

Page 16: A Linguagem Lua - Uma abordagem inicial

Conceitos básicos de Lua

Funções

Funções em Lua são valores de primeira classe. Isso significa que, como qualquer outro valor, uma função pode ser criada, armazenada em uma variável (local ou global) ou campo de tabela e passada adiante como parâmetro ou valor de retorno de uma outra função. Uma função pode receber zero ou mais valores. A lista de parâmetros é especificada da maneira usual: entre os parênteses que seguem o nome da funcão.

Page 17: A Linguagem Lua - Uma abordagem inicial

Conceitos básicos de Lua

Exemplo de Função

fat = function (n)

if n==0 then

return 1

else

return n*fat(n-1)

end

end

Page 18: A Linguagem Lua - Uma abordagem inicial

$ cat despedida.lua

print 'Dúvidas?'

duvidas = io.stdin:read'*l'

if duvidas == 's' then

print('Sim. Qual?')

elseif duvidas == 'n' then

print('Até a próxima, pessoal!')

end