• Nenhum resultado encontrado

Linguagem Lua

N/A
N/A
Protected

Academic year: 2021

Share "Linguagem Lua"

Copied!
38
0
0

Texto

(1)

FAESA FAESA

FUNDAÇÃO DE ASSISTÊNCIA E

FUNDAÇÃO DE ASSISTÊNCIA E EDUCAÇÃOEDUCAÇÃO FACULDADES INTEGRADAS ESPÍRITO-SANTANSES FACULDADES INTEGRADAS ESPÍRITO-SANTANSES

UNIDADE DE COMPUTAÇÃO E SISTEMAS UNIDADE DE COMPUTAÇÃO E SISTEMAS

GUTHIERRY FERREIRA ALMEIDA GUTHIERRY FERREIRA ALMEIDA LEON PEDROSA DE MEIRELLES LEON PEDROSA DE MEIRELLES PAULO HENRIQUE RODRIGUES ORIND PAULO HENRIQUE RODRIGUES ORIND

LINGUAGEM DE PROGRAMAÇÃO LUA LINGUAGEM DE PROGRAMAÇÃO LUA

VITÓRIA/ES VITÓRIA/ES

2010 2010

(2)

GUTHIERRY FERREIRA ALMEIDA GUTHIERRY FERREIRA ALMEIDA LEON PEDROSA DE MEIRELLES LEON PEDROSA DE MEIRELLES PAULO HENRIQUE RODRIGUES ORIND PAULO HENRIQUE RODRIGUES ORIND

LINGUAGEM DE PROGRAMAÇÃO LUA LINGUAGEM DE PROGRAMAÇÃO LUA

VITÓRIA/ES VITÓRIA/ES 2010 2010 Trabalho acadêmico Trabalho acadêmico apresentado ao Curso de apresentado ao Curso de Ciência da Computação, Ciência da Computação, FAESA, como parte das FAESA, como parte das exigências da disciplina de exigências da disciplina de Linguagem de Programação I Linguagem de Programação I sob orientação da professora sob orientação da professora Cinthia C. L .Caliari.

(3)

SUMÁRIO SUMÁRIO 1.

1. Linguagem Linguagem Lua Lua ... .... 55

1.1. Introdução 1.1. Introdução... 5... 5 1.2. História ... 6 1.2. História ... 6 1.3. Importância ... 7 1.3. Importância ... 7 1.4. Aplicações ... 7 1.4. Aplicações ... 7 1.5. Características Principais ... 10 1.5. Características Principais ... 10 1.5.1. Domínio de programação ... 10 1.5.1. Domínio de programação ... 10 1.5.2. Paradigma 1.5.2. Paradigma ... ... 1010 1.5.3. Sintaxe ... 10 1.5.3. Sintaxe ... 10 1.6. Diferenciais ... 11 1.6. Diferenciais ... 11 1.6.1. Portabilidade ... 11 1.6.1. Portabilidade ... 11 1.6.2. Simplicidade 1.6.2. Simplicidade ... ... 1111 1.6.3. 1.6.3. Pequeno Pequeno Tamanho Tamanho ... 11... 11

1.6.4. Acoplabilidade 1.6.4. Acoplabilidade ... .... 1111 1.6.5. Eficiência 1.6.5. Eficiência ... ... 1212 1.7. Valores e Tipos ... 12 1.7. Valores e Tipos ... 12 1.7.1. Variáveis Locais ... 12 1.7.1. Variáveis Locais ... 12 1.7.2. Tipos ... 13 1.7.2. Tipos ... 13 1.7.2.1. 1.7.2.1. Nil Nil ... ... 1313 1.7.2.2. 1.7.2.2. Boolean Boolean ... .. 1414 1.7.2.3. 1.7.2.3. Number Number ... .... 1414 1.7.2.4. 1.7.2.4. String String ... ... 1515 1.7.2.4.1. 1.7.2.4.1. Concatenação Concatenação ... ... 1515 1.7.2.5. 1.7.2.5. Table Table ... ... 1616 1.7.2.5.1. 1.7.2.5.1. Inicialização Inicialização de de tabelas tabelas ... ... 1818 1.7.2.5.1.1. 1.7.2.5.1.1. Via Via indexação indexação consecutiva consecutiva ... .... 1818 1.7.2.5.1.2. 1.7.2.5.1.2. Via Via atribuição atribuição de de campos campos ... ... 1919 1.7.2.5.1.3. 1.7.2.5.1.3. Inicialização Inicialização mista mista ... .... 1919 1.7.2.6. 1.7.2.6. Function Function ... .. 2121 1.7.2.6.1. 1.7.2.6.1. Declarando Declarando e e chamando chamando uma uma função função ... ... 2121 1.7.2.6.2. 1.7.2.6.2. Número Número varável varável de de parâmetros parâmetros ... ... 2222 1.7.2.6.3. 1.7.2.6.3. Retorno Retorno de de um um único único valor valor ... .. 2323 1.7.2.7. 1.7.2.7. Userdata Userdata ... .. 2323 1.7.2.8. 1.7.2.8. Thread Thread ... .... 2424 1.7.2.8.1. 1.7.2.8.1. Co-rotinas...Co-rotinas... ... 2525 1.7.3. Coerção 1.7.3. Coerção ... 25... 25 1.8. Expressões e Atribuições ... 26 1.8. Expressões e Atribuições ... 26 1.8.1. Operadores ... 26 1.8.1. Operadores ... 26 1.8.1.1. 1.8.1.1. Aritméticos Aritméticos ... ... 2626 1.8.1.2. 1.8.1.2. Relacionais Relacionais ... ... 2626 1.8.1.3. 1.8.1.3. Lógicos Lógicos ... .... 2727 1.8.1.4.

(4)

1.8.1.5.

1.8.1.5. Precedência Precedência de de operadores operadores ... ... 2727 1.8.2. Estruturas de controle ... 27 1.8.2. Estruturas de controle ... 27 1.8.2.1. If 1.8.2.1. If... 27... 27 1.8.2.2. 1.8.2.2. While While ... ... 2828 1.8.2.3. 1.8.2.3. Repeat Repeat ... .... 2828 1.8.2.4. 1.8.2.4. For For ... ... 2828 1.8.2.4.1.

1.8.2.4.1. For For numérico numérico ... ... 2828 1.8.2.4.2.

1.8.2.4.2. For For genérico genérico ... ... 2929 1.8.2.5.

1.8.2.5. Break Break e e return return ... ... 2929 1.9.

1.9. Biblioteca padrão Lua Biblioteca padrão Lua ... 30.. 30 1.10.

1.10. Programar Programar em em Lua Lua ... ... 3131 1.11. 1.11. Conclusão Conclusão ... ... 3333 1.12. 1.12. Anexos Anexos ... .. 3434 1.12.1. 1.12.1. Anexo Anexo I I ... .... 3434 1.12.2. 1.12.2. Anexo Anexo II II ... .. 3434 1.12.3.

1.12.3. Anexo Anexo III III ... .. 3535 1.12.4.

1.12.4. Anexo Anexo IV IV ... .. 3636 1.13.

(5)

LINGUAGEM DE PROGRAMAÇÃO LUA LINGUAGEM DE PROGRAMAÇÃO LUA 1.1 INTRODUÇÃO

1.1 INTRODUÇÃO

Única linguagem de aceitação mundial desenvolvida fora do eixo EUA

Única linguagem de aceitação mundial desenvolvida fora do eixo EUA – – EuropaEuropa – –

Japão, Lua, foi criada em 1993 no Brasil e se destaca pelo poder, simplicidade e Japão, Lua, foi criada em 1993 no Brasil e se destaca pelo poder, simplicidade e rapidez.

rapidez.

Lua foi projetada para estender aplicações, é totalmente tipada dinamicamente, é Lua foi projetada para estender aplicações, é totalmente tipada dinamicamente, é interpretada e tem gerenciamento automático de memória com coletor de lixo interpretada e tem gerenciamento automático de memória com coletor de lixo incremental. Essas e outras características fazem dela uma linguagem ideal para incremental. Essas e outras características fazem dela uma linguagem ideal para configuração e automação (Scripting).

configuração e automação (Scripting).

Por também ser de licença permissiva, a linguagem tornou-se popular entre os Por também ser de licença permissiva, a linguagem tornou-se popular entre os desenvolvedores de todo o planeta, passando a fazer parte rapidamente da lista das desenvolvedores de todo o planeta, passando a fazer parte rapidamente da lista das 30 linguagens mais utilizadas no mundo, além da presença em empresas 30 linguagens mais utilizadas no mundo, além da presença em empresas importantes como o Incor, Intel, Microsoft e NASA, por exemplo.

(6)

1.2 HISTÓRIA 1.2 HISTÓRIA

Em 1992, em um projeto entre a PUC-Rio (Pontifícia Universidade Católica do Rio Em 1992, em um projeto entre a PUC-Rio (Pontifícia Universidade Católica do Rio de Janeiro) e a Petrobras, surgiu o TeCGraf (Grupo de Tecnologia em Computação de Janeiro) e a Petrobras, surgiu o TeCGraf (Grupo de Tecnologia em Computação Gráfica), a princípio baseava-se na construção de interfaces gráficas para Gráfica), a princípio baseava-se na construção de interfaces gráficas para programas de simulação. Para tal era utilizada DEL (Linguagem para Especificação programas de simulação. Para tal era utilizada DEL (Linguagem para Especificação de Diálogos), que apresentava algumas limitações. Um ano depois, em novo projeto de Diálogos), que apresentava algumas limitações. Um ano depois, em novo projeto com a Petrobras foi criado o PGM (Programa Gráfico Mestre), utilizado para com a Petrobras foi criado o PGM (Programa Gráfico Mestre), utilizado para visualização de perfis geológicos. A linguagem SOL (Simple Object Language) visualização de perfis geológicos. A linguagem SOL (Simple Object Language) estava sendo utilizada, mas também se limitava.

