A Linguagem Lua Lua foi projetada e implementada por uma equipe no Tecgraf, o Grupo de Computação Gráfica da Puc-Rio (Pontifícia Universidade Católica do Rio de Janeiro). 1
Exemplos de linguagens de scripts Lua Python Tcl Perl VBasic...
Para quê? Implementar o script do jogo Definir objetos e seus comportamentos Gerenciar os algoritmos de inteligência artificial Controlar os personagens Tratar os eventos de entrada Descrever a interface com o usuário Criar protótipos Testar Depurar Analisar adequação Prover acesso programável para roteiristas e artistas Experimentar novas idéias e variações
Por quê? Conjunto de características favoráveis Interpretada Tipagem dinâmica Gerência automática de memória Facilidade para estruturação de dados Facilidade para manipulação de strings Segura Facilidade para comunicação entre componentes
Como é Lua? Sintaxe convencional function fat (n) if n == 0 then return 1 else return n*fat(n-1) end end Unidade básica de execução: chunk Chunk = lista de comandos Arquivo ou string do programa hospedeiro
Execução de um chunk Pré-compilado em bytecodes Pode-se carregar arquivo compilado Máquina virtual executa seqüencialmente Execução altera ambiente global
Variáveis e Tipos Em Lua, as variáveis não têm tipos associados a elas: os tipos estão associados aos valores armazenados nas variáveis. Dessa forma, uma mesma variável pode num momento armazenar um valor de um tipo e depois passar a armazenar o valor de outro tipo Exemplos: a = "Exemplo" b = 1.23... b = nil a = 3 -- a armazena string -- b armazena numero -- b armazena nil -- a armazena numero 13
Variáveis e Tipos Em Lua, variáveis globais não precisam ser declaradas. Quando escrevemos a = 3, a variável a é, por default, uma variável global. Se desejarmos que uma variável tenha escopo local (a um bloco ou chunk), devemos declará-la previamente usando a palavra reservada local. Por exemplo: local a... a = 3 14
Os valores em Lua podem ser de oito tipos: Tipo nil O tipo nil representa o valor indefinido. Todas as variáveis ainda não inicializadas assumem o valor nil. Assim, se o código: a = b for encontrado antes de qualquer atribuição à variável b, então esta é assumida como contendo o valor nil, o que significa que a também passa a armazenar nil, independentemente do valor anteriormente armazenado em a. 15
Tipo number O tipo number representa valores numéricos. Lua não faz distinção entre valores numéricos com valores inteiros e reais. Todos os valores numéricos são tratados como sendo do tipo number. Assim, o código a = 4 b = 4.0 c = 0.4e1 d = 40e-1 armazena o valor numérico quatro nas variáveis a, b, c e d. 16
Tipo string O tipo string representa cadeia de caracteres. Uma cadeia de caracateres em Lua é definida por uma seqüência de caracteres delimitadas por aspas simples (' ') ou duplas (" "). Por simplicidade, quando a cadeia de caracteres é delimitada por aspas duplas, pode-se usar aspas simples no seu conteúdo, sem necessidade de tratá-las como seqüências de escape. Entretanto, para reproduzir na cadeia de caracteres as aspas usadas como delimitadoras, é necessário usar os caracteres de escape. Assim, são válidas e equivalentes as seguintes atribuições: s = "Olho d'agua" s = 'Olho d\'agua' 17
Tipo function Funções em Lua são consideradas valores de primeira classe. Isto significa que funções podem ser armazenadas em variáveis, passadas como parâmetros para outras funções, ou retornadas como resultados. A definição de uma função equivale a atribuir a uma variável global o valor do código que executa a função. function func1 (...)... end que pode posteriormente ser executada através de uma chamada de função: func1(...) 18
Tipo userdata O tipo userdata permite que dados C arbitrários possam ser armazenados em variáveis Lua. Este tipo corresponde a um bloco de memória e não tem operações prédefinidas em Lua, exceto atribuição e teste de identidade. Contudo, através do uso de metatables, o programador pode definir operações para valores userdata. Valores userdata não podem ser criados ou modificados em Lua, somente através da API C. Isto garante a integridade dos dados que pertencem ao programa hospedeiro. 19
Tipo table O tipo table implementa arrays associativos, isto é, arrays que podem ser indexados não apenas por números, mas por qualquer valor (exceto nil). Tabelas podem ser heterogêneas; isto é, elas podem conter valores de todos os tipos (exceto nil). Tabelas são o único mecanismo de estruturação de dados em Lua; elas podem ser usadas para representar arrays comuns, tabelas de símbolos, conjuntos, registros, grafos, árvores, etc. Para representar registros, Lua usa o nome do campo como um índice. Tipo boolean Boolean é o tipo dos valores false e true. 20
Atribuição simples e múltipla É possível atribuir diversas variáveis em um mesmo comando. Por exemplo: s, v = "Linguagem Lua", 2 Quando o número de variáveis listadas à esquerda do sinal de igualdade é diferente do número de resultados à direita da igualdade, a linguagem automaticamente ajusta as listas: ou preenchendo as últimas variáveis da esquerda com valores nils ou descartando os últimos resultados da direita. Por exemplo: a, b = 2 c, d = 2, 4, 6 O código acima atribui 2 à variável a, nil à variável b, 2 à variável c, 4 à variável d, e despreza o valor 6. 21
Atribuição simples e múltipla A possibilidade de atribuição múltipla permite a troca de valores armazenados em duas variáveis com um único comando. Portanto a, b = b, a faz com que a receba o valor anteriormente armazenado por b e que b receba o valor anteriormente armazenado por a, sem necessidade de variáveis temporárias. 22
Operadores relacionais Os operadores relacionais disponíveis em Lua são: < menor que > maior que <= menor que ou igual a >= maior que ou igual a == igual a ~= diferente de Os operadores relacionais retornam o valor nil quando o resultado é falso e o valor 1 quando o resultado é verdadeiro. Assim, as atribuições a = 4 < 3 b = 4 > 3 armazenam em a o valor nil e em b o valor 1. Os operadores >, <, >=, <= só são aplicáveis em dados do tipo number ou string, e têm a interpretação usual. 23
Controle de fluxo (if) if condição then bloco end ou if condição then bloco1... else bloco2... end ou ainda if condição1 then bloco1 elseif condição2 then bloco2... elseif condiçãon then bloco N else bloco N+1 end 24
Laço iterativo (while) while condição1 do bloco end Exemplo: f = 1 i = n while i > 0 do f = f * i i = i 1 end 25
Laço iterativo (for) for var = exp1, exp2, exp3 do bloco end Exemplo: for i = 10, 1, -1 do print(i) end 26
Funções A linguagem Lua trata funções como valores de primeira classe. Isto quer dizer que funções podem ser armazenadas em variáveis, podem ser passadas como parâmetros para outras funções e podem ser retornadas como resultados de funções. function nome ( [lista-de-parâmetros] ) bloco de comandos end A chamada da função segue a forma básica nome ( [lista-de-argumentos] ) Lua passa parâmetros por valor. Isto quer dizer que quando se altera o valor de um parâmetro dentro de uma função, altera-se apenas o valor da variável local correspondente ao parâmetro. O valor da variável passada como argumento na chamada da função permanece inalterado. 27
Funções Os valores retornados por uma função são ajustados para a atribuição na linha que faz a chamada. Para exemplificar, supõe-se uma função que incrementa os valores de um ponto cartesiano (x, y): function translada (x, y, dx, dy) return x+dx, y+dy end Considera-se, agora, que a chamada da função é feita por: a, b = translada(20, 30, 1, 2) Assim, a recebe o valor 21 (=20+1) e b recebe o valor 32 (=30+2). 28
Funções Seguindo o mesmo exemplo, se a chamada fosse a = translada(20, 30, 1, 2) Então o segundo valor retornado seria desprezado, e a receberia o valor 21. Por outro lado, a atribuição: a, b, c = translada(20, 30, 1, 2) Faria a= 21, b = 32 e c = nil. 29
Bibliotecas padrão Basic String Table Math IO OS Debug Coroutine
Basic Oferecem funções básicas print type setmetatable pairs
String Funções para manipulação de strings Casamento de padrões (pattern matching) string.find Permite buscar a ocorrência de um padrão numa string string.gsub Permite substituir ocorrâncias de um padrão por uma sequência de caracteres dentro de uma string
Table Funções para manipulação de tabelas table.insert Inserir um novo elemento table.remove Remover um elemento table.sort Ordenar os elementos em índices numéricos
Math Funções matemáticas Semelhantes às funções de C math.sqrt math.sin math.log
IO Funções de entrada e saída io.open Abertura de arquivo io.close Fechamento de arquivo io.read Leitura de arquivo io.write Escrita em arquivo
A Linguagem Lua Lua foi projetada e implementada por uma equipe no Tecgraf, o Grupo de Computação Gráfica da Puc-Rio (Pontifícia Universidade Católica do Rio de Janeiro). 36