LUA(linguagem de programaçao)

**Lua** é uma linguagem de script imperativa, procedural, pequena, reflexiva e leve, projetada para expandir aplicações em geral, por ser uma linguagem extensível (que une partes de um programa feitas em mais de uma linguagem), para prototipagem e para ser embarcada em softwares complexos, como jogos. Assemelha-se com Python, Ruby e Icon, entre outras.

Lua foi criada por um time de desenvolvedores do Tecgraf da PUC-Rio, a princípio, para ser usada em um projeto da Petrobras. Devido à sua eficiência, clareza e facilidade de aprendizado, passou a ser usada em diversos ramos da programação, como no desenvolvimento de jogos (a Blizzard Entertainment, por exemplo, usou a linguagem no jogo World of Warcraft), ou no jogo Tibia, controle de robôs, processamento de texto, etc. Também é frequentemente usada como uma linguagem de propósito geral.

Lua combina programação procedural com poderosas construções para descrição de dados, baseadas em tabelas associativas e semântica extensível. É tipada dinamicamente, interpretada a partir de bytecodes, e tem gerenciamento automático de memória com coleta de lixo. Essas características fazem de Lua uma linguagem ideal para configuração, automação (scripting) e prototipagem rápida.

## Exemplo

O Programa "Olá Mundo" ou "Hello World" pode ser escrito da seguinte forma:

```
print "Olá, Mundo!"

```

A função fatorial recursiva:

```
function fact(n)
   if n == 0 then
      return 1
   else
      return n \* fact(n - 1)
   end
end

```

O cálculo dos n primeiros números perfeitos:

```
function perfeitos(n)
   cont=0
   x=0
   print('Os numeros perfeitos sao ')
   repeat
      x=x+1
      soma=0
      for i=1,(x-1) do
         if math.mod(x,i)==0 then soma=soma+i;
         end
      end
      if soma == x then
         print(x)
         cont = cont+1
      end
   until cont==n
   print('Pressione qualquer tecla para finalizar...')
end

```

O tratamento das funções como variáveis de primeira classe é mostrado no exemplo a seguir, onde o comportamento da função “print” é modificado:

```
do
   local oldprint = print -- Grava a variável “print” em “oldprint”
   print = function(s)    -- Redefine a função “print”
      if s == "foo" then
         oldprint("bar")
      else
         oldprint(s)
      end
   end
end

```

Qualquer chamada da função “print” agora será executada através da nova função, e graças ao escopo léxico de Lua, a função “print” antiga só será acessível pelo nova.

Lua também suporta funções closure, como demonstrado abaixo:

```
function makeaddfunc(x) -- Retorna uma nova função que adiciona x ao argumento
   return function(y)
      return x + y
   end
end
plustwo = makeaddfunc(2)
print(plustwo(5)) -- Prints 7

```

Um novo “closure” é criado para a variável x cada vez que a função “makeaddfunc” é chamada, de modo que a função anônima a ser retornada sempre irá acessar seu próprio parâmetro x. O “closure” é gerenciado pelo coletor de lixo (garbage collector) da linguagem, tal como qualquer outro objeto.

Uma característica essencial de Lua é a semântica Extensível, e o conceito de “metatables” permite que as tabelas Lua sejam personalizadas em poderosas e exclusivas formas. O exemplo a seguir mostra uma tabela “infinita”. Para qualquer valor “n”, “fibs [n]” dará o enésimo número Fibonacci usando programação dinâmica.

```
fibs = { 1, 1 } -- Valores iniciais de fibs[1] e fibs[2].
setmetatable(fibs, {
  \_\_index = function(name, n) -- Função chamada se fibs[n] não existir
    name[n] = name[n - 1] + name[n - 2] -- Calcula e grava fibs[n].
    return name[n]
  end
})

```