estava sendo utilizada, mas também se limitava.

Como DEL e SOL tinham bastantes problemas em comum, Roberto Ierusalimschy Como DEL e SOL tinham bastantes problemas em comum, Roberto Ierusalimschy (PGM), Luiz Henrique Figueiredo (DEL) e Waldemar Celes (PGM) se reuniram para (PGM), Luiz Henrique Figueiredo (DEL) e Waldemar Celes (PGM) se reuniram para encontrar uma solução, precisavam de uma linguagem de configuração genérica, encontrar uma solução, precisavam de uma linguagem de configuração genérica, completa, facilmente acoplável, portátil, de boa sintaxe e que fosse simples, e neste completa, facilmente acoplável, portátil, de boa sintaxe e que fosse simples, e neste mesmo ano, 1993, a solução: Lua. O nome, segundo Ricardo, seria uma sugestão mesmo ano, 1993, a solução: Lua. O nome, segundo Ricardo, seria uma sugestão de um amigo, já

de um amigo, já que eles estavam abandonando o projeto de SOL.que eles estavam abandonando o projeto de SOL. A primeira versão de Lua (1.0), a

A primeira versão de Lua (1.0), a posteriori posteriori , data de julho de 1993, mas a primeira, data de julho de 1993, mas a primeira

versão pública (1.1) só veio em julho de 1994 era mais eficiente. Distribuída versão pública (1.1) só veio em julho de 1994 era mais eficiente. Distribuída publicamente pela internet, Lua era de licença livre para uso acadêmico e restritiva publicamente pela internet, Lua era de licença livre para uso acadêmico e restritiva para uso comercial, foi quando começaram os problemas com a concorrência (Perl, para uso comercial, foi quando começaram os problemas com a concorrência (Perl, Python,...). Lua 2 (Lua 2.1, de fevereiro de 1995 a Lua 2.5 de novembro de 1996) foi Python,...). Lua 2 (Lua 2.1, de fevereiro de 1995 a Lua 2.5 de novembro de 1996) foi

a primeira versão com licença “free software”, nesta versão foi criado um formato a primeira versão com licença “free software”, nesta versão foi criado um formato

simplificado para tabelas, que está em uso até hoje. Em 1995 foi criada uma simplificado para tabelas, que está em uso até hoje. Em 1995 foi criada uma

homepage para a linguagem, em 1996 publicado artigos na “Software: Pratice homepage para a linguagem, em 1996 publicado artigos na “Software: Pratice && Experience” e na “Dr. Dobb‟s”, artigos estes importantíssimos para divulgação da Experience” e na “Dr. Dobb‟s”, artigos estes importantíssimos para divulgação da

linguagem e em 1997 Lua é premiada com o

linguagem e em 1997 Lua é premiada com o prêmio COMPAQ, ano em que iniciava-prêmio COMPAQ, ano em que iniciava-se as versões 3 (Lua 3.0 de julho de 1997 a Lua 3.2 de julho de 1999). Em 1998 foi se as versões 3 (Lua 3.0 de julho de 1997 a Lua 3.2 de julho de 1999). Em 1998 foi criada a logomarca da linguagem (FIGURA 1). Lua 4.0 veio em novembro de 2000, criada a logomarca da linguagem (FIGURA 1). Lua 4.0 veio em novembro de 2000,

com comandos “for” e “break” e com código escrito em “clean C” –

com comandos “for” e “break” e com código escrito em “clean C” – interseção entreinterseção entre

as linguagens C e C++ -, além de maior eficiência. Em Lua 5 houve a implantação as linguagens C e C++ -, além de maior eficiência. Em Lua 5 houve a implantação de

co-de co-rotinas e de um “for” genérico (via gerarotinas e de um “for” genérico (via geradores), melhoria da visibilidade léxica,dores), melhoria da visibilidade léxica,

maior facilidades para módulos, além da implementação de uma máquina virtual via maior facilidades para módulos, além da implementação de uma máquina virtual via registradores e novo algoritmo para tabelas.

(7)

FIGURA 1

FIGURA 1 – –Logomarca da Linguagem LuaLogomarca da Linguagem Lua

Hoje, na versão 5.1 (versão beta 5.2 lançada recentemente), Lua é conhecida Hoje, na versão 5.1 (versão beta 5.2 lançada recentemente), Lua é conhecida mundialmente no universo dos games. Uma pesquisa do site gamedev.net de mundialmente no universo dos games. Uma pesquisa do site gamedev.net de setembro de 2003 revelou que dos 72% dos jogos que utilizam uma linguagem de setembro de 2003 revelou que dos 72% dos jogos que utilizam uma linguagem de script, 20% utilizam Lua (com 7% ficou Python, segunda colocada). A sua primeira script, 20% utilizam Lua (com 7% ficou Python, segunda colocada). A sua primeira

aparição nesta indústria de que se tem notícia foi no game “Grim Fandango” da aparição nesta indústria de que se tem notícia foi no game “Grim Fandango” da “Lucas Arts”

“Lucas Arts” (ANEXO I)(ANEXO I), logo após publicação do artigo na “Dr. Dobb‟s”, está, logo após publicação do artigo na “Dr. Dobb‟s”, está também em “FarCry”, “World of 

também em “FarCry”, “World of WarCraft”, “The Sims 2”, “Baldur‟s Gate” e “Amped”WarCraft”, “The Sims 2”, “Baldur‟s Gate” e “Amped”..

Mas não foi só em jogos que Lua se destacou, empresas como Adobe, NASA, Intel, Mas não foi só em jogos que Lua se destacou, empresas como Adobe, NASA, Intel,  já a utilizaram.

 já a utilizaram.

Outra pesquisa (ANEXO III) de novembro de 2010 da TIOBE Software aponta a Outra pesquisa (ANEXO III) de novembro de 2010 da TIOBE Software aponta a linguagem brasileira entre as 30 linguagens de programação mais utilizadas do linguagem brasileira entre as 30 linguagens de programação mais utilizadas do mundo, a frente da Fortran, da COBOL, da Visual Basic.NET, da Haskell, JavaFX mundo, a frente da Fortran, da COBOL, da Visual Basic.NET, da Haskell, JavaFX Script e da Prolog, por exemplo.

Script e da Prolog, por exemplo.

1.3 IMPORTÂNCIA 1.3 IMPORTÂNCIA

Lua tem importância global. Além de várias aplicações no mundo inteiro, em 2007 o Lua tem importância global. Além de várias aplicações no mundo inteiro, em 2007 o seu projeto e evolução foram apresentados na HOPL III, 3ª Conferência da ACM seu projeto e evolução foram apresentados na HOPL III, 3ª Conferência da ACM sobre a História das Linguagens de Programação (ANEXO IV) tal conferência só sobre a História das Linguagens de Programação (ANEXO IV) tal conferência só acontece uma vez a cada 15 anos e

acontece uma vez a cada 15 anos e há apresentação de poucas linguagens por vez.há apresentação de poucas linguagens por vez.

“A escolha de Lua para a HOPL III é um importante reconhecimento do seu impacto “A escolha de Lua para a HOPL III é um importante reconhecimento do seu impacto

m

mundial.”undial.”, diz o site da linguagem., diz o site da linguagem.

1.4 APLICAÇÕES 1.4 APLICAÇÕES Como já dito, Lua t

(8)

 “Grim Fandango”“Grim Fandango”- LucasArts;- LucasArts; 

 “World WarCraft”“World WarCraft”- Blizzard;- Blizzard; 

 “Sonic, the“Sonic, the Hedgehdg” –Hedgehdg” – SEGA;SEGA; 

 “FarCry” –“FarCry” –UBISOFT;UBISOFT; 

 “The Sims2” –“The Sims2” –EA;EA; 

 “Sim City 4” –“Sim City 4” –EA;EA; 

 “Warhammer Online –“Warhammer Online –Age of RAge of Reckoning” –eckoning” – EA;EA; 

 “Supreme Commander” –“Supreme Commander” –THQ;THQ; 

 “Heroes V” –“Heroes V” –UBISOFT;UBISOFT; 

 “Spell Force” –“Spell Force” –Solo Out;Solo Out; 

 ““S.T.A.L.K.E.R.S.T.A.L.K.E.R. – – Shadow of Chernobyl” –Shadow of Chernobyl” – THQ;THQ; 

 “CRYSIS –“CRYSIS – EA”;EA”; 

 “Dawn of War” –“Dawn of War” –Relic;Relic; 

 “NFL Fever 2004” –“NFL Fever 2004” – XSN Sports;XSN Sports; 

 “The Witcher” –“The Witcher” –Atari;Atari; 

 “Amped –“Amped – Freestyle Showboarding” –Freestyle Showboarding” – Microsoft;Microsoft; 

 “Hulk –“Hulk – The Incredible” –The Incredible” –SEGA;SEGA; 

 “Destroy all Humans!” –“Destroy all Humans!” –THQ;THQ; 

 “Psychonauts” –“Psychonauts” – MAJEACO;MAJEACO; 

 “MDK 2”“MDK 2”- Interplay;- Interplay; 

 “Escape from Monkey Island” –“Escape from Monkey Island” – Lucas Arts (Neste jogo Lua recebeu umaLucas Arts (Neste jogo Lua recebeu uma

homenagem (ANEXO II)); homenagem (ANEXO II));

 “Baldur‟s Gate”“Baldur‟s Gate” - BioWare;- BioWare; 

 “Impossible Creatures” –“Impossible Creatures” –Relic, Microsoft Game Studios;Relic, Microsoft Game Studios; 

 “HomeWorld 2” –“HomeWorld 2” – Relic”;Relic”; 

 “Links 2004” –“Links 2004” – XSN Sports;XSN Sports; 

 “Amped 3” –“Amped 3” – 2K Sports;2K Sports; 

 “Soul Ride”“Soul Ride”- Slingshot;- Slingshot; 

 “Diner Dash“Diner Dash 22 – – Restaurant Rescue” –Restaurant Rescue” – PlayFirst;PlayFirst; 

 “Top Spin 2” –“Top Spin 2” – 2K Sports;2K Sports; 

 “NHL Rivals 2004” –“NHL Rivals 2004” – XSN Sports;XSN Sports; 

