# Roteiro de Estudos da Programação em Lua
# Cada tópico indica a pasta do repositório com os exemplos práticos correspondentes.
Comentários: # exemplos: basico/
  - Comentários de uma linha # -- Comentário de uma linha
  - Comentários de múltiplas linhas # --[[ Comentário de múltiplas linhas --]]
  - Comentários de saída esperada # print(frutas[1]) --> maçã
Variáveis: # exemplos: basico/
  - Escopo de variáveis # global, local
  - Declaração de variáveis # local nomeDaVariavel
  - Atribuição de variáveis # local nomeDaVariavel = valor
Tipos de Dados: # exemplos: basico/
  - Strings # "Olá, Lua!"
  - Números # 3.14
  - Booleanos # true ou false
  - Tabelas # local frutas = {"maçã", ...}, local pessoa = {nome = "João da Silva", ...}
  - Nil # local x; print(x) --> nil
  - Funções # local function minhaFuncao() end
Operadores: # exemplos: basico/
  - Operadores aritméticos:
      - Adição # 5 + 2 --> 7
      - Subtração # 5 - 2 --> 3
      - Multiplicação # 5 * 2 --> 10
      - Divisão # 5/2 --> 2.5
      - Divisão inteira # 5//2 --> 2
      - Módulo # 5%2 --> 1
      - Exponenciação # 2^3 --> 8.0 (sempre float)
  - Operadores relacionais:
      - Igualdade # 5 == 2 --> false
      - Desigualdade # 5 ~= 2 --> true
      - Menor que # 5 < 2 --> false
      - Maior que # 5 > 2 --> true
      - Menor ou igual a # 5 <= 2 --> false
      - Maior ou igual a # 5 >= 2 --> true
  - Operadores lógicos:
      - E (and) # true and false --> false
      - Ou (or) # true or false --> true
      - Não (not) # not true --> false
  - Operadores bit a bit:
      - E bit a bit (AND) # 5 & 2 --> 0 (0000 0101 & 0000 0010 = 0000 0000)
      - Ou bit a bit (OR) # 5 | 2 --> 7 (0000 0101 | 0000 0010 = 0000 0111)
      - Ou exclusivo bit a bit (XOR) # 5 ~ 2 --> 7 (0000 0101 ~ 0000 0010 = 0000 0111)
      - Negação bit a bit (NOT) # ~5 --> -6 (~0000 0101 = 1111 1010)
      - Deslocamento de bits à esquerda # 5 << 2 --> 20 (0000 0101 << 2 = 0001 0100)
      - Deslocamento de bits à direita # 5 >> 2 --> 1 (0000 0101 >> 2 = 0000 0001)
  - Operador de concatenação # "Olá" .. " " .. "Lua!" --> "Olá Lua!"
  - Operador de comprimento # #frutas --> 3
Estruturas condicionais: # exemplos: controle_de_fluxo/
  - if # if condicao then comandos end
  - elseif # elseif condicao then comandos end
  - else # else comandos end
Estruturas de repetição: # exemplos: controle_de_fluxo/
  - while # while condicao do comandos end
  - repeat...until # repeat comandos until condicao
  - for numérico (intervalo) # for variavel = inicio, fim, passo do comandos end
  - for genérico (for each) # for chave, valor in pairs(tabela) do comandos end
  - break # break (não existe continue; veja o idioma goto continue em controle_de_fluxo/goto.lua)
  - A variável de controle do for é local ao laço # alterá-la não muda a iteração (exemplos: controle_de_fluxo/lacos.lua)
Funções: # exemplos: funcoes/
  - Definição # local function minhaFuncao(parametros) comandos end
  - Chamada # local x = minhaFuncao(arg)
  - Valor padrão de parâmetro (idioma) # parametro = parametro or valorPadrao (Lua não tem parâmetros com valor padrão na assinatura)
  - Número variável de parâmetros # minhaFuncao(...)
  - Valores de retorno # return valor
  - Retornar múltiplos valores # return valor1, valor2
  - Ajuste de múltiplos retornos # fora da última posição a chamada é truncada; (f()) reduz a um valor (exemplos: funcoes/multiplos_retornos.lua)
  - Chamadas de cauda garantidas # return f(x) não empilha quadro novo
  - Retorno condicional (idioma and/or) # return a and b or c (Lua não tem operador ternário; falha se b for false ou nil)
