Documento: “Uma introdução à programação em Lua”
Mini-curso preparado e apresentado por um dos autores da linguagem nas Jornadas de Atualização em Informática – 2009, evento que ocorreu na Universidade Federal do Rio Grande do Sul (UFRGS).
Público-alvo
Este documento será útil para quem deseja aprender a programar em Lua, e já possui algum conhecimento prévio em programação, com outros ambientes de desenvolvimento.
Estrutura
Dentro do programa, este mini-curso foi o terceiro, e foi dividido em 8 seções:
- Seção 3.1: Introdução
- Seção 3.2: Como usar Lua
- Seção 3.3: Alguns Exemplos
- Seção 3.4: Programando com Funções
- Seção 3.5: Programando com Tabelas
- Seção 3.6: Programando com Co-rotinas
- Seção 3.7: A API Lua-C
- Seção 3.8: Comentários Finais
Resumo
A seção 3.1 explica algumas características da linguagem que a tornam dinâmica, e comenta também sua concepção como linguagem “de script”.
O que são scripts?
A seção 3.2 menciona formas de obtenção de uma distribuição de Lua em diferentes sistemas operacionais, e também maneiras de executar o código Lua utilizando o interpretador da distribuição padrão, alertando também para o fato de que em muitos casos, os programas Lua são embutidos em outras aplicações, e nestes casos dependerão do modo como o programa hospedeiro carrega e executa os trechos de código Lua.
Depois disso, a seção 3.3 mostra, por meio de exemplos, alguns conceitos-chave da linguagem, relativos a tipos de dados, operadores, funções e estruturas de controle, testes lógicos e algumas convenções da linguagem.
Em seguida, a seção 3.4 apresenta mais alguns exemplos que enfatizam características importantes das funções na linguagem Lua, como o fato de serem valores de primeira classe, terem possivelmente múltiplos retornos, escopo léxico, e as possibilidades que se abrem para uma abordagem funcional, utilizando funções de alta ordem e encadeamentos de chamadas.
A seção 3.5 apresenta o conceito de tabelas, alguns exemplos de uso e sua importância para construção de módulos, bem como a possibilidade de uso para orientação a objetos, com auxílio do mecanismo de delegação (este por sua vez baseado no conceito de metatabelas e metamétodos, porém não muito explorados no documento).
Depois disso, a seção 3.6 fala sobre o conceito de co-rotinas, como elas são implementadas em Lua, e demonstra a sua versatilidade com alguns exemplos de uso focados nas transferências de controle entre múltiplos trechos de código.
A seção 3.7 comenta o modo como Lua foi concebida desde o início para ser uma biblioteca portátil, e mostra duas perspectivas de uso da API C, uma na qual Lua é embutida em um programa C, e outra na qual é estendida com o registro de funções implementadas em C.
Por fim, a seção 3.8 faz um importante e acertado alerta sobre pontos que merecem uma discussão mais aprofundada, o que requer o tratamento de vários novos conceitos, algo que exigiria mais tempo do que o mini-curso dispunha.
Comentários
Como parte de um mini-curso, este documento sintetiza ao máximo o seu conteúdo, focando nos conceitos-chave da linguagem Lua e suas diferenças com outras linguagens.
Conceitos como iteração, recursividade, testes lógicos, abstração de problemas, estruturas de dados, paradigmas de programação são assuntos tidos como já conhecidos pelo leitor, e nesse sentido alguns exemplos triviais são apresentados apenas para explicar conceitos específicos da linguagem Lua.
Esses exemplos, porém, são seguidos de exemplos mais realistas, abordando problemas como tabelas de prefixos, desenhos de polígonos, pertinência em regiões geométricas, dentre outros cenários, utilizando os conceitos recém-apresentados. Além disso, a explicação sobre implementação de orientação a objetos em Lua só fará sentido para quem já tem familiaridade com este paradigma.
Dentre os principais conceitos de Lua abordados podemos destacar as funções, que embora sejam comuns na programação, possuem várias particularidades em Lua, as tabelas, que são uma estrutura (de fato a única em Lua) altamente versátil e pervasiva na linguagem, e co-rotinas, que oferecem um alto grau de controle e fluxos de execução cooperativos.
O final do documento explora mais a natureza “satelital” da linguagem, mostrando que na prática ela é uma biblioteca implementada em C, feita para ser embutida em ou estendida com código escrito em outras linguagens (geralmente em C), utilizando a API C.
Pontos de atenção
-
Na subseção 3.2, há menção ao projeto Lua for Windows, com o endereço de acesso. Esse endereço já não está mais ativo e hoje o projeto pode ser encontrado em um novo endereço. Cabe notar que o Lua for Windows distribui apenas a versão 5.1 da biblioteca Lua.
-
Na subseção 3.2, comenta-se que Lua sempre trabalha com números reais em ponto flutuante. Foi assim até a versão 5.2, porém a partir da versão 5.3, os números são, por padrão, tratados como inteiros, sendo tratados como reais apenas quando há explicitamente uma parte fracionária.
-
Ao final da subseção 3.2, comenta-se que o estado Lua é persistido em uma sessão no interpretador interativo, que persiste até o fim da execução do programa e também o fato de que cada linha é executada como um trecho.
A partir dessa informação é importante lembrar que variáveis locais não são mantidas entre os comandos, pois o escopo destas é confinado ao trecho (isto é, à linha). Apenas variáveis globais persistem entre os comandos.
-
Na subseção 3.4.4, que fala sobre trechos, a função
loadstring()
é mencionada. Cabe observar que a partir da versão 5.2, essa função é tornada obsoleta, em favor da funçãoload()
. Na versão 5.3 a funçãoloadstring()
é efetivamente removida. -
A subseção 3.4.4 explica que o interpretador Lua troca o sinal de igual nos trechos executados por um comando de retorno (
return
). Embora isso ainda seja verdadeiro, a partir da versão 5.3 isto não é mais necessário, de modo que o retorno é apresentado com ou sem o sinal de igual. -
A subseção 3.5.2 menciona um artifício para determinar o tamanho de uma tabela por meio do atributo
n
. O exemplo não está errado, mas considerando o papel que o campon
teve até a versão 5.0, é importante esclarecer uma diferença surgida na versão 5.1. Até a versão 5.0, o campon
seria sempre usado para consultar o tamanho de uma tabela, por meio de funções da API C ou por funções da biblioteca padrão.A partir da versão 5.1, esse campo perde qualquer significado especial, e só é usado dessa maneira (quando é usado) como uma convenção, e inclusive podendo ser utilizado outro nome no lugar de
n
. Nesses casos, fica a encargo do programador implementar as rotinas de consulta de tamanho da tabela e de atualização desse tamanho quando um campo for adicionado ou removido da tabela em questão.Note-se que na versão 5.1 a documentação já não faz qualquer menção a um campo
n
que determine o tamanho das tabelas. Outra informação relacionada presente na documentação da versão 5.1 é uma mudança na API C, na qual as funçõesluaL_getn()
eluaL_setn()
da biblioteca auxiliar caem em depreciação e já não mais devem ser usadas. -
Na subseção 3.5.4 comenta-se que módulos são representados por tabelas no escopo global. Até a versão 5.1 isso era bastante convencional. No entanto, a partir da versão 5.2, convencionou-se que módulos não resultem em alterações no escopo global.
-
A subseção 3.7.2 demonstra uma maneira de estender Lua, que é registrando funções escritas em C, com auxílio da função
lua_pushcfunction()
, para guardar a função na pilha virtual e então depois gravá-la em uma variável global. Embora não esteja no escopo do documento, vale lembrar que há também outras maneiras de estender a linguagem, seja criando módulos inteiros via API C (de modo que as funções são gravadas em uma tabela), seja criando tipos específicos (userdata), os quais podem ter suas próprias metatabelas e metamétodos.
Conteúdo relacionado
- Glossário – Açúcar Sintático
- Glossário – API C
- Glossário – Biblioteca auxiliar
- Glossário – Biblioteca padrão
- Glossário – Bloco
- Glossário – Co-rotina
- Glossário – Coletor de lixo
- Glossário – Compilação Lua
- Glossário – Distribuição padrão
- Glossário – Escopo Léxico
- Glossário – Estado Lua
- Glossário – Fluxo de execução
- Glossário – Interpretador Lua
- Glossário – Máquina Virtual
- Glossário – Metamétodo
- Glossário – Metatabela
- Glossário – Módulo
- Glossário – Pilha virtual
- Glossário – Programa hospedeiro
- Glossário – Tabela
- Glossário – Trecho
- Glossário – Userdata
- Glossário – Valores de primeira classe
- Glossário – Variável global
- Glossário – Variável local
- Tutoriais – Obtendo Lua
- Tutoriais – Executando código Lua