(9)

No mercado de softwares em geral: No mercado de softwares em geral:

 “Ginga NCL” –“Ginga NCL” –middleware padrão brasileiro para TV Digital;middleware padrão brasileiro para TV Digital; 

 “Wireshark” –“Wireshark” –analisador de protocolos;analisador de protocolos; 

 “Snort” –“Snort” – detecção de “intrusos” e proteção do sistema;detecção de “intrusos” e proteção do sistema; 

 “Adobe Lightroom” –“Adobe Lightroom” – gerenciador e organizador de imagens;gerenciador e organizador de imagens; 

 “nmap” –“nmap” – rastreador de redes para segurança;rastreador de redes para segurança; 

 “Eyeon‟s Digital Fusion” –“Eyeon‟s Digital Fusion” –pós-produção de filmes;pós-produção de filmes; 

 “INPE” –“INPE” – biblioteca GIS;biblioteca GIS; 

 “Olivetty”“Olivetty” – –firmware para impressoras;firmware para impressoras; 

 “Omnitronix” –“Omnitronix” –monitoramento remoto;monitoramento remoto; 

 “RealTimeLogic” –“RealTimeLogic” – servidores Web;servidores Web; 

 “APT“APT--RPM”, Conectiva –RPM”, Conectiva – padrão para distribuições RPM;padrão para distribuições RPM; 

 “Publique!” –“Publique!” – gerenciador de conteúdo para web;gerenciador de conteúdo para web; 

 “Sputnik” –“Sputnik” – wiki extensível disponível como software livre.wiki extensível disponível como software livre.

Empresas diversas e importantes também aderiram à linguagem, empregando-a em Empresas diversas e importantes também aderiram à linguagem, empregando-a em aplicações das mais variadas:

aplicações das mais variadas:

 Hands: uso no desenvolvimento de navegadores de conteúdo para micros deHands: uso no desenvolvimento de navegadores de conteúdo para micros de

bolso; bolso;

 Incor (Instituto do Coração em São Paulo): utilizada no servidor do sistemaIncor (Instituto do Coração em São Paulo): utilizada no servidor do sistema

que monitora pacientes na UTI via

que monitora pacientes na UTI via Web;Web;

 CPC 4400: placa de switch para rede Ethernet, a linguagem foi usada naCPC 4400: placa de switch para rede Ethernet, a linguagem foi usada na

criação de sua interface; criação de sua interface;

 Intel: empregada na ferramenta interna para lIntel: empregada na ferramenta interna para layout de chips (processadores);ayout de chips (processadores); 

 Robô Crazy Ivan: Lua é um dos componentes do seu cérebro, responsável,Robô Crazy Ivan: Lua é um dos componentes do seu cérebro, responsável,

segundo fabricantes do robô, pela parte lógica. Ivan ganhou o concurso de segundo fabricantes do robô, pela parte lógica. Ivan ganhou o concurso de inteligência artificial da RoboCup 2000, concurso de robôs realizado na inteligência artificial da RoboCup 2000, concurso de robôs realizado na Dinamarca;

Dinamarca;

 AXAF (Advanced X-ray Astrophysics Facility): terceiro dos grandesAXAF (Advanced X-ray Astrophysics Facility): terceiro dos grandes

observatórios espaciais lançados pela NASA, tem a tarefa de simular em observatórios espaciais lançados pela NASA, tem a tarefa de simular em imagens os sinais recebidos do espaço, Lua é uma das linguagens utilizadas imagens os sinais recebidos do espaço, Lua é uma das linguagens utilizadas para tal;

(10)

 NASA: Lua foi a linguagem usada no controle dos níveis de concentração deNASA: Lua foi a linguagem usada no controle dos níveis de concentração de

gases perigosos na preparação para o lançamento de ônibus espacial. gases perigosos na preparação para o lançamento de ônibus espacial.

 Petrobras: principal usuária, utilizando principalmente em visualizações dePetrobras: principal usuária, utilizando principalmente em visualizações de

perfis geológicos. perfis geológicos.

1.5 CARACTERÍSTICAS PRINCIPAIS 1.5 CARACTERÍSTICAS PRINCIPAIS

1.5.1 Domínio de

1.5.1 Domínio de ProgramaçãoProgramação

Lua é uma linguagem de scripting, ou de extensão. Linguagens com este domínio Lua é uma linguagem de scripting, ou de extensão. Linguagens com este domínio tem a finalidade de estender funcionalidades de aplicações. Seu uso pode ser tanto tem a finalidade de estender funcionalidades de aplicações. Seu uso pode ser tanto como ferramentas de configuração e instalação em sistemas operacionais, como no como ferramentas de configuração e instalação em sistemas operacionais, como no Linux (tomsrtbt) que utiliza Lua, quanto nos games, no caso de Lu

Linux (tomsrtbt) que utiliza Lua, quanto nos games, no caso de Lua, em “Baldur‟sa, em “Baldur‟s Gate” em que é utilizada em comandos de debug mapeados e prompt para debug Gate” em que é utilizada em comandos de debug mapeados e prompt para debug em tempo real, no “ImpossibleCreatures” em Controle de IA, aparência de efeitos e em tempo real, no “ImpossibleCreatures” em Controle de IA, aparência de efeitos e

de outros elementos gráficos e também debug em

de outros elementos gráficos e também debug em tempo real, por exemplo.tempo real, por exemplo.

1.5.2 Paradigma 1.5.2 Paradigma

Lua é de paradigma imperativo, que lhe dá

Lua é de paradigma imperativo, que lhe dá eficiência, paradigma bem estabelecido eeficiência, paradigma bem estabelecido e eficiência. Mas oferece suporte para abstração de dados, para programação eficiência. Mas oferece suporte para abstração de dados, para programação Orientada a Objetos.

Orientada a Objetos.

1.5.3 Sintaxe 1.5.3 Sintaxe

Escrita na interseção das linguagens C e

(11)

FIGURA 2

FIGURA 2 – –Função fatorial em LuaFunção fatorial em Lua

1.6 DIFERENCIAIS 1.6 DIFERENCIAIS 1.6.1 Portabilidade 1.6.1 Portabilidade

Lua roda em praticamente todas as plataformas, como por exemplo: Windows, Lua roda em praticamente todas as plataformas, como por exemplo: Windows, WindowsCE, Unix, Mac OS, Symbian, Palm, BREW, PSII, Linux, Xbox e até mesmo WindowsCE, Unix, Mac OS, Symbian, Palm, BREW, PSII, Linux, Xbox e até mesmo em supercom

em supercomputadores Cray, entre outras, pois foi escrita em ANSI C ∩ ANSI C++,putadores Cray, entre outras, pois foi escrita em ANSI C ∩ ANSI C++, evitando “#ifdefs” e pontos obscuros do padrão.

evitando “#ifdefs” e pontos obscuros do padrão.

1.6.2 Simplicidade 1.6.2 Simplicidade

A linguagem Lua possui apenas um único tipo de estrutura de dados, as tabelas e A linguagem Lua possui apenas um único tipo de estrutura de dados, as tabelas e um único tipo numérico, o number

um único tipo numérico, o number (tipicamente double), além disso, utiliza de(tipicamente double), além disso, utiliza de mecanismos ao invés de políticas, como a

mecanismos ao invés de políticas, como a exemplo a orientação a objetos.exemplo a orientação a objetos. 1.6.3 Pequeno tamanho

1.6.3 Pequeno tamanho

Sua distribuição completa cabe confortavelmente em um disquete. Sua distribuição completa cabe confortavelmente em um disquete.

Apesar de grandes recursos, incluir Lua numa aplicação não aumenta em quase Apesar de grandes recursos, incluir Lua numa aplicação não aumenta em quase nada o seu tamanho, pois o pacote com sua versão atual, contendo o código-fonte, nada o seu tamanho, pois o pacote com sua versão atual, contendo o código-fonte, a documentação e exemplos, ocupa cerca de 212K comprimido e 860K a documentação e exemplos, ocupa cerca de 212K comprimido e 860K descompactado. Com interface bem definida, o núcleo tem menos de 100K e descompactado. Com interface bem definida, o núcleo tem menos de 100K e apresenta bibliotecas independentes, ou seja,