Tabelas como Arrays: # exemplos: tabelas/
  - Empacotar os elementos em um array # local frutas = table.pack("maçã", "banana")
  - Criar um array vazio # local array = {}
  - Criar um array com elementos # local frutas = {"maçã", "banana", "cereja"}
  - Número de elementos # print(#frutas) --> 3
  - Acessar elementos # print(frutas[1]) --> maçã
  - Acessar elementos fora dos limites # --> nil
  - Percorrer os elementos # for _, fruta in ipairs(frutas) do algumaCoisa(fruta) end
  - Modificar elementos pelo índice # frutas[3] = "chocolate"
  - Acrescentar novos elementos # table.insert(frutas, "laranja")
  - Adicionar novos elementos pelo índice # table.insert(frutas, 3, "manga") (a posição vem antes do valor)
  - Remover o último elemento # table.remove(frutas)
  - Remover elemento pelo índice # table.remove(frutas, 3)
  - Ordenação # table.sort(frutas)
  - Ordenação personalizada # table.sort(frutas, ordenacaoPersonalizada)
  - Buracos e o operador de comprimento # t[i] = nil abre buraco e # vira fronteira não confiável (exemplos: tabelas/buracos_e_comprimento.lua)
Tabelas como Dicionários: # exemplos: tabelas/
  - Criar um mapa # local pessoa = {nome = "João da Silva", idade = 30}
  - Acessar elementos # print(pessoa.nome) --> João da Silva
  - Percorrer os elementos # for chave, valor in pairs(tabela) do algumaCoisa(chave, valor) end
  - Adicionar novos elementos # pessoa.cargo = "programador lua"
  - Referências e cópias # atribuição cria apelido; cópia rasa vs profunda (exemplos: tabelas/referencias_e_copias.lua)
  - Conjuntos # conjunto[chave] = true (pertinência em O(1))
Veja mais:
  - Manipulação de Strings # biblioteca string, padrões de captura (não é regex POSIX) (exemplos: basico/)
  - Tratamento de Erros e Exceções # assert, error, pcall, xpcall, warn, erros estruturados (exemplos: erros/)
  - Módulos # criar um módulo, require "modulo", cache em package.loaded (exemplos: modulos/)
  - Manipulação de Arquivos # biblioteca io (exemplos: io/)
  - Metaprogramação # metatables, metamétodos (índice completo em metatabelas/README.md)
  - Orientação a Objetos # classes, objetos, ... (exemplos: poo/)
  - Corrotinas # coroutine (valores do tipo thread), geradores com wrap, produtor-consumidor (exemplos: corrotinas/)
  - Coleta de Lixo (Garbage Collection) # collectgarbage, tabelas fracas, ephemerons (exemplos: gc/)
  - Desempenho # medição com os.clock, benchmark antes de otimizar (exemplos: desempenho/)
  - Depuração # biblioteca debug, introspecção da pilha, ganchos com sethook (exemplos: depuracao/)
  - Sistema Operacional # biblioteca os, data e hora, medição de tempo (exemplos: sistema/)
  - Banco de Dados # SQLite via os.execute (exemplos: banco_de_dados/)
  - Padrões de Projeto # fábrica, observador, estratégia, memento, composto, método modelo, MVC, ... (exemplos: padroes/)
  - Princípios SOLID # SRP, OCP, LSP, ISP, DIP (exemplos: solid/)
  - Testes # asserções, suítes de teste (exemplos: testes/)
  - Projetos Práticos # pluralizador, JSON, ferramentas de equipe (exemplos: projetos/)
  - Exercícios Guiados # enunciados em documentacao/comece_aqui.md, soluções em projetos/exercicios/
  - Arquitetura Hexagonal # portas e adaptadores no gerador do site (exemplos: site/)
  - API C # embutir Lua em C e módulos C via require (exemplos: capi/)
