Linguagens de Script: Caso de Estudo Lua
-
Upload
sergio-souza-costa -
Category
Documents
-
view
3.005 -
download
0
Transcript of Linguagens de Script: Caso de Estudo Lua
![Page 1: Linguagens de Script: Caso de Estudo Lua](https://reader033.fdocuments.net/reader033/viewer/2022052602/5599b5ba1a28abe80b8b4808/html5/thumbnails/1.jpg)
Caso de estudo: Lua Prof: Sérgio Souza Costa
Linguagens de Script
![Page 2: Linguagens de Script: Caso de Estudo Lua](https://reader033.fdocuments.net/reader033/viewer/2022052602/5599b5ba1a28abe80b8b4808/html5/thumbnails/2.jpg)
Sobre mim
Sérgio Souza CostaProfessor - UFMADoutor em Computação Aplicada (INPE)
https://sites.google.com/site/profsergiocosta/home
https://twitter.com/profsergiocosta
http://gplus.to/sergiosouzacosta
http://www.slideshare.net/skosta/presentations?order=popular
![Page 3: Linguagens de Script: Caso de Estudo Lua](https://reader033.fdocuments.net/reader033/viewer/2022052602/5599b5ba1a28abe80b8b4808/html5/thumbnails/3.jpg)
Introdução
● Pragmática● Conceitos chaves● Caso de estudo: Lua
![Page 4: Linguagens de Script: Caso de Estudo Lua](https://reader033.fdocuments.net/reader033/viewer/2022052602/5599b5ba1a28abe80b8b4808/html5/thumbnails/4.jpg)
Pragmática
Script é um paradigma caracterizado por:
● integração com outros sistemas ● desenvolvimento rápido● eficiência modesta● funções de alto nível e para aplicações
específicas
![Page 5: Linguagens de Script: Caso de Estudo Lua](https://reader033.fdocuments.net/reader033/viewer/2022052602/5599b5ba1a28abe80b8b4808/html5/thumbnails/5.jpg)
Integração com outros sistemas
Grandes sistemas, são compostos por diversos subsistemas
Linguagens de script, podem ser usadas para integrar estes subsistemas.
Também, para aumentar as possibilidades de customização de grandes sistemas.
![Page 6: Linguagens de Script: Caso de Estudo Lua](https://reader033.fdocuments.net/reader033/viewer/2022052602/5599b5ba1a28abe80b8b4808/html5/thumbnails/6.jpg)
Exemplos?
![Page 7: Linguagens de Script: Caso de Estudo Lua](https://reader033.fdocuments.net/reader033/viewer/2022052602/5599b5ba1a28abe80b8b4808/html5/thumbnails/7.jpg)
Exemplos
● Lua○ Jogos, multimedia, Integrado com engines
● JavaScript○ Web, cliente, Integrado ao browser
● PHP, JSP, ASP○ Web, servidor, Integrado com servidor de paginas
● VbScript○ Office, Integrado aos aplicatiovos
● Shell Script○ operações de sistemas operacionais
![Page 8: Linguagens de Script: Caso de Estudo Lua](https://reader033.fdocuments.net/reader033/viewer/2022052602/5599b5ba1a28abe80b8b4808/html5/thumbnails/8.jpg)
Desenvolvimento rápido
Scripts são caracterizados por um rapido processo de desenvolvimento.
Alguns scripts são escritos e usados apenas uma vez, tais como sequencias de comandos, ex. shell script.
Outros usados mais frequentes, mas sempre com modificações
![Page 9: Linguagens de Script: Caso de Estudo Lua](https://reader033.fdocuments.net/reader033/viewer/2022052602/5599b5ba1a28abe80b8b4808/html5/thumbnails/9.jpg)
Desenvolvimento rápido
Scripts são caracterizados por um rapido processo de desenvolvimento.
Alguns scripts são escritos e usados apenas uma vez, tais como sequencias de comandos, ex. shell script.
Outros usados mais frequentes, mas sempre com modificações
Citem duas caracteristicas que torna o processo de desenvolvimento rápido nesta linguagem.
![Page 10: Linguagens de Script: Caso de Estudo Lua](https://reader033.fdocuments.net/reader033/viewer/2022052602/5599b5ba1a28abe80b8b4808/html5/thumbnails/10.jpg)
Desenvolvimento rápido
Edite-rode, diferentemente de edite-compile-link-rode, das linguagens compiladas.
![Page 11: Linguagens de Script: Caso de Estudo Lua](https://reader033.fdocuments.net/reader033/viewer/2022052602/5599b5ba1a28abe80b8b4808/html5/thumbnails/11.jpg)
Desenvolvimento rápido
Edite-rode, diferentemente de edite-compile-link-rode, das linguagens compiladas.
Usualmente são dinamicamente tipadas, facilitando o reuso de código e redigibilidade, códigos menores
![Page 12: Linguagens de Script: Caso de Estudo Lua](https://reader033.fdocuments.net/reader033/viewer/2022052602/5599b5ba1a28abe80b8b4808/html5/thumbnails/12.jpg)
Eficiência modesta
● Eficiência não é um requisito essencial em linguagens de script.
● Contudo, o script será apenas parte de um grande sistema,
● Dificilmente, um sistema será todo desenvolvido em uma linguagem de script
● Veja o comparativo das linguagens quanto a velocidade, observem a colocação das linguagens de script.○ http://shootout.alioth.debian.org/u32/which-programming-languages-are-fastest.php
![Page 13: Linguagens de Script: Caso de Estudo Lua](https://reader033.fdocuments.net/reader033/viewer/2022052602/5599b5ba1a28abe80b8b4808/html5/thumbnails/13.jpg)
Eficiência modesta
● Eficiência não é um requisito essencial em linguagens de script.
● Contudo, o script será apenas parte de um grande sistema,
● Dificilmente, um sistema será todo desenvolvido em uma linguagem de script
● Veja o comparativo das linguagens quanto a velocidade, observem a colocação das linguagens de script.○ http://shootout.alioth.debian.org/u32/which-programming-languages-are-fastest.php
Por que estas linguagens não são
tão eficientes ?
![Page 14: Linguagens de Script: Caso de Estudo Lua](https://reader033.fdocuments.net/reader033/viewer/2022052602/5599b5ba1a28abe80b8b4808/html5/thumbnails/14.jpg)
Funções de alto nível
● Como, são de uso específicos, elas teram funções de alto nível que tem como objetivo facilitar o seu uso.
![Page 15: Linguagens de Script: Caso de Estudo Lua](https://reader033.fdocuments.net/reader033/viewer/2022052602/5599b5ba1a28abe80b8b4808/html5/thumbnails/15.jpg)
Conceitos chaves
Linguagens de script são similares a linguagens imperativas:
![Page 16: Linguagens de Script: Caso de Estudo Lua](https://reader033.fdocuments.net/reader033/viewer/2022052602/5599b5ba1a28abe80b8b4808/html5/thumbnails/16.jpg)
Conceitos chaves
Linguagens de script são similares a linguagens imperativas:● Variaveis, que mudam de valor● Comandos, ● Procedimentos, com efeitos colaterais
![Page 17: Linguagens de Script: Caso de Estudo Lua](https://reader033.fdocuments.net/reader033/viewer/2022052602/5599b5ba1a28abe80b8b4808/html5/thumbnails/17.jpg)
Conceitos chaves
Podemos destacar algumas caracteristicas específicas:
● processamento de strings em alto nivel● suport a interface gráfica em alto nível● dinamicamente tipadas
![Page 18: Linguagens de Script: Caso de Estudo Lua](https://reader033.fdocuments.net/reader033/viewer/2022052602/5599b5ba1a28abe80b8b4808/html5/thumbnails/18.jpg)
Caso de estudo: Lua
GUIA ESSENCIAL: Principais Conceitos
![Page 19: Linguagens de Script: Caso de Estudo Lua](https://reader033.fdocuments.net/reader033/viewer/2022052602/5599b5ba1a28abe80b8b4808/html5/thumbnails/19.jpg)
Lua
● Desenvolvida na PUC-Rio desde 1993● Início modesto, para uso interno expansão
lenta e gradual● "Comitê" de três pessoas: Roberto
Ierusalimschy, Luiz H. de Figueiredo, Waldemar Celes
● Lua, é usado em jogos, tv interativa (nclLua), modelos dinamicos (terrame-inpe) ...
![Page 20: Linguagens de Script: Caso de Estudo Lua](https://reader033.fdocuments.net/reader033/viewer/2022052602/5599b5ba1a28abe80b8b4808/html5/thumbnails/20.jpg)
Uma das linguagens mais usadas
Neste mês teve uma queda. No mês anterior ela estava a frente de Ruby, JavaScript, Delphi
http://www.tiobe.com/index.php/content/paperinfo/tpci/index.html
![Page 21: Linguagens de Script: Caso de Estudo Lua](https://reader033.fdocuments.net/reader033/viewer/2022052602/5599b5ba1a28abe80b8b4808/html5/thumbnails/21.jpg)
Mais eficiente que suas "concorrentes"
http://shootout.alioth.debian.org/u32/which-programming-languages-are-fastest.php
![Page 22: Linguagens de Script: Caso de Estudo Lua](https://reader033.fdocuments.net/reader033/viewer/2022052602/5599b5ba1a28abe80b8b4808/html5/thumbnails/22.jpg)
Lua
● Linguagem de script○ similariedade com Perl, Python, Tcl
● Uma linguagem de extensão○ ênfase em comunicação inter-linguagens○ enfatiza desenvolvimento em múltiplas linguagens
● Uma linguagem de descrição de dados○ anterior a XML
![Page 23: Linguagens de Script: Caso de Estudo Lua](https://reader033.fdocuments.net/reader033/viewer/2022052602/5599b5ba1a28abe80b8b4808/html5/thumbnails/23.jpg)
XML - Lua - Json
<note><to>Tove</to><from>Jani</fr><heading>Reminder</heading><body>Don't forget me this weekend!</body>
</note>
XML
![Page 24: Linguagens de Script: Caso de Estudo Lua](https://reader033.fdocuments.net/reader033/viewer/2022052602/5599b5ba1a28abe80b8b4808/html5/thumbnails/24.jpg)
XML - Lua - Json
<note><to>Tove</to><from>Jani</fr><heading>Reminder</heading><body>Don't forget me this weekend!</body>
</note>
note{to = "Tove",from= "Jani",heading ="Reminder",body="Don't forget me this weekend!"
}
XML
Lua
![Page 25: Linguagens de Script: Caso de Estudo Lua](https://reader033.fdocuments.net/reader033/viewer/2022052602/5599b5ba1a28abe80b8b4808/html5/thumbnails/25.jpg)
XML - Lua - Json
<note><to>Tove</to><from>Jani</fr><heading>Reminder</heading><body>Don't forget me this weekend!</body>
</note>
note{to = "Tove",from= "Jani",heading ="Reminder",body="Don't forget me this weekend!"
}
note{to : "Tove",from : "Jani",heading :"Reminder",body:"Don't forget me this weekend!"
}
XML
Lua
JSON
![Page 26: Linguagens de Script: Caso de Estudo Lua](https://reader033.fdocuments.net/reader033/viewer/2022052602/5599b5ba1a28abe80b8b4808/html5/thumbnails/26.jpg)
Lua em Jogos
"It is easy to see why Lua is rapidly becoming the de facto standard for game scripting." Artificial Intelligence for Games, Morgan Kaufmann, 2006. "It's quite possible that game developers will look back at the 2000s as the decade of Lua".,
Game Programming Gems 5, Charles River Media, 2005.
![Page 27: Linguagens de Script: Caso de Estudo Lua](https://reader033.fdocuments.net/reader033/viewer/2022052602/5599b5ba1a28abe80b8b4808/html5/thumbnails/27.jpg)
![Page 28: Linguagens de Script: Caso de Estudo Lua](https://reader033.fdocuments.net/reader033/viewer/2022052602/5599b5ba1a28abe80b8b4808/html5/thumbnails/28.jpg)
![Page 29: Linguagens de Script: Caso de Estudo Lua](https://reader033.fdocuments.net/reader033/viewer/2022052602/5599b5ba1a28abe80b8b4808/html5/thumbnails/29.jpg)
![Page 30: Linguagens de Script: Caso de Estudo Lua](https://reader033.fdocuments.net/reader033/viewer/2022052602/5599b5ba1a28abe80b8b4808/html5/thumbnails/30.jpg)
![Page 31: Linguagens de Script: Caso de Estudo Lua](https://reader033.fdocuments.net/reader033/viewer/2022052602/5599b5ba1a28abe80b8b4808/html5/thumbnails/31.jpg)
Lua:Aplicações
● Ginga○ middleware padrão brasileiro para TV digital
● Wireshark○ analisador de protocolos
● Snort○ intrusion detection and prevention system
![Page 32: Linguagens de Script: Caso de Estudo Lua](https://reader033.fdocuments.net/reader033/viewer/2022052602/5599b5ba1a28abe80b8b4808/html5/thumbnails/32.jpg)
Lua: Aplicações
● TerraME○ Ambiente de modelagem dinâmica (INPE),
● nmap○ rastreador de redes para segurança
● Eyeon's Digital Fusion○ pós-produção de filmes
● E muitas outras...
![Page 33: Linguagens de Script: Caso de Estudo Lua](https://reader033.fdocuments.net/reader033/viewer/2022052602/5599b5ba1a28abe80b8b4808/html5/thumbnails/33.jpg)
Lua: vantagens
● Portabilidade○ No contexto que foi proposto, não havia outra
linguagem que rodasse no unix, windows, linux ...● Simplicidade
○ sintaxe simples● Pequeno tamanho
○ Ainda é muito pequenas, bibliotecas e includes não ultrapassa 700 kb.
![Page 34: Linguagens de Script: Caso de Estudo Lua](https://reader033.fdocuments.net/reader033/viewer/2022052602/5599b5ba1a28abe80b8b4808/html5/thumbnails/34.jpg)
Lua: vantagens
● Acoplabilidade○ Facil integração com C, deste modo com diversas
linguagens.○ C, é o ingles das linguagens de programação ..
● "Eficiência",○ ainda é uma das mais eficientes linguagens
dinamicas e de scripts
![Page 35: Linguagens de Script: Caso de Estudo Lua](https://reader033.fdocuments.net/reader033/viewer/2022052602/5599b5ba1a28abe80b8b4808/html5/thumbnails/35.jpg)
Lua: Sintaxe
● Sintaxe com inspiração no Pascal● O uso de ; é opcional
function fact (n) local f = 1for i =1, n do
f = f * iendreturn f
end
![Page 36: Linguagens de Script: Caso de Estudo Lua](https://reader033.fdocuments.net/reader033/viewer/2022052602/5599b5ba1a28abe80b8b4808/html5/thumbnails/36.jpg)
Lua: Comentários
● Comentarios em linha-- este é um comentario
● Comentario em bloco--[[
este éum comentario
--]]
![Page 37: Linguagens de Script: Caso de Estudo Lua](https://reader033.fdocuments.net/reader033/viewer/2022052602/5599b5ba1a28abe80b8b4808/html5/thumbnails/37.jpg)
Lua: usando
● Linguagem interpretada● Não existe o conceito de função principal● Meu primeiro programa
Ouprint ( "hello world" )
function ola ()print ( "hello world" )
endola() -- chamando a função
![Page 38: Linguagens de Script: Caso de Estudo Lua](https://reader033.fdocuments.net/reader033/viewer/2022052602/5599b5ba1a28abe80b8b4808/html5/thumbnails/38.jpg)
Lua: usando
● Linguagem interpretada● Não existe o conceito de função principal● Meu primeiro programa
Ouprint ( "hello world" )
function ola ()print ( "hello world" )
endola() -- chamando a função
Salve estes programas em um arquivo primeiro.lua e execute-o:
> lua primeiro.lua
![Page 39: Linguagens de Script: Caso de Estudo Lua](https://reader033.fdocuments.net/reader033/viewer/2022052602/5599b5ba1a28abe80b8b4808/html5/thumbnails/39.jpg)
Lua: Usando
Usando no modo iterativo:
sh> lua> print ( "ola mundo !!" )> print (10+9)
![Page 40: Linguagens de Script: Caso de Estudo Lua](https://reader033.fdocuments.net/reader033/viewer/2022052602/5599b5ba1a28abe80b8b4808/html5/thumbnails/40.jpg)
Lua: Atribuições
Em Lua, podemos fazer atribuições multiplas:
a = 10b = 20a, b = b, a
![Page 41: Linguagens de Script: Caso de Estudo Lua](https://reader033.fdocuments.net/reader033/viewer/2022052602/5599b5ba1a28abe80b8b4808/html5/thumbnails/41.jpg)
Lua: Sistema de tipos
● Linguagem dinamicamente tipada● Escopo e amarração de variáveis
○ Tudo é global, até que se prove o contrário● Tipos de dados
○ nil, boolean, number, string, table, function, userdata● Funções como valores de primeira ordem
○ Parametros e retorno de funções, tem a mesmos previlegios dos outros tipos
![Page 42: Linguagens de Script: Caso de Estudo Lua](https://reader033.fdocuments.net/reader033/viewer/2022052602/5599b5ba1a28abe80b8b4808/html5/thumbnails/42.jpg)
Lua: Sistema de tipos
Como os tipos variam durante a execução, lua fornece uma função que retorna o tipo de uma variavel:
print (type (a))a = 1234print (type (a))a = "ola"print (type (a))
Quais serão as saídas ?
![Page 43: Linguagens de Script: Caso de Estudo Lua](https://reader033.fdocuments.net/reader033/viewer/2022052602/5599b5ba1a28abe80b8b4808/html5/thumbnails/43.jpg)
Lua: tipos de dados
● nil● number● string● function● userdata● table
![Page 44: Linguagens de Script: Caso de Estudo Lua](https://reader033.fdocuments.net/reader033/viewer/2022052602/5599b5ba1a28abe80b8b4808/html5/thumbnails/44.jpg)
Tipo nil
● Representa o valor indefinido ou inexistente.
● Tipo do valor default das variáveis
● Também significa o falso booleano○ Qualquer valor de outro tipo significa verdadeiro
■ Com exceção de false
![Page 45: Linguagens de Script: Caso de Estudo Lua](https://reader033.fdocuments.net/reader033/viewer/2022052602/5599b5ba1a28abe80b8b4808/html5/thumbnails/45.jpg)
Tipo boolean
● Valor booleano○ Falso (false) ou verdadeiro (true)
if (choveu == true) then ....
● Operadores relacionais booleanos==, ~=, <, >, <=, >=
![Page 46: Linguagens de Script: Caso de Estudo Lua](https://reader033.fdocuments.net/reader033/viewer/2022052602/5599b5ba1a28abe80b8b4808/html5/thumbnails/46.jpg)
Tipo number
Único tipo nativo para valores numéricosdouble (por default)
a = 3b = 3.5c = 4.5e-8
![Page 47: Linguagens de Script: Caso de Estudo Lua](https://reader033.fdocuments.net/reader033/viewer/2022052602/5599b5ba1a28abe80b8b4808/html5/thumbnails/47.jpg)
Tipo string
● Valores imutáveis○ Não é um vetor de caracteres, não tem como
modificar uma dada posição● Sem limite de tamanho
○ É comum ler arquivo completo em uma string○ Similar ao Haskell
● Strings não usam \0 para terminação● Podem armazenar dados binários quaisquer● Pattern-matching poderoso
○ Implementado via biblioteca padrão
![Page 48: Linguagens de Script: Caso de Estudo Lua](https://reader033.fdocuments.net/reader033/viewer/2022052602/5599b5ba1a28abe80b8b4808/html5/thumbnails/48.jpg)
Tipo String
Exemplo:
a = "ola"b = "mundo"c = a.." "..b -- o .. é usado para concatenarprint (c)
![Page 49: Linguagens de Script: Caso de Estudo Lua](https://reader033.fdocuments.net/reader033/viewer/2022052602/5599b5ba1a28abe80b8b4808/html5/thumbnails/49.jpg)
Tipo function
Duas notações:
function inc (x) return x+1
end
inc = function (x) return x+1
end
![Page 50: Linguagens de Script: Caso de Estudo Lua](https://reader033.fdocuments.net/reader033/viewer/2022052602/5599b5ba1a28abe80b8b4808/html5/thumbnails/50.jpg)
Tipo function
Valores de primeira classe
function twice (f, a)return f (f (a))
end
function dobra (a)return 2* aend
print (twice (dobra, 4))
w = {redraw = function () ...end,pick = function (x,y) ...end,}
![Page 51: Linguagens de Script: Caso de Estudo Lua](https://reader033.fdocuments.net/reader033/viewer/2022052602/5599b5ba1a28abe80b8b4808/html5/thumbnails/51.jpg)
Tipo function
Retorno multiplos
function f (a,b)return 2*a, 2*b
end
print ( f(4,5))
![Page 52: Linguagens de Script: Caso de Estudo Lua](https://reader033.fdocuments.net/reader033/viewer/2022052602/5599b5ba1a28abe80b8b4808/html5/thumbnails/52.jpg)
Tipo function
Passando multiplos parametros:
function f(...)for i=1, #arg do
print(arg[i])end
end
f (5,7,8)
![Page 53: Linguagens de Script: Caso de Estudo Lua](https://reader033.fdocuments.net/reader033/viewer/2022052602/5599b5ba1a28abe80b8b4808/html5/thumbnails/53.jpg)
Tipo function
Funções anônimas, suporte a notação lambda
a = twice (2, function (x) return 2*x end)print (a)
![Page 54: Linguagens de Script: Caso de Estudo Lua](https://reader033.fdocuments.net/reader033/viewer/2022052602/5599b5ba1a28abe80b8b4808/html5/thumbnails/54.jpg)
Amarração
● Tudo é global até que prove o contrário● Importante, sempre declare como local suas
variaveis dentro das funções
function f1 ()local a = 1;
end
f1()print (a)
![Page 55: Linguagens de Script: Caso de Estudo Lua](https://reader033.fdocuments.net/reader033/viewer/2022052602/5599b5ba1a28abe80b8b4808/html5/thumbnails/55.jpg)
Amarração
● Tudo é global até que prove o contrário● Importante, sempre declare como local suas
variaveis dentro das funções
function f1 ()local a = 1;
end
f1()print (a)
Rode este código com e sem a palavra reservada "local"
![Page 56: Linguagens de Script: Caso de Estudo Lua](https://reader033.fdocuments.net/reader033/viewer/2022052602/5599b5ba1a28abe80b8b4808/html5/thumbnails/56.jpg)
Amarração
● Acesso a variáveis em escopos externos○ Closures
● Expressão cujo valor é calculado quando a função que a contém é criada○ Quando o fecho é feito
function add (x)return function (y)
return y+xend
end
add1 = add(1)print(add1(10)) --> 11
![Page 57: Linguagens de Script: Caso de Estudo Lua](https://reader033.fdocuments.net/reader033/viewer/2022052602/5599b5ba1a28abe80b8b4808/html5/thumbnails/57.jpg)
Tipo userdata
● Armazena um ponteiro void* de C● Tipo opaco para a linguagem
○ Somente atribuição e teste de igualdade● Linguagem extensível em C
○ Esqueleto para construção de linguagens de domínio específico
![Page 58: Linguagens de Script: Caso de Estudo Lua](https://reader033.fdocuments.net/reader033/viewer/2022052602/5599b5ba1a28abe80b8b4808/html5/thumbnails/58.jpg)
Tipo table
● Resultado da expressão {}● Arrays associativos● Qualquer valor com chave● Único mecanismo de estruturação de dados
○ É para Lua o que lista é para Lisp
![Page 59: Linguagens de Script: Caso de Estudo Lua](https://reader033.fdocuments.net/reader033/viewer/2022052602/5599b5ba1a28abe80b8b4808/html5/thumbnails/59.jpg)
Tipo table
The only structured data type is table. I implements associative arrays, that is, arrays that can be indexed not only with integers, but with string, double, table, or function values.
For table indexing, both table.name and table[''name''] are acceptable. Tables can be used to implement records, arrays, and recursive data types.
![Page 60: Linguagens de Script: Caso de Estudo Lua](https://reader033.fdocuments.net/reader033/viewer/2022052602/5599b5ba1a28abe80b8b4808/html5/thumbnails/60.jpg)
Tipo table
Como vetores, o primeiro indice é 1v = {2,3,5,6}print (v[1], v[2])
Matrizes, tabela de tabela
m = { {1,2,3},{4,5,6}}print (m[2][2])
![Page 61: Linguagens de Script: Caso de Estudo Lua](https://reader033.fdocuments.net/reader033/viewer/2022052602/5599b5ba1a28abe80b8b4808/html5/thumbnails/61.jpg)
Tipo table
● Pode ser indexada por diferentes tipos, não somente inteiros
● Estrutura de dados registros ou tipos cartesianos
● Acessando dado, notação "sugar"
t.x para t["x"]:
![Page 62: Linguagens de Script: Caso de Estudo Lua](https://reader033.fdocuments.net/reader033/viewer/2022052602/5599b5ba1a28abe80b8b4808/html5/thumbnails/62.jpg)
pessoa = {Nome = Joao ,Idade = 20,Telefone = 66666666
}
print (pessoa.Nome)print (pessoa[Nome])
Tipo table
![Page 63: Linguagens de Script: Caso de Estudo Lua](https://reader033.fdocuments.net/reader033/viewer/2022052602/5599b5ba1a28abe80b8b4808/html5/thumbnails/63.jpg)
Tipo table
Descrição de dados + semântica imperativa
article{author="F.P.Brooks",title="The Mythical Man-Month",year=1975
}
temp = {}temp["author"] = "F.P.Brooks"temp["title"] = "The Mythical Man-Month"temp["year"] = 1975article(temp)
Unico construtor
![Page 64: Linguagens de Script: Caso de Estudo Lua](https://reader033.fdocuments.net/reader033/viewer/2022052602/5599b5ba1a28abe80b8b4808/html5/thumbnails/64.jpg)
Tipo table
● Duas maneiras de percorrer tabelas○ table.foreach será removida de versões futuras.
t = {4,5,6,7,8}
for i,v in pairs (t) do print (i,v) end
table.foreach (t, function (i,v) print (i,v) end)
![Page 65: Linguagens de Script: Caso de Estudo Lua](https://reader033.fdocuments.net/reader033/viewer/2022052602/5599b5ba1a28abe80b8b4808/html5/thumbnails/65.jpg)
Tipo table
Atribuição de tabela é sempre referencia, similar a Java ,JavaScript ... :
a = {"joão"}b=aprint (a[1], b[1])b[1] = "Maria"print (a[1], b[1])
![Page 66: Linguagens de Script: Caso de Estudo Lua](https://reader033.fdocuments.net/reader033/viewer/2022052602/5599b5ba1a28abe80b8b4808/html5/thumbnails/66.jpg)
Tipo table
● Funções 1a classe + tabelas = quase OO○ Tabelas podem ter funções como campos
p = {x = 10, y = 20} -- dados-- cria uma função na tabela "p"function p.getX (self)
print (self.x)end-- chama a função da tabela "p"p.getX(p)
![Page 67: Linguagens de Script: Caso de Estudo Lua](https://reader033.fdocuments.net/reader033/viewer/2022052602/5599b5ba1a28abe80b8b4808/html5/thumbnails/67.jpg)
Tipo table
● Funções 1a classe + tabelas = quase OO○ Tabelas podem ter funções como campos
● "Sugar notation"
p = {x = 10, y = 20}function p:getX ()
// nao precisa passar explicito selfprint (self.x)
end// nao precisa passar "p"p:getX()
![Page 68: Linguagens de Script: Caso de Estudo Lua](https://reader033.fdocuments.net/reader033/viewer/2022052602/5599b5ba1a28abe80b8b4808/html5/thumbnails/68.jpg)
Tipo table
Existem diversas funções úteis (olhar manual):
t = {2,3,4,5}table.getn (t) -- retorna o tamanho da tabela#t -- ao inves de getn, podemos usar o operador "#"table.insert (t, 10)table.remove (t) -- equivalente ao pop, remove o ultimo ...
![Page 69: Linguagens de Script: Caso de Estudo Lua](https://reader033.fdocuments.net/reader033/viewer/2022052602/5599b5ba1a28abe80b8b4808/html5/thumbnails/69.jpg)
Construtores
Simulando POO
person = {};person.name = "Nicholas";person.age = 29;person.job = "Software Engineer";
function person:sayName () print(self.name);end
person:sayName()
![Page 70: Linguagens de Script: Caso de Estudo Lua](https://reader033.fdocuments.net/reader033/viewer/2022052602/5599b5ba1a28abe80b8b4808/html5/thumbnails/70.jpg)
Construtores
Simulando POO
person = {};person.name = "Nicholas";person.age = 29;person.job = "Software Engineer";
function person:sayName () print(self.name);end
person:sayName()
Sempre que criar um novo "person", terei que escrever a função sayName?
![Page 71: Linguagens de Script: Caso de Estudo Lua](https://reader033.fdocuments.net/reader033/viewer/2022052602/5599b5ba1a28abe80b8b4808/html5/thumbnails/71.jpg)
Construtores
Simulando POO
person = {};person.name = "Nicholas";person.age = 29;person.job = "Software Engineer";
function person:sayName () print(self.name);end
person:sayName()
Sempre que criar um novo "person", terei que escrever a função sayName?
Qual a solução ?
![Page 72: Linguagens de Script: Caso de Estudo Lua](https://reader033.fdocuments.net/reader033/viewer/2022052602/5599b5ba1a28abe80b8b4808/html5/thumbnails/72.jpg)
Construtores
function Person(name, age, job)local self = {}self.name = name;self.age = age;self.job = job;self.sayName = function()
print(self.name);endreturn self
end
person1 = Person("Nicholas", 29, "Software Engineer");person2 = Person("Greg", 27, "Doctor");person1:sayName ()person2:sayName ()
![Page 73: Linguagens de Script: Caso de Estudo Lua](https://reader033.fdocuments.net/reader033/viewer/2022052602/5599b5ba1a28abe80b8b4808/html5/thumbnails/73.jpg)
Construtores
function Person(name, age, job)local self = {}self.name = name;self.age = age;self.job = job;self.sayName = function()
print(self.name);endreturn self
end
person1 = Person("Nicholas", 29, "Software Engineer");person2 = Person("Greg", 27, "Doctor");person1:sayName ()person2:sayName ()
Qual o problema desta solução ?
![Page 74: Linguagens de Script: Caso de Estudo Lua](https://reader033.fdocuments.net/reader033/viewer/2022052602/5599b5ba1a28abe80b8b4808/html5/thumbnails/74.jpg)
Construtores
function Person(name, age, job)local self = {}self.name = name;self.age = age;self.job = job;self.sayName = function()
print(self.name);endreturn self
end
person1 = Person("Nicholas", 29, "Software Engineer");person2 = Person("Greg", 27, "Doctor");person1:sayName ()person2:sayName ()
Qual o problema desta solução ?
Como resolver ?
![Page 75: Linguagens de Script: Caso de Estudo Lua](https://reader033.fdocuments.net/reader033/viewer/2022052602/5599b5ba1a28abe80b8b4808/html5/thumbnails/75.jpg)
Construtores
● Solução: metatabelas, conceito "prototype", presente em diversas outras linguagens
● Conceito chave: separar os metodos em uma tabela distinta, de modo a ter replicas destes metodos na memoria.
![Page 76: Linguagens de Script: Caso de Estudo Lua](https://reader033.fdocuments.net/reader033/viewer/2022052602/5599b5ba1a28abe80b8b4808/html5/thumbnails/76.jpg)
Construtores: Metatabela
Separando metodos dos dados:
person_methods = {sayName = function (self) print (self.name) end
}
function Person(name, age, job)local self = {}self.name = name;self.age = age;self.job = job;
setmetatable(self, {__index = person_methods} )return self
end
person2 = Person("Greg", 27, "Doctor");person2:sayName ()
Estou dizendo para a linguagem procurar nos indices (__index) de outra tabela,:
![Page 77: Linguagens de Script: Caso de Estudo Lua](https://reader033.fdocuments.net/reader033/viewer/2022052602/5599b5ba1a28abe80b8b4808/html5/thumbnails/77.jpg)
Sobrecarga de operadores
local Point_metatable = {__add = function (p1,p2) return Point(p1.x+p2.x,p1.y+p2.y) end}-- Construtorfunction Point (p1,p2)
local self = {}self.x = tonumber(p1) or 0.0self.y = tonumber(p2) or 0.0setmetatable(self,Point_metatable)return self
end
local r = Point (3,4) + Point (5,2)print (r.x, r.y)
Estou dizendo como ele faz a soma, _add
![Page 78: Linguagens de Script: Caso de Estudo Lua](https://reader033.fdocuments.net/reader033/viewer/2022052602/5599b5ba1a28abe80b8b4808/html5/thumbnails/78.jpg)
Controle de fluxo
if (10 > 5) thenprint ("10>5")
elseprint ("algo de muito errado")
end
i = 0while (i < 10) do
print ("i", i)i = i + 1
end
for i = 0, 10 doprint ("i",i)
end
![Page 79: Linguagens de Script: Caso de Estudo Lua](https://reader033.fdocuments.net/reader033/viewer/2022052602/5599b5ba1a28abe80b8b4808/html5/thumbnails/79.jpg)
Programação modular
Que estrutura é usada para modularizar ?
![Page 80: Linguagens de Script: Caso de Estudo Lua](https://reader033.fdocuments.net/reader033/viewer/2022052602/5599b5ba1a28abe80b8b4808/html5/thumbnails/80.jpg)
Programação modular
Que estrutura é usada para modularizar ?
TABELAS, logicamente, :)
![Page 81: Linguagens de Script: Caso de Estudo Lua](https://reader033.fdocuments.net/reader033/viewer/2022052602/5599b5ba1a28abe80b8b4808/html5/thumbnails/81.jpg)
Programação modular
● Lua utiliza a combinação de tabelas com funções de primeira classe para construção de módulos.○ As bibliotecas padrão de Lua são implementadas
como módulos via tabelas.● Exemplo
mod1 = {}function mod1.ola()
print ("Ola, modulo")end
mod1.lua
require "mod1"mod1.ola()
main.lua
![Page 82: Linguagens de Script: Caso de Estudo Lua](https://reader033.fdocuments.net/reader033/viewer/2022052602/5599b5ba1a28abe80b8b4808/html5/thumbnails/82.jpg)
Usando a API C
● Para usar a API C do Lua, basta baixar a versão de biblioteca referente ao seu sistema (Linux, Windows, 32bit, 64bits ....)● http://sourceforge.
net/projects/luabinaries/files/5.1.4/
![Page 83: Linguagens de Script: Caso de Estudo Lua](https://reader033.fdocuments.net/reader033/viewer/2022052602/5599b5ba1a28abe80b8b4808/html5/thumbnails/83.jpg)
Entendendo a API
● Não tenho como objetivo ensinar esta API, apenas mostrar o mecanismo de integração de uma linguagem de script.● O mecanismo irá variar de linguagem para
linguagem.● Esta API é relativamente simples,
![Page 84: Linguagens de Script: Caso de Estudo Lua](https://reader033.fdocuments.net/reader033/viewer/2022052602/5599b5ba1a28abe80b8b4808/html5/thumbnails/84.jpg)
Conceitos chave
● Carregue o arquivo Lua na memoria.● Consulte valores da memoria, e coloque
os na pilha.● Retire os valores da pilha e traga-os para
variaveis do C.
![Page 85: Linguagens de Script: Caso de Estudo Lua](https://reader033.fdocuments.net/reader033/viewer/2022052602/5599b5ba1a28abe80b8b4808/html5/thumbnails/85.jpg)
Considere o seguinte arquivo
width = 200height = 300
config.lua
![Page 86: Linguagens de Script: Caso de Estudo Lua](https://reader033.fdocuments.net/reader033/viewer/2022052602/5599b5ba1a28abe80b8b4808/html5/thumbnails/86.jpg)
Função para ler o arquivo void load (char *filename, int *width, int *height) { lua_State *L = luaL_newstate (); luaL_openlibs(L); /* opens Lua */
// carrega o arquivo if (luaL_loadfile(L, filename) || lua_pcall(L, 0, 0, 0)) error(L, "cannot run configuration file: %s”, lua_tostring(L, -1)); // consulta valores, e coloca na pilha lua_getglobal(L, "width"); lua_getglobal(L, "height"); // verifica, e pega o valores da pilha if (!lua_isnumber(L, -2)) error(L, "`width' should be a number\n"); if (!lua_isnumber(L, -1)) error(L, "`height' should be a number\n"); *width = (int)lua_tonumber(L, -2); *height = (int)lua_tonumber(L, -1); lua_close(L); }
![Page 87: Linguagens de Script: Caso de Estudo Lua](https://reader033.fdocuments.net/reader033/viewer/2022052602/5599b5ba1a28abe80b8b4808/html5/thumbnails/87.jpg)
A função principal ...
int main () { int w, h; load("./config.lua", &w, &h); printf ("%d - %d \n", w,h);
}
Função definida anteriormente
Nome do Arquivo
![Page 88: Linguagens de Script: Caso de Estudo Lua](https://reader033.fdocuments.net/reader033/viewer/2022052602/5599b5ba1a28abe80b8b4808/html5/thumbnails/88.jpg)
A função principal ...
int main () { int w, h; load("./config.lua", &w, &h); printf ("%d - %d \n", w,h);
}
Função definida anteriormente
Nome do Arquivo
Lembrem-se que em Lua o arquivo de configuração não precisa ser
tão simples
![Page 89: Linguagens de Script: Caso de Estudo Lua](https://reader033.fdocuments.net/reader033/viewer/2022052602/5599b5ba1a28abe80b8b4808/html5/thumbnails/89.jpg)
Chamando funções
Considerem o seguinte arquivo config.lua
function soma (a, b)return a+b
end
![Page 90: Linguagens de Script: Caso de Estudo Lua](https://reader033.fdocuments.net/reader033/viewer/2022052602/5599b5ba1a28abe80b8b4808/html5/thumbnails/90.jpg)
Chamando funções
Dado um estado do arquivo lua, poderiamos carrega-la:
int soma (lua_State *L, int a, int b) { int res;
lua_getglobal(L, "soma"); lua_pushinteger (L, a); lua_pushinteger (L, b);
if (lua_pcall (L, 2, 1, 0) != 0 ) printf ("erro\n"); res = lua_tointeger (L,-1); return res; }
![Page 91: Linguagens de Script: Caso de Estudo Lua](https://reader033.fdocuments.net/reader033/viewer/2022052602/5599b5ba1a28abe80b8b4808/html5/thumbnails/91.jpg)
Chamando funções
A função main, ficaria:
int main () { int r; lua_State *L = luaL_newstate (); luaL_openlibs(L); /* opens Lua */
if (luaL_loadfile(L, "./config.lua") || lua_pcall(L, 0, 0, 0)) error(L, "cannot run configuration file: %s",lua_tostring(L, -1)); r = soma(L, 10, 20); printf ("%d\n", r); lua_close(L);
}
![Page 92: Linguagens de Script: Caso de Estudo Lua](https://reader033.fdocuments.net/reader033/viewer/2022052602/5599b5ba1a28abe80b8b4808/html5/thumbnails/92.jpg)
Chamando funções
A função main, ficaria:
int main () { int r; lua_State *L = luaL_newstate (); luaL_openlibs(L); /* opens Lua */
if (luaL_loadfile(L, "./config.lua") || lua_pcall(L, 0, 0, 0)) error(L, "cannot run configuration file: %s",lua_tostring(L, -1)); r = soma(L, 10, 20); printf ("%d\n", r); lua_close(L);
}
Saber mais sobre a API, acesse:
Conceitos Básicos e API C
![Page 93: Linguagens de Script: Caso de Estudo Lua](https://reader033.fdocuments.net/reader033/viewer/2022052602/5599b5ba1a28abe80b8b4808/html5/thumbnails/93.jpg)
Saber Mais ....
lua.org