apresenta bibliotecas independentes, ou seja, removíveis.removíveis.

1.6.4 Acoplabilidade 1.6.4 Acoplabilidade

Lua é uma biblioteca em C, é rápida e pequena, pode ser facilmente embutida a Lua é uma biblioteca em C, é rápida e pequena, pode ser facilmente embutida a aplicações. Apresenta API simples e bem definida, com operações primitivas e aplicações. Apresenta API simples e bem definida, com operações primitivas e modelo de pilha. É possível estender programas, não só em C e C++, quanto em modelo de pilha. É possível estender programas, não só em C e C++, quanto em Java, Fortran, C#, Ada e até mesmo em outras linguagens de script, como Perl e Java, Fortran, C#, Ada e até mesmo em outras linguagens de script, como Perl e Ruby.

(12)

1.6.5 Eficiência 1.6.5 Eficiência

As execuções de programas independentes mostram Lua entre as mais rápidas das As execuções de programas independentes mostram Lua entre as mais rápidas das linguagens interpretadas com tipagem dinâmica. Porções substanciais de

linguagens interpretadas com tipagem dinâmica. Porções substanciais de aplicaçõesaplicações grandes são escritas em Lua.

grandes são escritas em Lua.

Para um arquivo com 100K, Lua o trata em 1,2 segundos, Perl em 5,3, e Python em Para um arquivo com 100K, Lua o trata em 1,2 segundos, Perl em 5,3, e Python em 16,8 segundos, já um arquivo com 1M, Lua o trata em 12 segundos, enquanto Perl e 16,8 segundos, já um arquivo com 1M, Lua o trata em 12 segundos, enquanto Perl e

Python derrubam a máquina (“trash”). Python derrubam a máquina (“trash”).

1.7 VALORES E TIPOS 1.7 VALORES E TIPOS

Em Lua, as variáveis globais não precisam ser declaradas, ou seja, ao se escrever o Em Lua, as variáveis globais não precisam ser declaradas, ou seja, ao se escrever o comando:

comando:

a = 1.5 a = 1.5

significa que a variável

significa que a variável aa é global. Outra característica fundamental é que naé global. Outra característica fundamental é que na

linguagem as variáveis não tem tipo

linguagem as variáveis não tem tipo associado, estes estão aos dados armazenadosassociado, estes estão aos dados armazenados nela. A variável

nela. A variável aa citada anteriormente adquiriu um tipo numérico e ao fazercitada anteriormente adquiriu um tipo numérico e ao fazer

posteriormente: posteriormente:

a = "Lua" a = "Lua"

ela passa a armazenar uma string. ela passa a armazenar uma string.

1.7.1 Variáveis Locais 1.7.1 Variáveis Locais

A definição de escopo local de uma variável pode ocorrer em qualquer lugar dentro A definição de escopo local de uma variável pode ocorrer em qualquer lugar dentro de um bloco de comandos, e seu escopo termina quando o bloco em que foi de um bloco de comandos, e seu escopo termina quando o bloco em que foi declarada também termina. Declarar uma variável local com mesmo nome de uma declarada também termina. Declarar uma variável local com mesmo nome de uma global obscurece temporariamente o acesso à variável global.

global obscurece temporariamente o acesso à variável global. Como exemplo, segueComo exemplo, segue o código abaixo:

o código abaixo:

a = 2

(13)

if a > 0 then if a > 0 then

local b = a

local b = a ––- cria variável local b- cria variável local b

a = a + 1

a = a + 1 ––- incrementa a variável global a- incrementa a variável global a

local a = b

local a = b ––- cria variável local a- cria variável local a

print(a) print(a) end end print(a) print(a)

Em Lua os comentários são feitos

Em Lua os comentários são feitos utilizando dois hifens seguidos (utilizando dois hifens seguidos (----).).

No primeiro

No primeiro printprint, imprime-se o valor, imprime-se o valor 22, pois se refere a variável local, pois se refere a variável local aa, , nono

segundo, por já estar fora do escopo de

segundo, por já estar fora do escopo de aa ee bb (locais), delimitado pelo(locais), delimitado pelo endend, o valor a, o valor a

ser impresso será o

ser impresso será o 33, pois a variável, pois a variável aareferida é global.referida é global.

É possível ainda declarar e inicializar várias variáveis locais em um mesmo É possível ainda declarar e inicializar várias variáveis locais em um mesmo comando:

comando:

local a, b, c = 2, 5+6, -3 local a, b, c = 2, 5+6, -3

Neste caso,

Neste caso, aarecebe o valorrecebe o valor 22,, bb receberecebe1111 ee cc receberecebe-3-3. As variáveis locais que. As variáveis locais que

não forem inicializadas assumem valor

não forem inicializadas assumem valor nilnil..

1.7.2 Tipos 1.7.2 Tipos

Existem oito tipos de dados em Existem oito tipos de dados em Lua:Lua:

  Nil;Nil;   Boolean;Boolean;   Number;Number;   String;String;   Table;Table;   Function;Function;   Userdata;Userdata;   Thread.Thread. 1.7.2.1 Nil 1.7.2.1 Nil

(14)

Representa o valor indefinido. Todas as variáveis que ainda não foram inicializadas Representa o valor indefinido. Todas as variáveis que ainda não foram inicializadas assumem o valor

assumem o valor nilnil. Portanto no código:. Portanto no código:

a = b a = b

sem que haja qualquer atribuição à variável

sem que haja qualquer atribuição à variável bb,, bb passa a assumir o conteúdo depassa a assumir o conteúdo de

valor nil, o que significa que

valor nil, o que significa que aa passa a armazenarpassa a armazenar nilnil também, também, independentemeindependentementente

do valor anteriormente armazenado em

do valor anteriormente armazenado em aa. A palavra reservada. A palavra reservada nilnil pode serpode ser

utilizada na programação para expressar o valor do

utilizada na programação para expressar o valor do tipotipo nilnil. Com isso:. Com isso:

a = nil a = nil

atribuindo o valor

atribuindo o valor nilnil à variávelà variável aa (a partir deste ponto, é como se a variável(a partir deste ponto, é como se a variável aa aindaainda

não tivesse sido atribuída). não tivesse sido atribuída).

Também há como testar se uma variável foi ou não inicializada, comparando seu Também há como testar se uma variável foi ou não inicializada, comparando seu valor com

valor com nilnil::

a == nil a == nil..

O

O nilnil também é interpretado como falso numa expressão booleana.também é interpretado como falso numa expressão booleana.

1.7.2.2 Boolean 1.7.2.2 Boolean

Valor booleano, podendo ser falso (

Valor booleano, podendo ser falso (falsefalse) ou verdadeiro () ou verdadeiro (truetrue). Uma expressão). Uma expressão

será considerada falsa caso seja igual à

será considerada falsa caso seja igual à nilnil, como dito anteriormente, ou, como dito anteriormente, ou

verdadeira caso contrário, inclusive quando igual a 0. verdadeira caso contrário, inclusive quando igual a 0.

1.7.2.3 Number 1.7.2.3 Number

Lua não faz distinção entre valores numéricos com valores inteiros e reais, há um Lua não faz distinção entre valores numéricos com valores inteiros e reais, há um tipo para representá-los, o number, que é ponto flutuante por padrão, podendo tipo para representá-los, o number, que é ponto flutuante por padrão, podendo representar um número inteiro de até 32 bits. Podendo ser feito:

representar um número inteiro de até 32 bits. Podendo ser feito:

a = 4 a = 4 b = 4.0 b = 4.0

(15)

c = 0.4e1 c = 0.4e1 d = 40e-1 d = 40e-1

armazenando o valor numérico quatro nas variáveis

armazenando o valor numérico quatro nas variáveis aa,, bb,, cc eedd..

1.7.2.4 String 1.7.2.4 String

Representa uma cadeia de caracteres, podendo ser delimitada por aspas duplas Representa uma cadeia de caracteres, podendo ser delimitada por aspas duplas ((""...""), aspas simples (), aspas simples (''...''), ou duplos colchetes (), ou duplos colchetes ([[[[...]]]]). Se uma cadeia começa). Se uma cadeia começa

com aspas simples, ela deve terminar com aspas simples, do mesmo para as com aspas simples, ela deve terminar com aspas simples, do mesmo para as duplas. Os duplos colchetes são utilizados para cadeias que se estendem por várias duplas. Os duplos colchetes são utilizados para cadeias que se estendem por várias linhas.

linhas.

Esse tipo é imutável em Lua, toda vez que a cadeia é alterada, na verdade, cria-se Esse tipo é imutável em Lua, toda vez que a cadeia é alterada, na verdade, cria-se uma nova.

uma nova.

Dentro de uma string são

Dentro de uma string são interpretadas as sequências de escape:interpretadas as sequências de escape:

\n

\n new linenew line \t

\t TabTab

\r

\r carriage returncarriage return \v

\v vertical tabvertical tab \f

\f form feedform feed \xxx

\xxx caracter com código decimal xxxcaracter com código decimal xxx \a

\a bellbell

\b

\b backspacebackspace \"

\" aspas duplas (“)aspas duplas (“) \'

\' aspas simples („)aspas simples („) \\

\\ barra invertida (\)barra invertida (\)

