Linguagem Lua

LUA

Grupo responsável:

  • Alex Bertei
  • Gerson Porciúncula Siqueira
  • Italo Menna Silveira

Composição dos nomes

Qual o tamanho máximo que podem ter os nomes?

Não existe um limite de tamanho para os nomes.

Existe distinção entre maiúsculas e minúsculas na composição dos nomes?

Lua é uma linguagem que diferencia minúsculas de maiúsculas: function é uma palavra reservada, mas FunCtion e FunctioN são dois nomes válidos diferentes. Como convenção, nomes que começam com um sublinhado seguido por letras maiúsculas (tais como _VERSION) são reservados para variáveis globais internas usadas por Lua.

Quantas palavras-chave e palavras reservadas existem na linguagem?

Lua tem 21 palavras-chave, as seguintes palavras-chave são reservadas e não podem ser utilizadas como nomes:

and break do else elseif while
end false for function if
in local nil not or
repeat return then true until

Variáveis

Existe suporte a apelidos?

Não existe suporte a apelidos, ou seja, Lua não possui nenhum mecanismo que consiga referenciar o conteúdo de uma mesmo posição de memória, não disponibiliza nem mesmo ponteiros.

Qual é a faixa de valores das variáveis em função do tipo?

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 (naturalmente, a variável deixa de armazenar o valor inicial). É tipada dinamicamente, interpretada a partir de bytecodes, e tem gerenciamento automático de memória com coleta de lixo.

Que tipos de declarações são aceitas (implícitas, explícitas, etc.)?

Depende, quando falamos em relação a declaração de variáveis da linguagem, são implícitas:

a = "Exemplo"     -- a armazena string
b = 1.23          -- b armazena numero
...
b = nil           -- b armazena nil
a = 3             -- a armazena numero

Não é preciso especificar o tipo das variáveis.

Mas também temos declaração explícita em relação ao trecho em que a variável é usada no código, a palavra reservada local declara uma variável local, cujo escopo vai da declaração até o fim do bloco mais interno que contém a declaração. No exemplo, sum é visível até o fim da função add.

function addfile (filename)
    local sum = 0
    for line in io.lines(filename) do
        sum = sum + tonumber(line)
    end
    return sum
end

Também podemos dizer que a declaração de função é explícita porque, usa-se para demonstrar que é uma função a palavra-chave function, mas mesmo nesse caso não precisamos passar para a função os tipos de seus parâmetros.

Existe suporte a vinculação dinâmica de tipos?

Em Lua, não declaramos o tipo de uma variável. O tipo da variável é determinado dinamicamente, dependendo do valor que ela esta armazenando. Sendo assim, uma variável pode armazenar valores de qualquer um dos tipos básicos de Lua. Existem oito tipos básicos em Lua: nil, boolean, number, string, function, userdata, thread e table.

Existe suporte a tipificação forte?

Não existe suporte a tipificação forte, nem sempre erros de tipos são detectados, em Lua uma variável pode ser de qualquer um dos tipos básicos, nil, boolean, number, string, function, userdata, thread e table, isso para um mesmo programa, por exemplo, uma variável pode iniciar um programa com um numérico e ao final retornar uma string na mesma variável.

Como é o escopo? Estático, dinâmico ou ambos?

Escopo estático, variáveis locais podem ser livremente acessadas por funções definidas dentro do seu escopo.

O escopo das variáveis começa no primeiro comando depois da sua declaração e vai até o fim do bloco mais interno que inclui a declaração. Considere o seguinte exemplo:

x = 10                    -- variável global
do                        -- bloco novo
    local x = x           -- novo 'x', com valor 10
    print(x)              --> 10
    x = x+1
    do                    -- outro bloco
        local x = x+1     -- outro 'x'
        print(x)          --> 12
    end
    print(x)              --> 11
end
print(x)                  --> 10  (o x global)

Note que, em uma declaração como local x = x, o novo x sendo declarado não está no escopo ainda e portanto o segundo x se refere a uma variável externa.

Por causa das regras de escopo léxico, variáveis locais podem ser livremente acessadas por funções definidas dentro do seu escopo. Uma variável local usada por uma função mais interna é chamada de upvalue ou variável local externa, dentro da função mais interna.

Note que cada execução de um comando local define novas variáveis locais. Considere o exemplo a seguir:

a = {}
local x = 20
for i=1,10 do
    local y = 0
    a[i] = function () y=y+1; return x+y end
end

O laço cria dez fechos (isto é, dez instâncias da função anônima). Cada um destes fechos usa uma variável “y” diferente, enquanto todos eles compartilham a mesma variável “x”.

Referências

 
lua-2-trabalho.txt · Last modified: 2012/03/29 23:22 by clp · [Old revisions]