Upload
hakhuong
View
217
Download
0
Embed Size (px)
Citation preview
1
Linguagens de Programacão [email protected] 1
Lua Lua –– Parte IParte I
Linguagens de Programacão [email protected] 2
OverviewOverview
Linguagem pequenaLinguagem pequena;;
SintaxeSintaxe simples e simples e claraclara;;
Grande Grande poderpoder de de descriçãodescrição de dados;de dados;
Gerenciamento automáticoGerenciamento automático de de memóriamemória;;
Execução controladaExecução controlada;;
Tipagem Tipagem dinâmica.dinâmica.
2
Linguagens de Programacão [email protected] 3
Linguagens de ExtensãoLinguagens de ExtensãoLPs de extensão (scripting languages) são LPs LPs de extensão (scripting languages) são LPs utilizadas para conectar ou configurar componentes utilizadas para conectar ou configurar componentes de um sistema, geralmente em tempo de execução de um sistema, geralmente em tempo de execução
usam interpretadores.usam interpretadores.
Assumem portanto a existência de componentes Assumem portanto a existência de componentes desenvolvidos em outras LPs (system programming desenvolvidos em outras LPs (system programming languages).languages).
São menos estruturadas e oferecem um nível maior São menos estruturadas e oferecem um nível maior de abstração e de flexibilidade.de abstração e de flexibilidade.
Exemplos incluem Visual Basic, Perl, Tcl, Javascript Exemplos incluem Visual Basic, Perl, Tcl, Javascript e Lua.e Lua.
Linguagens de Programacão [email protected] 4
Lua Lua -- IntroduçãoIntrodução
Lua é uma linguagem de extensão projetada para ser Lua é uma linguagem de extensão projetada para ser usada como linguagem de configuração, acoplada a usada como linguagem de configuração, acoplada a um programa hospedeiro (escrito na linguagem de um programa hospedeiro (escrito na linguagem de programação C).programação C).
Aplicações em geral podem acoplar códigos em Lua, Aplicações em geral podem acoplar códigos em Lua, permitindo prototipagem rápida e acesso permitindo prototipagem rápida e acesso programável pelo usuário à tecnologia implementada programável pelo usuário à tecnologia implementada pela aplicação.pela aplicação.
3
Linguagens de Programacão [email protected] 5
Lua Lua -- IntroduçãoIntrodução
Um programa Lua é composto por blocos de código Um programa Lua é composto por blocos de código conhecidos como conhecidos como chunkschunks..
Todos os comandos e construções de Lua são Todos os comandos e construções de Lua são executados em um executados em um único ambiente globalúnico ambiente global. .
Este ambiente, que guarda todas as variáveis globais Este ambiente, que guarda todas as variáveis globais e definições de funções, é automaticamente e definições de funções, é automaticamente inicializado quando o interpretador é ativado e inicializado quando o interpretador é ativado e persiste enquanto o interpretador estiver em persiste enquanto o interpretador estiver em execução.execução.
Linguagens de Programacão [email protected] 6
TiposTipos de de LuaLuaNil (Nil (nil)nil)
Booleanos (boolean)Booleanos (boolean)
StringsStrings (string)(string)
NúmerosNúmeros (number)(number)
FunçõesFunções (function)(function)
TabelasTabelas ((table)table)
Corotinas (thread)Corotinas (thread)
Dados do Dados do usuáriousuário ((userdatauserdata))
4
Linguagens de Programacão [email protected] 7
NúmerosNúmeros
NúmerosNúmeros emem Lua são sempre ponto flutuanteLua são sempre ponto flutuanted = 123d = 123
e = 4.2e = 4.2
print( d ) print( d ) 123123
print( d + e ) print( d + e ) 127.2127.2
print( d + t ) print( d + t ) erroerro
Linguagens de Programacão [email protected] 8
StringsStringsPodemPodem ser ser delimitadas pordelimitadas por ‘, “ ‘, “ ouou [[ ]][[ ]]a = "a = "abcabc""
b = 'def' b = 'def'
c = "c = "abc 'substring' abcabc 'substring' abc""
d = d = 'abc'abc ""substringsubstring" " abc'abc'
CaracterCaracter de escape: de escape: \\\\nn quebraquebra de de linhalinha
\\tt tabtab
\\\\ caractercaracter \\
5
Linguagens de Programacão [email protected] 9
Strings com [[ ]]Strings com [[ ]]
PermitePermite strings com strings com quebraquebra de de linhalinhac = [[c = [[textotextoemem duas linhasduas linhas [[[[aninhadoaninhado]] ]]]] ]]
print(c) print(c) textotextoemem duas linhasduas linhas [[[[aninhadoaninhado]]]]
Linguagens de Programacão [email protected] 10
ConcatenaçãoConcatenação de Stringsde Strings
OperadorOperador: : ....e = "e = "abcabc" .. 'def'" .. 'def'
print( e ) print( e ) abcdefabcdef
print( e .. [[print( e .. [[ghighi]] ) ]] ) abcdefghiabcdefghi
6
Linguagens de Programacão [email protected] 11
Conversão ImplícitaConversão ImplícitaLua converte implicitamente números paraLua converte implicitamente números parastrings strings em concatenaçõesem concatenaçõesprint( 'string' .. 10 ) print( 'string' .. 10 ) string10string10print( 4 .. 5.6 ) print( 4 .. 5.6 ) 45.645.6
Lua tentaLua tenta converter converter automaticamenteautomaticamente strings strings para númerospara números emem operações aritméticasoperações aritméticasprint( 10 + '2' ) print( 10 + '2' ) 1212
print( 45 / 'string' )print( 45 / 'string' ) erroerro
Linguagens de Programacão [email protected] 12
UserdataUserdata
O tipo O tipo userdata userdata permite armazenar numa variável de permite armazenar numa variável de Lua um ponteiro qualquer de C.Lua um ponteiro qualquer de C.
Este tipo corresponde ao tipo Este tipo corresponde ao tipo void*void* de C e só pode de C e só pode ser atribuído ou comparado para igualdade a outro ser atribuído ou comparado para igualdade a outro valor de mesmo tipo em Lua.valor de mesmo tipo em Lua.
É útil para programadores que fazem a ligação LuaÉ útil para programadores que fazem a ligação Lua--C, mas não é manipulado por usuários que C, mas não é manipulado por usuários que programam somente em Lua, pois não é possível programam somente em Lua, pois não é possível criar dados deste tipo diretamente em Lua.criar dados deste tipo diretamente em Lua.
7
Linguagens de Programacão [email protected] 13
TabelasTabelas
O O tipotipo table table ((tabelatabela) é o ) é o tipo mais expressivo da tipo mais expressivo da linguagemlinguagem LuaLua. .
Este tipo implementa os chamados vetores Este tipo implementa os chamados vetores associativosassociativos, , que permitem indexação por valoresque permitem indexação por valores de de qualquer outro tipoqualquer outro tipo, com , com exceçãoexceção do do tipotipo nilnil..
MapeamentoMapeamento de valor de valor valor (valor (domíniodomínio finitofinito).).
Campos Campos não incializados têmnão incializados têm valor valor nil.nil.
Delimitadas porDelimitadas por { }.{ }.
Linguagens de Programacão [email protected] 14
ExemplosExemplos
tabelatabela = {} = {} ---- cria uma tabelacria uma tabelatabelatabela[2] = [2] = 'abc'abc‘‘tabelatabela['string ['string qualquer'qualquer'] = 'valor‘] = 'valor‘print( print( tabelatabela[2] ) [2] ) abcabcprint( print( tabelatabela ) ) table: 10007c28table: 10007c28
array = {1, 2, 3, 4}array = {1, 2, 3, 4}
8
Linguagens de Programacão [email protected] 15
InicializaçãoInicialização de de TabelasTabelasa = {}a = {}a.campo = 123a.campo = 123a.a.outrooutro = 456= 456a = { campo = 123, a = { campo = 123, outrooutro = 456 }= 456 }print( a.campo ) print( a.campo ) 123123print( a["print( a["outrooutro"] ) "] ) 456456
a = {}a = {}a[1] = ‘a[1] = ‘primeiro’primeiro’a[2] = 4 + 5.6a[2] = 4 + 5.6a = { “a = { “primeiroprimeiro”, 4 + 5.6 }”, 4 + 5.6 }print( a[1] ) print( a[1] ) primeiroprimeiroprint( a[2] ) print( a[2] ) 9.69.6
Linguagens de Programacão [email protected] 16
InicializaçãoInicialização de de TabelasTabelasb = { b = { 'primeiro''primeiro',,
'segundo''segundo';;funcaofuncao==fatorialfatorial,,tabelatabela = { 34 }}= { 34 }}
print( b[1] )print( b[1] ) primeiroprimeiroprint( b[3] )print( b[3] ) nilnilprint( b.print( b.funcaofuncao(5) )(5) ) 120120print( b.print( b.tabelatabela[1] )[1] ) 3434
9
Linguagens de Programacão [email protected] 17
TabelasTabelas
Campos Campos indexados por indexados por strings strings podem podem ser ser acessados acessados de de duas formas distintasduas formas distintas::tabelatabela.campo = 123.campo = 123print( print( tabelatabela.campo ) .campo ) 123123print( print( tabelatabela['campo'] ) ['campo'] ) 123123
Qualquer tentativaQualquer tentativa de de indexarindexar um valor um valor que que não seja uma tabela geranão seja uma tabela gera um um erroerro..tabelatabela = 34.7= 34.7tabelatabela[3] = 666 [3] = 666 erroerroprint( print( tabelatabela.campo ) .campo ) erroerro
Linguagens de Programacão [email protected] 18
TabelasTabelas
Variáveis contém sempre referências Variáveis contém sempre referências para tabelaspara tabelas..b = b = tabelatabelatabelatabela[3] = 666[3] = 666print( b[3] ) print( b[3] ) 666666print( b ) print( b ) table: 34918table: 34918print( print( tabelatabela ) ) table: 34918table: 34918
10
Linguagens de Programacão [email protected] 19
EstruturasEstruturas de Dadosde Dados
VetoresVetoresvet = {}vet = {}vet[1] = 2.3vet[1] = 2.3vet[2] = 3.45vet[2] = 3.45vet[3] = 5.0vet[3] = 5.0
MatrizesMatrizesvet = { {}, {}, {} }vet = { {}, {}, {} }vet[1][1] = 4vet[1][1] = 4vet[1][2] = 34.5vet[1][2] = 34.5
RecordsRecordsstrut = {}strut = {}strut.campo = valorstrut.campo = valorstrut.strut.outrooutro = 2.3= 2.3
ObjetosObjetosobjobj = {}= {}objobj.atrib1 = 4.atrib1 = 4objobj.met1 = f.met1 = f
Linguagens de Programacão [email protected] 20
BooleanosBooleanos
Introduzido apenas a partir da versão 5.0 de Introduzido apenas a partir da versão 5.0 de Lua.Lua.
Corresponde aos valores Corresponde aos valores truetrue e e false.false.
Tanto Tanto falsefalse quanto quanto nilnil tornam uma tornam uma expressão condicional falsa.expressão condicional falsa.
Qualquer outro valor torna a expressão Qualquer outro valor torna a expressão condicional verdadeira.condicional verdadeira.
11
Linguagens de Programacão [email protected] 21
OperadoresOperadores
OperadoresOperadores relacionais relacionais e e lógicoslógicos::
<, >, <=, >=, ==, ~=<, >, <=, >=, ==, ~=
and, or, notand, or, not
Operadores matemáticosOperadores matemáticos
+, +, --, *, /, ^ (, *, /, ^ (exponenciaçãoexponenciação))
Linguagens de Programacão [email protected] 22
ExemplosExemplos
if not a thenif not a thenprint("print("variavelvariavel a é a é igualigual a nil")a nil")
endendif 2 ~= “2” thenif 2 ~= “2” then
print("print("nãonão fez fez conversão automáticaconversão automática")")endenda = 2a = 2b = “1” + “1”b = “1” + “1”if a == b thenif a == b then
print(“b print(“b contémcontém um um númeronúmero”)”)endend
12
Linguagens de Programacão [email protected] 23
VariáveisVariáveis
Variáveis em Lua não precisam Variáveis em Lua não precisam ser ser declaradasdeclaradas. .
Um Um comando comando de de atribuição funciona como uma atribuição funciona como uma declaração implícitadeclaração implícita, e o , e o tipo da variável tipo da variável é é associado associado ao ao dado dado que ela contémque ela contém ((tipagemtipagem dinâmicadinâmica).).
Identificadores podem conter letrasIdentificadores podem conter letras, , númerosnúmeros e _ , e _ , mas não podem começarmas não podem começar com com númerosnúmeros..
Variáveis não inicializadas têmVariáveis não inicializadas têm valor valor nil:nil:
print( f ) print( f ) nilnil
Linguagens de Programacão [email protected] 24
ExpressõesExpressões
Expressões em Lua podem ter vários Expressões em Lua podem ter vários valoresvalores..
São avaliadas da esquerda paraSão avaliadas da esquerda para a a direitadireita::x, y, z = 1, 1+1, 3x, y, z = 1, 1+1, 3print(x) print(x) 11print(y) print(y) 22x, y = y, x x, y = y, x ---- swapswapprint(x) print(x) 22print(y) print(y) 11
13
Linguagens de Programacão [email protected] 25
Comandos Comandos de de SeleçãoSeleçãoifif
if a ~= if a ~= 'abc''abc' thenthenprint("print("diferentediferente")")
endend
if a ~= if a ~= 'abc''abc' thenthenprint("print("diferentediferente")")
elseelseprint("print("igualigual")")
endend
if a == 1 then ...if a == 1 then ...elseifelseif a == 3 then ...a == 3 then ...elseifelseif a == a == 'abc''abc' then ...then ...endend
Linguagens de Programacão [email protected] 26
ComandosComandos de de RepetiçãoRepetiçãowhile while ee repeatrepeat
cont = 1cont = 1while cont <= 10 dowhile cont <= 10 do
print( cont )print( cont )cont = cont + 1cont = cont + 1
endend
cont = 1cont = 1repeatrepeat
print( cont )print( cont )cont = cont + 1cont = cont + 1
until cont > 10until cont > 10
14
Linguagens de Programacão [email protected] 27
ComandosComandos de de RepetiçãoRepetiçãoforfor
O O comando comando for for pode pode ser ser usado da usado da forma forma tradicionaltradicional::
for cont=1,10,for cont=1,10,11 dodoprint( cont )print( cont )
endend
OuOu comocomo um um iteradoriterador::
table = {x=1, y= 3, z= 5}table = {x=1, y= 3, z= 5}for index,value in pairs(table) dofor index,value in pairs(table) do
print (index..’=‘..value)print (index..’=‘..value)endend
Define o step. Este valor éDefine o step. Este valor éopcional e o default é 1.opcional e o default é 1.
Linguagens de Programacão [email protected] 28
FunçãoFunção nextnext
UmaUma outraoutra forma de forma de percorrerpercorrer umauma tabelatabela LuaLuaé é atravésatravés da funçãoda função especial especial nextnext::
table = {x=1, y= 3, z= 5}table = {x=1, y= 3, z= 5}index,value = next(table)index,value = next(table)while index dowhile index doprint (index..’=‘..value)print (index..’=‘..value)index,value = next(table,index)index,value = next(table,index)
endend
15
Linguagens de Programacão [email protected] 29
FunçõesFunçõesFunções em Lua são definidas através da declaraçãoFunções em Lua são definidas através da declaraçãofunctionfunction::function function farenheitfarenheit( ( celsiuscelsius ))
return 9/5*return 9/5*celsiuscelsius + 32+ 32endend
function function fatorialfatorial( n )( n )if n == 0 then return 1 endif n == 0 then return 1 endreturn n * return n * fatorialfatorial( n( n--1 )1 )
endend
print( print( farenheitfarenheit( 55.67 ) ) ( 55.67 ) ) 132.206132.206
print( print( fatorialfatorial( 10 ) ) ( 10 ) ) 36288003628800
Linguagens de Programacão [email protected] 30
Em Lua funções são valores Em Lua funções são valores de de primeira primeira ordemordem, , podendo podendo ser ser atribuídas atribuídas a a variáveisvariáveis, , passadas como parâmetros ou retornada por passadas como parâmetros ou retornada por funçõesfunções..
Variáveis contém referência paraVariáveis contém referência para as as funçõesfunções..
Funções podem retornar mais Funções podem retornar mais de um valor.de um valor.
Não existe qualquer restrição Não existe qualquer restrição a a recursividaderecursividade..
FunçõesFunções
16
Linguagens de Programacão [email protected] 31
ExemplosExemplosa = function (x,y) return x+y enda = function (x,y) return x+y endprint(a( 5,4 )) print(a( 5,4 )) 99print(a) print(a) function: 10007618function: 10007618
show = printshow = printprint = nilprint = nilshow( soma( 5,4 ) ) show( soma( 5,4 ) ) 99
function function incrementaincrementa( a, b )( a, b )return a+1, b+1return a+1, b+1
endendx, y = x, y = incrementaincrementa( 10, 20 )( 10, 20 )show( x ) show( x ) 1111show( y ) show( y ) 2121
Linguagens de Programacão [email protected] 32
FunçõesFunções
A A passagempassagem de de parâmetrosparâmetros acontece acontece porpor valor. valor.
EntretantoEntretanto, no , no casocaso de de tabelastabelas e e funçõesfunções as as variáveis armazenam sempre referênciasvariáveis armazenam sempre referências. . Logo a Logo a passagem passagem de de parâmetros parâmetros é é equivalente equivalente a a uma passagem por referênciauma passagem por referência..
17
Linguagens de Programacão [email protected] 33
function function mudamuda( x ) ( x ) x=1x=1
endenda = 2a = 2mudamuda( a )( a )print( a ) print( a ) 22
function function mudamuda( tab )( tab )tab.x = 0tab.x = 0
endendtabelatabela = {}= {}tabelatabela.x = 666.x = 666mudamuda( ( tabelatabela ))print( print( tabelatabela.x ) .x ) 00
ExemplosExemplos
Linguagens de Programacão [email protected] 34
EscopoEscopo
Lua apresenta escopo estático.Lua apresenta escopo estático.
O escopo de variáveis iniciaO escopo de variáveis inicia--se no primeiro se no primeiro comando após a sua declaração e termina no comando após a sua declaração e termina no final do bloco no qual foi declarado .final do bloco no qual foi declarado .
Variáveis locais podem ser declaradas dentro Variáveis locais podem ser declaradas dentro de qualquer bloco através da palavra de qualquer bloco através da palavra reservada reservada locallocal. .
18
Linguagens de Programacão [email protected] 35
ExemploExemplox = 10 x = 10 ---- variavel globalvariavel globaldo do ---- novo bloconovo bloco
local x = x local x = x ---- novo `x'novo `x'print(x) print(x) ----> 10> 10x = x+1x = x+1do do ---- outro blocooutro bloco
local x = x+1 local x = x+1 ---- outro `x'outro `x'print(x) print(x) ----> 12> 12
endendprint(x) print(x) ----> 11> 11
endendprint(x) print(x) ----> 10 (x global)> 10 (x global)
Linguagens de Programacão [email protected] 36
Funções BásicasFunções Básicasloadfile(filename)loadfile(filename) –– carrega um arquivo como carrega um arquivo como um bloco de código Lua e, caso não existam erros, um bloco de código Lua e, caso não existam erros, retorna a função correspondente.retorna a função correspondente.
dofile(filename)dofile(filename) -- carrega um arquivo como um carrega um arquivo como um bloco de código Lua e, caso não existam erros, bloco de código Lua e, caso não existam erros, executa este bloco no escopo global.executa este bloco no escopo global.
loadstring (string)loadstring (string) –– compila compila stringstring como se como se fosse fosse um bloco de código Lua e, caso não existam um bloco de código Lua e, caso não existam erros, retorna a função correspondente.erros, retorna a função correspondente.
19
Linguagens de Programacão [email protected] 37
Funções BásicasFunções Básicasprint (o1, o2, ...)print (o1, o2, ...) –– imprime os objetos imprime os objetos o1, o2o1, o2, etc, no , etc, no stdout.stdout.
type(o)type(o) –– retorna um string descrevendo o tipo de retorna um string descrevendo o tipo de oo. Os . Os resultados possíveis são resultados possíveis são "nil" , "number", "string", "boolean, "nil" , "number", "string", "boolean, "table", "function", "thread", e "userdata". "table", "function", "thread", e "userdata". tostring(o)tostring(o) –– tenta transformar um objeto tenta transformar um objeto oo qualquer em qualquer em string.string.
tonumber(o)tonumber(o) –– tenta transformar o objeto tenta transformar o objeto oo em um número.em um número.
unpack(list)unpack(list) -- retorna todos os elementos de retorna todos os elementos de listlist. É . É equivalente a: equivalente a:
return list[1], list[2], ..., list[n]return list[1], list[2], ..., list[n]
Linguagens de Programacão [email protected] 38
Funções BásicasFunções Básicastable.foreach (table, f)table.foreach (table, f)–– executa a função executa a função ffpara todos os elementos de para todos os elementos de tabletable..
table.getn (table)table.getn (table)–– retorna o tamanho da retorna o tamanho da tabela tabela tabletable se esta for um array. Caso exista um se esta for um array. Caso exista um campo com índice n, retorna o valor deste campo.campo com índice n, retorna o valor deste campo.
table.sort (table [, comp])table.sort (table [, comp])–– ordena os ordena os elementos de elementos de tabletable usando a função usando a função compcomp como como critério de comparação. Caso critério de comparação. Caso compcomp não seja não seja fornecido como parâmetro, o operador fornecido como parâmetro, o operador >> é utilizado.é utilizado.
20
Linguagens de Programacão [email protected] 39
Exemplo Exemplo -- CloneClonefunction ts.clone(o)function ts.clone(o)if (type(o)~="table") thenif (type(o)~="table") then
return oreturn oelseelse
local new_o ={}local new_o ={}for i,v in pairs(o) dofor i,v in pairs(o) do
new_o[i] = ts.clone(v)new_o[i] = ts.clone(v)endendreturn new_oreturn new_o
endendendend
Linguagens de Programacão [email protected] 40
Exemplo Exemplo -- SerializaçãoSerializaçãofunction serialize (o) function serialize (o) if type(o) == "number" then if type(o) == "number" then write(o) write(o)
elseif type(o) == "string" then elseif type(o) == "string" then write(format("%q", o)) write(format("%q", o))
elseif type(o) == "table" then elseif type(o) == "table" then write("{write("{\\n") n") for k,v in pairs(o) do for k,v in pairs(o) do write(" ", k, " = ") write(" ", k, " = ") serialize(v) serialize(v) write("write("\\n") n")
end end write("}write("}\\n") n")
else else error("cannot serialize a "..type(o)) error("cannot serialize a "..type(o))
end end end end
21
Linguagens de Programacão [email protected] 41
Exemplo Exemplo –– Lista (LIFO)Lista (LIFO)function insert(list,o)function insert(list,o)if not(list) thenif not(list) thenlist={}list={}
endendlocal node ={}local node ={}node.data = onode.data = oif list.last thenif list.last thenlist.last.next = nodelist.last.next = node
elseelselist.first = nodelist.first = node
endendlist.last = nodelist.last = nodereturn listreturn list
endend
function retrieve(list)function retrieve(list)if (list and list.first) thenif (list and list.first) then
local o = list.first.datalocal o = list.first.dataif (list.first==list.last) if (list.first==list.last) thenthen
list.first=nillist.first=nillist.last=nillist.last=nil
elseelselist.first = list.first.nextlist.first = list.first.next
endendreturn oreturn o
elseelsereturnreturn
endendendend