Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
2. Domnios de aplicao
A linguagem de programao Lua possui grande uso no domnio corporativo voltado
para o mercado de jogos de computadores [WoW] e consoles de video-game
[Psychonauts]. Alm disso, bastante empregada em aplicaes Web e no
desenvolvimento de ferramentas para auxiliar a pesquisa cientfica, como a Biologia
Molecular [GUPPY].
Lua foi projetada para estender aplicaes, sendo freqentemente utilizada como
uma linguagem de propsito geral. Dessa forma, diversos casos de uso podem ter Lua
como parte da implementao de uma soluo, seja para o domnio empresarial,
cientfico e industrial. A comunidade de desenvolvimento em linguagem Lua de
domnio geral. Assim, qualquer interessado pode ter acesso a documentao e o cdigo-
fonte da implementao da linguagem, pois Lua software livre de cdigo aberto.
Demais exemplos de uso da linguagem Lua de forma a descrever seus domnios
de aplicao podem ser vistos da Internet, atravs do website oficial, nas referncias
finais deste trabalho.
que atribui o valor nil varivel a (a partir deste ponto, como se a varivel a ainda
no tivesse sido atribuda).
Pode-se testar se uma varivel foi inicializada comparando o seu valor com nil:
a == nil
O tipo lgico, tambm conhecido como tipo booleano, pode assumir somente dois
valores: verdadeiro (true) ou falso (false).
a = 4
b = 4.0
c = 0.4e1
d = 40e-1
s = "Marca d'agua"
s = 'Marca d\'agua'
Colchetes duplos ([[ ]]) tambm podem ser utilizados como delimitadores de
strings. Diferentemente dos delimitadores aspas simples e aspas duplas, esse
delimitador no interpreta sequncias de escape e tolera que a string tenha quebras de
linhas e pode conter strings com delimitadores aninhados. Exemplo:
s = [[Esse um texto que
atravessa
mais de uma linha
e contm uma string aninhada: [[aninhada]] no final !]]
co_rotina 1 10
func_sec 2
principal true 4
co_rotina r
principal true 11 -9
co_rotina x y
principal true 10 fim
principal false cannot resume dead coroutine
cria uma tabela vazia e armazena em a este valor. Novos campos podem ser adicionados
posteriormente a esta tabela.
A partir de table, possvel implementar diversas estruturas de dados, como
arrays comuns, tabela de smbolos, conjuntos, registros, grafos, rvores, etc.
4. Comandos de controle
Lua possui os mecanismos usuais para controle de fluxo. Estes controladores agrupam
diversos comandos em blocos que podem ou no serem executados uma ou mais vezes.
Lua tambm permite a declarao de variveis locais. Estas variveis deixam de existir
ao final do bloco onde foram declaradas.
4.1. Estrutura If
O comando de deciso bsico de Lua o if, sendo representado por uma das formas
abaixo:
if expr then
bloco
end
ou
if expr then
bloco1...
else
bloco2...
end
ou ainda
if expr1 then
bloco1
elseif expr2 then
bloco2
...
elseif expr N then
bloco N
else
bloco N+1
end
while expr do
bloco
end
f = 1 -- valor do fatorial
i = n -- controle do lao
while i > 0 do
f = f * i
i = i 1
end
Nesta construo, o bloco de comandos executado pelo menos uma vez (pois o
teste de deciso s ocorre no final do lao) e repetido at se alcanar o valor
verdadeiro para a expresso. O mesmo exemplo de clculo de fatorial pode ser escrito:
f = 1 -- valor do fatorial
i = 1 -- controle do lao
repeat
f = f * i
i = i + 1
until i > n
Conforme foi definido na seo 3.8, a estrutura table um tipo primitivo em Lua
com comportamento dinmico. O exemplo abaixo implementa um percurso numa tabela
para procurar um determinado valor na estrutura, retornando verdadeiro ou falso como
resultado na busca de um determinado valor no interior da tabela. Atravs do cdigo,
simples de perceber como os valores inicializados da tabela representam tipos distintos
de dados.
-- devo declarar explicitamente uma tabela local
local tabela = {}
function func()
-- funcao func() eh uma variavel
-- que sera inserida na tabela
end
function existe_valor(valor)
io.write("\n")
5. Subprogramas (funes)
Conforme foi dito na seo 3.5, a linguagem Lua trata funes como valores de primeira
classe. Quando definimos uma funo em Lua, o armazenando feito na varivel global
cujo nome corresponde ao nome da funo o cdigo de mquina interno da funo,
que pode posteriormente ser executado atravs de chamadas para a funo.
Funes em Lua podem ser definidas em qualquer lugar do ambiente global. A
forma bsica para definio de funes
onde nome representa a varivel global que armazenar a funo. Pode-se fornecer uma
lista de parmetros que so tratados como variveis locais da funo e inicializados
pelos valores dos argumentos na chamada da funo.
A chamada da funo segue a forma bsica
nome ( [lista-de-argumentos] )
isto , o nome da funo seguido de abre e fecha parnteses, que pode ou no conter
uma lista de argumentos. Se nome no for uma varivel que armazena um valor de
funo (i.e., do tipo function), Lua reporta um erro de execuo (TAG METHODS). Se
presente, a lista de argumentos avaliada antes da chamada da funo. Posteriormente,
os valores dos argumentos so ajustados para a atribuio dos parmetros seguindo uma
regra de atribuio mltipla na qual os parmetros recebem os valores dos argumentos.
Lua passa parmetros por valor. Isto quer dizer que quando se altera o valor de
um parmetro dentro de uma funo, altera-se apenas o valor da varivel local
correspondente ao parmetro. O valor da varivel passada como argumento na chamada
da funo permanece inalterado.
Funes em Lua podem retornar zero, um ou mais valores atravs do comando
return. A possibilidade de retorno mltiplo evita a necessidade de passagem de
parmetros por referncia. Quando, durante a execuo de uma funo, encontra-se o
comando return, a execuo da funo terminada e o controle volta para o ponto
imediatamente posterior chamada da funo. O comando return pode vir seguido
de uma lista de expresses; sua forma geral
return [lista-de-expresses]
Por razes sintticas, o comando return deve sempre ser o ltimo comando de
um bloco de comandos. Deste modo, evita-se a ocorrncia de comandos inalcanveis
(tendo em vista que comandos aps return nunca sero executados). Se return no
for o ltimo comando do bloco, Lua reporta um erro de sintaxe.
Os valores retornados por uma funo so ajustados para a atribuio na linha
que faz a chamada. Para exemplificar, supe-se uma funo que incrementa os valores
de um ponto cartesiano (x, y):
que faz com que a receba o valor 10, b o valor 21 e c o valor 32. Neste caso, o
funcionamento o esperado, tendo em vista que a chamada da funo a ltima
expresso numa lista de expresses. No entanto, se o cdigo fosse
a, b, c = translada(20, 30, 1, 2), 10
ento teria-se resultados incorretos, j que a chamada da funo est no meio de uma
lista de expresses. Conforme mencionado, independentemente do nmero de valores
retornados pela funo, considera-se apenas o primeiro (no caso, o valor 21).
O valor 32 retornado pela funo perdido durante o ajuste. Assim, teramos
como resultado o valor 21 armazenado em a e o valor 10 armazenado em b. A varivel
c, ento, receberia o valor nil, pois no se tem outra expresso aps a constante 10.
possvel definir funes em Lua que aceitem nmero varivel de argumentos.
Para tanto necessrio acrescentar lista de argumentos da definio a indicao ...
(trs pontos seguidos). Uma funo definida dessa forma no faz ajuste do nmero de
parmetros em relao ao nmero de argumentos. Ao invs disso, quando a funo
chamada os argumentos extras so colocados em um parmetro implcito de nome arg.
Esse parmetro sempre inicializado como uma tabela, onde o campo n contm o
nmero de argumentos extras e os campos 1, 2, ... os valores dos argumentos,
seqencialmente.
Para exemplificar, duas diferentes definies de funes so apresentadas:
A tabela segue com a representao string dos operadores em Lua que possuem a
capacidade de sobrecarga atravs de metatables.
Nome Descrio Smbolo
add adio +
sub subtrao -
mul multiplicao *
div diviso /
pow exponenciao ^
unm unrio -
concat concatenao ..
len cardinalidade #
eq equivalncia ==
x = 10 -- varivel global
do -- novo bloco
local x = x -- novo 'x', com valor 10
print(x) -- imprime 10
x = x+1
do -- outro bloco
local x = x+1 -- outro 'x'
print(x) -- imprime 12
end
print(x) -- imprime 11
end
print(x) -- imprime 10 (varivel global)
Pode-se ainda declarar e inicializar vrias variveis locais num mesmo comando:
local a, b, c = 2, 5+6, -3
Quando uma funo escrita no interior de outra, a funo includa passa a ter acesso
completo a todas as variveis locais da funo detentora; funcionalidade conhecida
como escopo lxico. Embora parea simples, s vezes no to bvia quanto seja.
Agora, suponha que o cdigo que contm a funo que desempenha a tarefa de
ordenao dos nomes de alunos atravs da nota maior at a nota menor:
function ordena_por_nota(nomes, notas)
table.sort(nomes, function (n1, n2)
return notas[n1] > notas[n2] -- compara as notas
end)
end
function novo_contador()
local i = 0
return function() -- funo annima
i = i + 1
return i
end
end
c1 = novo_contador()
print( c1() ) --> 1
print( c1() ) --> 2
c2 = novo_contador()
print( c2() ) --> 1
print( c1() ) --> 3
print( c2() ) --> 2
3 O termo "upvalue" um tanto enganoso, pois notas uma varivel, no um valor. Entretanto, esse
termo possui razes histricas da linguagem Lua e tambm uma forma de abreviatura para "varivel
local externa".
Atravs do mecanismo de closures, programas em Lua incorporam tcnicas de
programao personalizveis, como uso de callbacks, muito teis para aplicativos GUI.
seno_velho = math.sin
math.sin = function (x)
return seno_velho(x * math.pi/180)
end
do
local seno_velho = math.sin
local l = math.pi/180
math.sin = function (x)
return seno_velho(x * l)
end
end
A idia foi manter a verso antiga numa varivel privada. O nico caminho e
acesso atravs da nova verso.
do
local velho_open = io.open
io.open = function (nome_arq, modo)
if access_OK(nome_arq, modo) then
return velho_open(nome_arq, modo)
else
return nil, "acesso negado"
end
end
end
Uma evidente conseqncia das funes de primeira classe que possvel armazenar
funes no somente em variveis globais, mas tambm em tables e em variveis locais.
Quando uma funo armazenada numa varivel local, a funo ser local, ou seja,
restrita a um dado escopo.
Tal definio particularmente til para pacotes: Lua manipula cada chunk4
como uma funo, uma chunk pode declarar funes locais, as quais so somente
visveis no interior de um chunk. O escopo lxico garante que outras funes no pacote
podem usar essas funes locais:
4 Cada poro de cdigo em Lua pode ser chamado de chunk, tal como um arquivo ou uma nica linha
de comando. Mais especificamente, um chunk simplesmente uma seqncia de declaraes. Veja
nas referncias para saber mais.
local fatorial
fatorial = function (n)
if n == 0 then return 1
else return n*fatorial(n-1)
end
end
Agora fatorial no interior da funo faz referncia a varivel local. Seu valor no
importa quando a funo definida, pois em tempo de execuo, fatorial j possui o
valor correto. Uma maneira expansiva para funes locais possui uma forma alternativa
para uso de recursividade:
Por outro lado, esse recurso no funciona quando ocorre recursividade de forma
indireta. Nesses casos, preciso usar a declarao explcita:
function g ()
... f() ...
end
function f ()
... g() ...
end
9. Concluses
Referncias
WoW World of Warcraft - http://www.worldofwarcraft.com/
Psychonauts - Double Fine Productions - http://www.doublefine.com/
GUPPY - genetic sequence visualization . Computational Biology Research Center,
AIST Tokyo. http://staff.aist.go.jp/yutaka.ueno/guppy/
Aplicaes da linguagem Lua: http://www.lua.org/uses.html
Pgina oficial da Linguagem Lua: http://www.lua.org/
Livro on-line: http://www.lua.org/pil/
Manual do programador: http://www.lua.org/manual/5.1/
Lua chunks: http://www.lua.org/pil/1.1.html
Artigo que recebeu o primeiro prmio (categoria tecnologia) no II Prmio Compaq
de Pesquisa e Desenvolvimento em Cincia da Computao em 1997:
http://www.lua.org/spe.html
Artigo envolvendo corotinas em Lua:
http://www.inf.puc-rio.br/~roberto/docs/corosblp.pdf
Pgina geral de papers sobre Lua:
http://www.lua.org/papers.html