No entanto, ao delimitar uma cadeia de caracteres com aspas duplas, por exemplo, No entanto, ao delimitar uma cadeia de caracteres com aspas duplas, por exemplo, pode-se utilizar de aspas simples no seu conteúdo sem que haja a necessidade de pode-se utilizar de aspas simples no seu conteúdo sem que haja a necessidade de tratá-la como sequência de escape. Assim, são válidas e equivalentes as seguintes tratá-la como sequência de escape. Assim, são válidas e equivalentes as seguintes atribuições: atribuições: s = "olho d'agua" s = "olho d'agua" s = 'olho d\'agua' s = 'olho d\'agua' 1.7.2.4.1 Concatenação 1.7.2.4.1 Concatenação

Para concatenar duas strings, utiliza-se

Para concatenar duas strings, utiliza-se do operador de concatenação (do operador de concatenação (....), como no), como no

exemplo abaixo: exemplo abaixo:

(16)

a = "seg" .. "unda" a = "seg" .. "unda" b = "feira"

b = "feira"

print (a .. "-" ..

print (a .. "-" .. b) -- imprime segunda-feirab) -- imprime segunda-feira

Seja

Seja tt uma tabela Lua que representa um array onde os elementos são cadeias deuma tabela Lua que representa um array onde os elementos são cadeias de

caracteres. O objetivo é escrever um programa que cria uma cadeia com todos os caracteres. O objetivo é escrever um programa que cria uma cadeia com todos os elementos de

elementos de tt separados por vírgulas e depois imprime a string resultante. Umaseparados por vírgulas e depois imprime a string resultante. Uma

maneira simples de escrever está ilustrada abaixo: maneira simples de escrever está ilustrada abaixo:

local s = "" local s = "" for i, v in ipairs (t) do for i, v in ipairs (t) do s = s .. v .. s = s .. v .. ",""," end end print (string.sub (s, 1, #s - 1)) print (string.sub (s, 1, #s - 1)) Caso

Caso tt tenha poucos elementos, o desempenho desse programa será satisfatório.tenha poucos elementos, o desempenho desse programa será satisfatório.

Caso contrário, a execução do programa iria demorar mais do que o esperado. Caso contrário, a execução do programa iria demorar mais do que o esperado. Como em Lua cada cadeia de caracteres é única, a criação de várias novas cadeias Como em Lua cada cadeia de caracteres é única, a criação de várias novas cadeias é um pouco custoso, de forma que é possível evitá-la com uma solução mais é um pouco custoso, de forma que é possível evitá-la com uma solução mais eficiente, através da função

eficiente, através da função table.concattable.concat, para concatenar várias cadeias,, para concatenar várias cadeias,

recebendo uma tabela como primeiro parâmetro e uma string como segundo, que recebendo uma tabela como primeiro parâmetro e uma string como segundo, que será usada como separador dos elementos da tabela. A mesma tarefa do programa será usada como separador dos elementos da tabela. A mesma tarefa do programa anterior pode realizada neste que segue abaixo:

anterior pode realizada neste que segue abaixo:

local s = table.concat (t, ",") local s = table.concat (t, ",") print (s) print (s) 1.7.2.5 Table 1.7.2.5 Table

As tabelas (table) são a única forma de estruturação de dados em Lua, representam As tabelas (table) são a única forma de estruturação de dados em Lua, representam um vetor associativo, implementado internamente com o uso de uma eficiente um vetor associativo, implementado internamente com o uso de uma eficiente combinação de array e hash (tabela de dispersão). Com as tabelas podem-se combinação de array e hash (tabela de dispersão). Com as tabelas podem-se representar vetores, listas, filas, tabelas de símbolos, conjuntos, grafos, registros e representar vetores, listas, filas, tabelas de símbolos, conjuntos, grafos, registros e hash. Uma variável do tipo table pode ser indexada por valores de qualquer tipo, hash. Uma variável do tipo table pode ser indexada por valores de qualquer tipo, com exceção do tipo nil.

com exceção do tipo nil.

Uma tabela deve ser explicitamente criada antes de ser usada, a criação é feita pela Uma tabela deve ser explicitamente criada antes de ser usada, a criação é feita pela expressão

(17)

variável de nome

variável de nome tt. Daí, a variável. Daí, a variável tt armazena um valor do tipo table e pode entãoarmazena um valor do tipo table e pode então

ser indexada. É válido escrever, por

ser indexada. É válido escrever, por exemplo:exemplo:

t[1] = 13 t[1] = 13 t[45] = 56 t[45] = 56

Não há limite para a indexação da tabela. Se necessário, Lua redimensiona a tabela Não há limite para a indexação da tabela. Se necessário, Lua redimensiona a tabela automaticamente. Além disso, também é valido escrever:

automaticamente. Além disso, também é valido escrever:

t["nome"] = t[1] + 2 t["nome"] = t[1] + 2

Ou seja, a tabela

Ou seja, a tabela tt indexada pelo valor stringindexada pelo valor string nomenome recebe o valor armazenado narecebe o valor armazenado na

tabela

tabela tt indexada pelo valorindexada pelo valor 11 (que é(que é 1313) somado com o valor) somado com o valor 22. Isto é,. Isto é, tt indexadoindexado

por

por nomenome valevale 1515..

Lua oferece uma sintaxe simplificada quando o índice é uma string simples (desde Lua oferece uma sintaxe simplificada quando o índice é uma string simples (desde que a string não seja uma palavra reservada da sintaxe da linguagem). Assim, a que a string não seja uma palavra reservada da sintaxe da linguagem). Assim, a atribuição anterior

atribuição anterior t["nome"] = t[1]+2t["nome"] = t[1]+2 pode ser escrita porpode ser escrita por t.nome = t[1]+2t.nome = t[1]+2..

Como dito, esta notação é para string simples, portanto não é possível fazer o Como dito, esta notação é para string simples, portanto não é possível fazer o mesmo no exemplo abaixo, por se tratar

mesmo no exemplo abaixo, por se tratar de uma string composta:de uma string composta:

t[“Rio de Janeiro

t[“Rio de Janeiro"] = 1994"] = 1994

Também é válido escrever: Também é válido escrever:

t[t] = 5 t[t] = 5

que significa que a tabela

que significa que a tabela tt indexada pelo valorindexada pelo valor tt (própria tabela) armazena o valor(própria tabela) armazena o valor

numérico numérico55..

As atribuições abaixo também são válidas para a

As atribuições abaixo também são válidas para a tabelatabela tt::

t[10] =

t[10] = "exemplifica"exemplificando"ndo" t[2.34] = 12 t[2.34] = 12 t.tabela, t[0] = 3, 12 t.tabela, t[0] = 3, 12 t[-234] = 0 t[-234] = 0 a = "Lua" a = "Lua" t[a] = 5 t[a] = 5

Quanto à última atribuição é necessária uma análise minuciosa. A variável Quanto à última atribuição é necessária uma análise minuciosa. A variável aa

armazena o valor

armazena o valor LuaLua, a última atribuição armazena, a última atribuição armazena 55 no índiceno índice LuaLua da tabela.da tabela.

Escrever

Escrever t[a]t[a] é diferente deé diferente de t.at.a, que é equivalente a, que é equivalente a t["a"]t["a"]. . Assim, Assim, nono

exemplo,

(18)

Se o valor de uma tabela para qualquer índice cuja indexação ainda não foi Se o valor de uma tabela para qualquer índice cuja indexação ainda não foi inicializada recebe nil. Portanto, considerando apenas as atribuições anteriormente inicializada recebe nil. Portanto, considerando apenas as atribuições anteriormente exemplificadas, o código:

exemplificadas, o código: print (t[999])print (t[999]) imprimirá o valorimprimirá o valor nilnil, pois o campo, pois o campo 999

999 dede tt não foi inicializado.não foi inicializado.

Há a possibilidade do armazenamento de tabelas em outras tabelas, criando Há a possibilidade do armazenamento de tabelas em outras tabelas, criando conjuntos multidimensionais, como no exemplo:

conjuntos multidimensionais, como no exemplo:

m = { } m = { } m[1] = { } m[1] = { } m[2] = { } m[2] = { } m[1][1] = 1.0 m[1][1] = 1.0 m[2][1] = 0.0 m[2][1] = 0.0

Assim, também é válido: Assim, também é válido:

s = { } s = { }

s.dados = { } s.dados = { }

s.dados.nome = "Linguagem Lua" s.dados.nome = "Linguagem Lua" s.dados.versa

s.dados.versao = o = 3.03.0

1.7.2.5.1

1.7.2.5.1 Inicialização Inicialização de de tabelastabelas 1.7.2.5.1.1 Via indexação consecutiva 1.7.2.5.1.1 Via indexação consecutiva Lua permite a inicialização de tabelas na

Lua permite a inicialização de tabelas na criação.criação. Uma forma possível para inicialização de tabelas é Uma forma possível para inicialização de tabelas é

{expr1, expr2, ..., exprN} {expr1, expr2, ..., exprN}

Isto é, escreve-se uma lista de expressões entre as chaves que criam a tabela. Cada Isto é, escreve-se uma lista de expressões entre as chaves que criam a tabela. Cada expressão listada é avaliada e seu valor armazenado no índice correspondente: o expressão listada é avaliada e seu valor armazenado no índice correspondente: o valor da primeira expressão é armazenado no índice 1

valor da primeira expressão é armazenado no índice 1 da tabela, o valor da da tabela, o valor da segundasegunda expressão no índice 2, e assim por diante. Portanto:

expressão no índice 2, e assim por diante. Portanto: t = {23, 45, -7, "Lua",t = {23, 45, -7, "Lua", 6+4} 6+4} é equivalente à:é equivalente à: t = { } t = { } t[1] = 23 t[1] = 23 t[2] = 45 t[2] = 45 t[3] = -7 t[3] = -7 t[4] = "Lua" t[4] = "Lua" t[5] = 6+4 t[5] = 6+4

(19)

1.7.2.5.1.2

1.7.2.5.1.2 Via Via atribuição atribuição de de camposcampos Lua permite também a inicialização de

Lua permite também a inicialização de campos da tabela, sua forma geral é:campos da tabela, sua forma geral é:

{ [

{ [exprA exprA ] =] = expr1expr1, [, [exprBexprB] =] = expr2expr2, ... }, ... }

Ou seja, na criação de

Ou seja, na criação de tabelas a inicialização de qualquer tipo de tabelas a inicialização de qualquer tipo de campo (que acampo (que a tabela pode armazenar) é possível. Assim:

tabela pode armazenar) é possível. Assim:

t = { nome = "Linguagem Lua", [1] = 3.0, [f(x)] = g(y) } t = { nome = "Linguagem Lua", [1] = 3.0, [f(x)] = g(y) }

equivale a equivale a

t = { } t = { }

t.nome = "Linguagem Lua" t.nome = "Linguagem Lua" t[1] = 3.0

t[1] = 3.0

t.[f(x)] = g(y) t.[f(x)] = g(y)

1.7.2.5.1.3

1.7.2.5.1.3 Inicialização Inicialização mistamista

Há a possibilidade de combinação das duas maneiras de inicialização mostradas Há a possibilidade de combinação das duas maneiras de inicialização mostradas anteriormente. A forma geral é:

anteriormente. A forma geral é:

tabela

tabela = {= {lista-de-expressõeslista-de-expressões;; lista-de-atribuições-de-camposlista-de-atribuições-de-campos}}

Dessa forma, a lista de expressões de uma inicialização por indexação pode vir Dessa forma, a lista de expressões de uma inicialização por indexação pode vir seguida do ponto e vírgula (

seguida do ponto e vírgula (;;) enquanto a lista de atribuições de campos por nomes.) enquanto a lista de atribuições de campos por nomes.

Escrever: Escrever:

t =

t = {23, 45, -7 {23, 45, -7 ; nome="Linguagem Lua",versao=; nome="Linguagem Lua",versao=3.0,[4]=80}3.0,[4]=80}

equivale a: equivale a: t = { } t = { } t[1] = 23 t[1] = 23 t[2] = 45 t[2] = 45 t[3] = -7 t[3] = -7

t.nome = "Linguagem Lua" t.nome = "Linguagem Lua" t.versao = 3.0

t.versao = 3.0 t[4] = 8

(20)

Se uma tabela estiver sendo utilizada como um array, é possível saber o número de Se uma tabela estiver sendo utilizada como um array, é possível saber o número de elementos do array usando o operador de tamanho

elementos do array usando o operador de tamanho ##. Este operador retorna um. Este operador retorna um

índice

índice n n do array desde que o valor da posiçãodo array desde que o valor da posição n n do array seja diferente dedo array seja diferente de nilnil ee

que o valor na posição

que o valor na posição n+1n+1 sejaseja nilnil. Podendo apresentar falhas quando trabalhado. Podendo apresentar falhas quando trabalhado

com um array que contém valores

com um array que contém valores nilnil..

O funcionamento do

O funcionamento do ## pode assim ser pode assim ser exemplificado:exemplificado:

local t = {"a", "b", "c"} local t = {"a", "b", "c"} print (#t)

print (#t) ––-valor impresso: 3-valor impresso: 3

table.insert (t, "d") table.insert (t, "d")

print (#t) --valor impresso: 4 print (#t) --valor impresso: 4 t [6] = "8"

t [6] = "8"

-- Tem-se um valor nil no

-- Tem-se um valor nil no meio do array (t[5]). O operador demeio do array (t[5]). O operador de --tamanho não tem um comportamento bem definido neste caso 11 --tamanho não tem um comportamento bem definido neste caso 11 print (#t) -- ??

print (#t) -- ?? t [5] = "e"

t [5] = "e"

-- Agora o array não

-- Agora o array não tem "buracos" e o operador # retorna otem "buracos" e o operador # retorna o -- valor esperado

-- valor esperado print (#t) --> 6 print (#t) --> 6

Duas funções de iteração sobre os elementos armazenados na tabela são Duas funções de iteração sobre os elementos armazenados na tabela são oferecidas na biblioteca padrão de Lua.

oferecidas na biblioteca padrão de Lua.

 IpairsIpairs

Itera sobre os índices numéricos armazenados na tabela. Assim, Itera sobre os índices numéricos armazenados na tabela. Assim,

for i,v in

for i,v in ipairs(t) do...endipairs(t) do...end

itera sobre os pares

itera sobre os pares (1,t[1])(1,t[1]),,(2,t[2])(2,t[2]),…, at,…, até que o primeiro índice com valoré que o primeiro índice com valor

associado igual a

associado igual a nilnil seja encontrado.seja encontrado.

 PairsPairs

Permite iterar sobre todos os pares armazenados na tabela, independente do tipo Permite iterar sobre todos os pares armazenados na tabela, independente do tipo associado ao índice:

associado ao índice:

for k,v in pairs(t) do

for k,v in pairs(t) do …… endend

Onde, a ordem dos pares

Onde, a ordem dos pares kk,, vv são reportados é indefinida.são reportados é indefinida.

Lua permite a especificação de um “construtor” na criação

Lua permite a especificação de um “construtor” na criação de tabelas. Por exemplo,de tabelas. Por exemplo,

um ponto 3D, dado pelas suas

(21)

local p

local p = Point{x=3.0,y=1.3,z=3.= Point{x=3.0,y=1.3,z=3.2}2}

Esse código é equivalente a: Esse código é equivalente a:

local p

local p = = Point({x=3.0Point({x=3.0,y=1.3,z=3.2},y=1.3,z=3.2}))

A tabela foi criada, chamou a função Point passando a nova tabela como parâmetro. A tabela foi criada, chamou a função Point passando a nova tabela como parâmetro. Essa função pode ser o construtor do objeto sendo criado. Usando a função, Essa função pode ser o construtor do objeto sendo criado. Usando a função, pode-se, por exemplo, validar e

se, por exemplo, validar e inicializar campos do objeto, desta forma:inicializar campos do objeto, desta forma:

function Point (self) function Point (self)

self.x = tonumber(self.x) or 0.0 self.x = tonumber(self.x) or 0.0 self.x = tonumber(self.y) or 0.0 self.x = tonumber(self.y) or 0.0 self.x = tonumber(self.z) or 0.0 self.x = tonumber(self.z) or 0.0 return self return self end end

Dessa forma, se ao criar o objeto os valores de suas coordenadas não tiverem sido Dessa forma, se ao criar o objeto os valores de suas coordenadas não tiverem sido especificados, então a função os inicializa com zero.

especificados, então a função os inicializa com zero.

1.7.2.6 Function 1.7.2.6 Function

Function são as funções da linguagem, que em Lua são tratadas como valores de Function são as funções da linguagem, que em Lua são tratadas como valores de primeira classe, o que significa que é possível armazená-las em variáveis (globais primeira classe, o que significa que é possível armazená-las em variáveis (globais ou locais) ou em

ou locais) ou em campo de tabela, passa-las como parâmetro para outras fcampo de tabela, passa-las como parâmetro para outras funções.unções.

1.7.2.6.1 Declarando e chamando uma

1.7.2.6.1 Declarando e chamando uma funçãofunção A declaração da função pode ser da

A declaração da função pode ser da seguinte forma:seguinte forma:

function nomedafuncão (arg_1, arg_2, ...,

function nomedafuncão (arg_1, arg_2, ..., arg_n)arg_n) corpoDaFuncão

corpoDaFuncão end

end

Onde as variáveis

Onde as variáveis arg_Narg_N indicam os parâmetros da função. Em Lua, uma funçãoindicam os parâmetros da função. Em Lua, uma função

pode ter desde nenhum até centenas de parâmetros. Assim, uma função pode pode ter desde nenhum até centenas de parâmetros. Assim, uma função pode retornar vários valores ou nenhum.

retornar vários valores ou nenhum. Como exemplo a função

Como exemplo a função ff, que recebe dois parâmetros e retorna a soma e o, que recebe dois parâmetros e retorna a soma e o

produto deles: produto deles:

(22)

function f (a, b) function f (a, b)

local x = a or 1 -- x

local x = a or 1 -- x recebe o valor padrão 1 quando a érecebe o valor padrão 1 quando a é -- um valor falso

-- um valor falso

local y = b or 1 -- y

local y = b or 1 -- y recebe o valor padrão 1 quando b érecebe o valor padrão 1 quando b é -- um valor falso -- um valor falso return x + y, x * y return x + y, x * y end end

Mesmo possuindo dois parâmetros, é possível chamar a função

Mesmo possuindo dois parâmetros, é possível chamar a função ff com quantidadecom quantidade

diferente de parâmetros. Se

diferente de parâmetros. Se ff for chamada com mais parâmetros do que ofor chamada com mais parâmetros do que o

esperado, os valores excedentes serão descartados, caso o valor de parâmetros esperado, os valores excedentes serão descartados, caso o valor de parâmetros sejam menores, os valores dos parâmetros não fornecidos será

sejam menores, os valores dos parâmetros não fornecidos será nilnil. Pode-se. Pode-se

perceber tal comportamento no exemplo abaixo: perceber tal comportamento no exemplo abaixo:

s, p = f (3, 4)-- a é

s, p = f (3, 4)-- a é 3 e b é 43 e b é 4 print (s, p) -- imprime 7 12 print (s, p) -- imprime 7 12 s, p = f (2) -- b

s, p = f (2) -- b é nil e y é inicializado com 1é nil e y é inicializado com 1 print (s, p) -- imprime 3 2 print (s, p) -- imprime 3 2 s, p = f (2, 5, 8) s, p = f (2, 5, 8) -- 8 é descartado-- 8 é descartado print (s, p) -- imprime 7 10 print (s, p) -- imprime 7 10 print (f ()) -- imprime 2 1 print (f ()) -- imprime 2 1 1.7.2.6.2 Número variável de

1.7.2.6.2 Número variável de parâmetrosparâmetros

As funções com número variável de parâmetros são declaradas utilizando três As funções com número variável de parâmetros são declaradas utilizando três pontos

pontos (...)(...) . Para acessar os parâmetros que foram chamados, usa-se a notação. Para acessar os parâmetros que foram chamados, usa-se a notação {...}

{...}, para criação de um array onde o primeiro parâmetro da função está na, para criação de um array onde o primeiro parâmetro da função está na

posição 1, o segundo na 2 e assim sucessivamente. A seguir, o exemplo mostra posição 1, o segundo na 2 e assim sucessivamente. A seguir, o exemplo mostra uma função que recebe strings e i

uma função que recebe strings e imprime aquelas com tamanho maior do que 3.mprime aquelas com tamanho maior do que 3.

FIGURA 3

(23)

1.7.2.6.3 Retorno de um único valor 1.7.2.6.3 Retorno de um único valor

Como dito anteriormente, em Lua pode-se retornar nenhum, apenas um ou múltiplos Como dito anteriormente, em Lua pode-se retornar nenhum, apenas um ou múltiplos valores. Porém, nem sempre é possível obter todos os valores retornados por uma valores. Porém, nem sempre é possível obter todos os valores retornados por uma função.

função.

Quando se avalia uma lista de expressões, somente será obtido o primeiro valor de Quando se avalia uma lista de expressões, somente será obtido o primeiro valor de retorno de cada membro da lista, com exceção da última expressão, que pode retorno de cada membro da lista, com exceção da última expressão, que pode retornar múltiplos valores normalmente. O uso abaixo da função

retornar múltiplos valores normalmente. O uso abaixo da função ff definidadefinida

anteriormente ilustra este caso: anteriormente ilustra este caso:

a, b, c, d = f (1,

a, b, c, d = f (1, 2), f (3, 4), f (5, 6)2), f (3, 4), f (5, 6) print (a, b, c, d) -- imprime 3 7 11 30 print (a, b, c, d) -- imprime 3 7 11 30

Notou-se que a chamada

Notou-se que a chamada f(1,2)f(1,2) retornou apenas o valorretornou apenas o valor 33, o mesmo aconteceu, o mesmo aconteceu

para

para f(3,4)f(3,4), que retornou o valor, que retornou o valor 77. Já a chamada. Já a chamada f(5,6)f(5,6), por ser a última, por ser a última

expressão da lista de expressão, retornou dois valores,

expressão da lista de expressão, retornou dois valores, 1111 ee 3030..

Às vezes, faz-se necessário que uma chamada de função r

Às vezes, faz-se necessário que uma chamada de função retorne somente um valor,etorne somente um valor, não importando se a chamada de função faz parte de uma lista de expressões ou não importando se a chamada de função faz parte de uma lista de expressões ou não. Nesse caso, deve-se colocar parênteses ao redor da chamada de função, não. Nesse caso, deve-se colocar parênteses ao redor da chamada de função, limitando o número de valores de retorno da função a no máximo 1, como no limitando o número de valores de retorno da função a no máximo 1, como no exemplo a seguir:

exemplo a seguir:

a, b = f (5, 10) a, b = f (5, 10)

print (a, b) -- imprime 15 print (a, b) -- imprime 15 5050 a, b = (f (5, 10))

a, b = (f (5, 10))

print (a, b) -- imprime 15 print (a, b) -- imprime 15 nilnil a, b, c = f (1, 2), (f

a, b, c = f (1, 2), (f (3, 4))(3, 4))

print (a, b, c) -- imprime 3 7 nil print (a, b, c) -- imprime 3 7 nil

1.7.2.7 Userdata 1.7.2.7 Userdata

Este tipo é um dado do host, representado por um ponteiro

Este tipo é um dado do host, representado por um ponteiro void*void*. São utilizados. São utilizados

para armazenar dados C em variáveis Lua. A criação e alteração do userdata só para armazenar dados C em variáveis Lua. A criação e alteração do userdata só pode ser feita por meio da API de Lua em C.

(24)

Um objeto do tipo

Um objeto do tipo userdata userdata , da mesma forma que uma tabela, somente é, da mesma forma que uma tabela, somente é

igual a ele mesmo. Para ilustrar o uso de

igual a ele mesmo. Para ilustrar o uso de userdata userdata , vamos definir em C uma, vamos definir em C uma

estrutura que irá representar um buffer circular. estrutura que irá representar um buffer circular.

typedef struct CircBuffer { typedef struct CircBuffer { int start, end;

int start, end; int n, size; int n, size; int array [1]; int array [1]; } CircBuffer; } CircBuffer; As variáveis

As variáveis start start ee end end guardam, respectivamente, as posições de início eguardam, respectivamente, as posições de início e

fim do buffer. A variável

fim do buffer. A variáveln n irá armazenar o número de elementos atualmenteirá armazenar o número de elementos atualmente

no buffer, ao passo que

no buffer, ao passo que size size representa o número máximo de elementosrepresenta o número máximo de elementos

que o buffer pode armazenar. A variável array representa o buffer e será que o buffer pode armazenar. A variável array representa o buffer e será inicializada com um tamanho adequado quando o buffer for criado. inicializada com um tamanho adequado quando o buffer for criado. Inicialmente array possui tamanho 1, uma vez que não é possível criar um Inicialmente array possui tamanho 1, uma vez que não é possível criar um array com tamanho 0 em C 89.

array com tamanho 0 em C 89.

O trecho de código a seguir mostra a função que cria um novo buffer O trecho de código a seguir mostra a função que cria um novo buffer circular:

circular:

01 static int buffernew (lua_State *L) { 01 static int buffernew (lua_State *L) { 02 int n; 02 int n; 03 size_t bsize; 03 size_t bsize; 04 CircBuffer *cb; 04 CircBuffer *cb; 05 05 06 n = luaL_checkinteger (L, 1); 06 n = luaL_checkinteger (L, 1);

07 luaL_argcheck (L, n >= 1, 1, "invalid buffer size"); 07 luaL_argcheck (L, n >= 1, 1, "invalid buffer size"); 08 bsize = sizeof (CircBuffer) + (n - 1) *

08 bsize = sizeof (CircBuffer) + (n - 1) * sizeof (int);sizeof (int); 09 cb = (CircBuffer *) lua_newuserdata (L, bsize);

09 cb = (CircBuffer *) lua_newuserdata (L, bsize); 10 10 11 cb->size = n; 11 cb->size = n; 12 cb->start = 0; 12 cb->start = 0; 13 cb->end = 0; 13 cb->end = 0; 14 cb->n = 0; 14 cb->n = 0; 15 15 16 return 1; 16 return 1; 17 } 17 } A função

A função luaL_argcheck luaL_argcheck é útil para gerar mensagens de erro sobre algumé útil para gerar mensagens de erro sobre algum

argumento da função. O segundo parâmetro de

argumento da função. O segundo parâmetro deluaL_argcheck luaL_argcheck é a condiçãoé a condição

a ser testada, o terceiro parâmetro indica qual argumento está sendo a ser testada, o terceiro parâmetro indica qual argumento está sendo testado e o último parâmetro especifica uma parte da mensagem de erro. testado e o último parâmetro especifica uma parte da mensagem de erro. Assumindo que

Assumindo que buffer.new buffer.new seja a função Lua equivalente paraseja a função Lua equivalente para buffernew buffernew ,,

no caso da chamada a seguir: no caso da chamada a seguir:

buffer.new (0) buffer.new (0)

teríamos a seguinte mensagem de erro: teríamos a seguinte mensagem de erro:

stdin:1: bad argument #1 to 'new' (invalid buffer size) stdin:1: bad argument #1 to 'new' (invalid buffer size)

(Lua

(Lua – – Conceitos Básicos e API C. LabLua, Agosto de 2008. Capítulo 9,Conceitos Básicos e API C. LabLua, Agosto de 2008. Capítulo 9,

páginas 56 e 57). páginas 56 e 57).

1.7.2.8 Thread 1.7.2.8 Thread

Os valores do tipo thread representam fluxos de execução independentes. São Os valores do tipo thread representam fluxos de execução independentes. São utilizados em co-rotinas de Lua.

(25)

1.7.2.8.1 Co-rotinas 1.7.2.8.1 Co-rotinas

Co-rotinas são um poderoso mecanismo de programação para jogos. Uma Co-rotinas são um poderoso mecanismo de programação para jogos. Uma co-rotina é semelhante a um

co-rotina é semelhante a um thread thread num sistema denum sistema de multithreading multithreading , , nono

sentido de que temos uma linha de execução com seu próprio ambiente sentido de que temos uma linha de execução com seu próprio ambiente local (pilha de execução) compartilhando o ambiente global com outras local (pilha de execução) compartilhando o ambiente global com outras co-rotinas. A grande diferença entre uma co-rotina e uma função é que a rotinas. A grande diferença entre uma co-rotina e uma função é que a execução de uma co-rotina pode ser suspensa e retomada posteriormente execução de uma co-rotina pode ser suspensa e retomada posteriormente (no ponto em que foi suspensa). A diferença entre co-rotinas e

(no ponto em que foi suspensa). A diferença entre co-rotinas e threads threads éé

que, conceitualmente, diferentes

que, conceitualmente, diferentes threads threads  executam simultaneamente,executam simultaneamente,

enquanto que num sistema com co-rotinas, apenas uma co-rotina executa enquanto que num sistema com co-rotinas, apenas uma co-rotina executa por vez.

por vez.

As funções que manipulam co-rotinas estão agrupadas na tabela As funções que manipulam co-rotinas estão agrupadas na tabela

coroutine

coroutine. Criamos uma co-rotina passando uma função (em geral,. Criamos uma co-rotina passando uma função (em geral,

anômina) para a função de criação, que retorna um valor do tipo thread: anômina) para a função de criação, que retorna um valor do tipo thread:

local c = coroutine.create(function () ... end) local c = coroutine.create(function () ... end) print(type(

print(type(c)) --> c)) --> "thread""thread"

(A Linguagem Lua e suas Aplicações em Jogos. Celes, Waldemar; (A Linguagem Lua e suas Aplicações em Jogos. Celes, Waldemar; Figueiredo, Luiz Henrique de; Ierusalimschy, Roberto. 2004

Figueiredo, Luiz Henrique de; Ierusalimschy, Roberto. 2004 – –Página: 11,Página: 11,

tópico: 3.8). tópico: 3.8).

1.7.3 Coerção 1.7.3 Coerção

Lua possui alguns mecanismos de conversão automática de tipos. Qualquer Lua possui alguns mecanismos de conversão automática de tipos. Qualquer operação aplicada sobre uma string há uma tentativa de conversão dela em um operação aplicada sobre uma string há uma tentativa de conversão dela em um valor numérico correspondente. Ou seja, se a string contém um valor numérico, valor numérico correspondente. Ou seja, se a string contém um valor numérico, então este valor é assumido na operação aritmética. Quando esta conversão não for então este valor é assumido na operação aritmética. Quando esta conversão não for possível, um erro é

possível, um erro é reportado pela linguagem. Portando, o código:reportado pela linguagem. Portando, o código:

b = "53" b = "53" c = 2 + b c = 2 + b

resulta no armazenamento do valor numérico

resulta no armazenamento do valor numérico 5555 na variávelna variável cc..

Já quando se utiliza um valor numérico onde deveria conter uma string, por exemplo, Já quando se utiliza um valor numérico onde deveria conter uma string, por exemplo, uma concatenação, este valor é convertido para uma cadeia de caracteres. Assim, o uma concatenação, este valor é convertido para uma cadeia de caracteres. Assim, o código:

código:

print("result

print("resultado: " .. ado: " .. 23)23)

tem como saída uma string: tem como saída uma string:

resultado: 23 resultado: 23..

(26)

Existem funções pré-definidas para as conversões anteriores sejam feitas Existem funções pré-definidas para as conversões anteriores sejam feitas explicitamente, o

explicitamente, o tonumbertonumber para conversão de string para forma numérica epara conversão de string para forma numérica e tostring

tostring para converter um valor numérico para uma para converter um valor numérico para uma cadeia de caracteres.cadeia de caracteres.

1.8 EXPRESSÕES E ATRIBUIÇÃO 1.8 EXPRESSÕES E ATRIBUIÇÃO

1.8.1 Operadores 1.8.1 Operadores

Os operadores oferecidos por Lua são basicamente os aritméticos, relacionais e Os operadores oferecidos por Lua são basicamente os aritméticos, relacionais e lógicos usuais, comumente encontrados em outras linguagens. Lua também alguns lógicos usuais, comumente encontrados em outras linguagens. Lua também alguns operadores especiais, como para concatenação de strings.

operadores especiais, como para concatenação de strings.

1.8.1.1 Aritméticos 1.8.1.1 Aritméticos

Os operadores aritméticos presentes em Lua são: Os operadores aritméticos presentes em Lua são:

  Unários:Unários: -- NegaçãoNegação   BináriosBinários + + AdiçãoAdição -- SubtraçãoSubtração * * MultiplicaçãoMultiplicação / / DivisãoDivisão ^ ^ ExponenciaçãoExponenciação

Para precedência de operadores pode-se utilizar dos parênteses. Para precedência de operadores pode-se utilizar dos parênteses.

Os operadores aritméticos só poderão ser aplicados sobre valores do tipo number Os operadores aritméticos só poderão ser aplicados sobre valores do tipo number ou string, se este

ou string, se este estiver convertida para número através de coerção.estiver convertida para número através de coerção.

1.8.1.2 Relacionais 1.8.1.2 Relacionais

Os operadores relacionais resultam em um valor booleano e

Os operadores relacionais resultam em um valor booleano e incluem:incluem:

>

> Maior queMaior que <

< Menor queMenor que >=

>= Maior ou igual queMaior ou igual que <=

<= Menor ou igual queMenor ou igual que ==

(27)

~=

~= DiferençaDiferença

Os operadores >, <, >=, <= são aplicáveis apenas a dados do tipo number ou string. Os operadores >, <, >=, <= são aplicáveis apenas a dados do tipo number ou string.

1.8.1.3 Lógicos 1.8.1.3 Lógicos

Combinam valores booleanos e são dados por: Combinam valores booleanos e são dados por:

and

and Conjunção Conjunção (e)(e) or

or Disjunção Disjunção (ou)(ou) not Negação

not Negação

As conjunções ou disjunções múltiplas são avaliadas da esquerda para direita. As conjunções ou disjunções múltiplas são avaliadas da esquerda para direita.

1.8.1.4 Operador de concatenação 1.8.1.4 Operador de concatenação

Como dito acima e anteriormente no tópico “String”, Lua tem um operador para Como dito acima e anteriormente no tópico “String”, Lua tem um operador para

concatenação de cadeias de caracteres, o qual é representado por dois pontos concatenação de cadeias de caracteres, o qual é representado por dois pontos seguidos (

seguidos (....). Quando aplicado a dois valores do tipo string, este retorna uma). Quando aplicado a dois valores do tipo string, este retorna uma

terceira string

terceira string que correspondeque correspondente a união das nte a união das outras cadeias outras cadeias originais.originais.

1.8.1.5 Precedência dos

1.8.1.5 Precedência dos operadoresoperadores

A precedência dos operadores é usual. Como dito anteriormente, o uso dos A precedência dos operadores é usual. Como dito anteriormente, o uso dos parênteses é permitido, para alterar a ordem de precedência natural. A ordem de parênteses é permitido, para alterar a ordem de precedência natural. A ordem de precedência de operadores está listada abaixo

precedência de operadores está listada abaixo em ordem decrescente:em ordem decrescente:

^ ^ not -(unário) not -(unário) * / * / + + -.. .. < > <= ~= == < > <= ~= == and or and or 1.8.2 Estruturas de Controle 1.8.2 Estruturas de Controle 1.8.2.1 If 1.8.2.1 If

O if é a estrutura de controle básica de Lua. Caso a condição do if seja verdaira, o O if é a estrutura de controle básica de Lua. Caso a condição do if seja verdaira, o comando do then é executado, caso contrário, a parte else é executada. A seguir comando do then é executado, caso contrário, a parte else é executada. A seguir umum exemplo de uso do if.

Referências

Documentos relacionados

Detectadas as baixas condições socioeconômicas e sanitárias do Município de Cuité, bem como a carência de informação por parte da população de como prevenir

•   O  material  a  seguir  consiste  de  adaptações  e  extensões  dos  originais  gentilmente  cedidos  pelo 

Para a parede A, concluiu-se que o revestimento de argamassa é muito importante para a isolação sonora de paredes, constatando-se um aumento de 5 dB no Índice de Redução

Após a queima, para os corpos com a presença do sienito observou-se que os valores de densidade diminuíram (comparados às respectivas densidades a seco), já

Os maiores coeficientes da razão área/perímetro são das edificações Kanimbambo (12,75) e Barão do Rio Branco (10,22) ou seja possuem uma maior área por unidade de

Ana Isabel Moreira da Silva e Sousa Excluída por falta de documentos. Ana Lúcia Abreu Rebelo Excluída por falta

libras ou pedagogia com especialização e proficiência em libras 40h 3 Imediato 0821FLET03 FLET Curso de Letras - Língua e Literatura Portuguesa. Estudos literários

(2016), selecionando genótipos de tomateiro para processamento com alto teor de zingibereno, concluíram que a seleção indireta de plantas com alto teor de zingibereno é eficiente