🔄 Repetições e Iterações

Faça o computador repetir coisas automaticamente!

🔄

Tabela de Referência Rápida

TipoSintaxeRetornaQuando usar
Numérico simples para i = 1, 10 faça contador Contar de X até Y
Numérico com passo para i = 0, 100, 10 faça contador Pular valores (de 10 em 10)
Regressivo para i = 10, 1, -1 faça contador Contagem regressiva
Array/Lista para i, v em obtenha_pares_indexados(t) faça índice, valor Listas ordenadas {1, 2, 3}
Mapa/Objeto para k, v em obtenha_pares(t) faça chave, valor Dicionários {nome="Ana"}

Sintaxe do PARA

Forma numérica

para variável = início, fim [, passo] faça
    -- código a repetir
fim
ParteObrigatório?Descrição
variável✅ SimNome do contador (geralmente i)
início✅ SimValor inicial do contador
fim✅ SimValor final (inclusivo)
passo❌ OpcionalIncremento (padrão: 1)

Forma genérica (iteradores)

para variável1 [, variável2, ...] em iterador(tabela) faça
    -- código a repetir
fim
ParteObrigatório?Descrição
variável1✅ SimPrimeira variável retornada pelo iterador
variável2❌ OpcionalSegunda variável (e mais, se o iterador retornar)
iterador✅ SimFunção que gera os valores (obtenha_pares, obtenha_pares_indexados, etc.)
💡 Se você não precisa de uma variável, use _ (sublinhado) para ignorá-la: para _, valor em obtenha_pares_indexados(lista) faça

Iteração Numérica

Contagem simples

-- Conta de 1 até 5
para i = 1, 5 faça
    exiba(i)
fim
-- Resultado: 1, 2, 3, 4, 5

Contagem com passo

-- De 0 a 100, pulando de 10 em 10
para i = 0, 100, 10 faça
    exiba(i)
fim
-- Resultado: 0, 10, 20, 30, ..., 100

Contagem regressiva

-- De 5 até 1 (passo negativo!)
para i = 5, 1, -1 faça
    exiba(i)
fim
exiba("🚀 Decolar!")
-- Resultado: 5, 4, 3, 2, 1, 🚀 Decolar!
⚠️ Passo obrigatório para regressiva: Se o início for maior que o fim, você deve especificar um passo negativo, senão o loop não executa!

Entendendo Tabelas em Sol

Em Sol, tabelas são a única estrutura de dados. Mas elas podem ser usadas de várias formas:

UsoExemploCaracterística
Array/Lista {"a", "b", "c"} Índices numéricos: 1, 2, 3...
Mapa/Dicionário {nome="Ana", idade=15} Chaves nomeadas
Objeto {dados={}, metodo=função() fim} Dados + funções
Mista {"item1", nome="teste"} Índices + chaves

A forma de iterar depende de como você está usando a tabela:

Iteradores: Quando usar cada um

obtenha_pares_indexados() — Para Arrays/Listas

Use quando sua tabela é uma lista ordenada com índices numéricos (1, 2, 3...):

local frutas = {"Maçã", "Banana", "Uva"}

para indice, fruta em obtenha_pares_indexados(frutas) faça
    exiba(indice .. ": " .. fruta)
fim
-- 1: Maçã
-- 2: Banana
-- 3: Uva
Características:
  • ✅ Itera em ordem (1, 2, 3...)
  • ✅ Para no primeiro nulo encontrado
  • Ignora chaves nomeadas

obtenha_pares() — Para Mapas/Objetos

Use quando sua tabela tem chaves nomeadas ou você precisa ver tudo:

local pessoa = {nome = "Ana", idade = 15, cidade = "São Paulo"}

para chave, valor em obtenha_pares(pessoa) faça
    exiba(chave .. " = " .. converta_para_texto(valor))
fim
-- nome = Ana
-- idade = 15
-- cidade = São Paulo
Atenção: obtenha_pares() não garante ordem! A ordem de iteração pode variar.

Comparação Visual

local mista = {
    "primeiro",           -- índice 1
    "segundo",            -- índice 2
    nome = "Tabela",      -- chave nomeada
    valor = 42            -- chave nomeada
}

exiba("--- obtenha_pares_indexados ---")
para i, v em obtenha_pares_indexados(mista) faça
    exiba(i, v)
fim
-- 1    primeiro
-- 2    segundo
-- (chaves nomeadas ignoradas!)

exiba("--- obtenha_pares ---")
para k, v em obtenha_pares(mista) faça
    exiba(k, v)
fim
-- 1       primeiro
-- 2       segundo
-- nome    Tabela
-- valor   42
-- (tudo, mas sem ordem garantida)

Cenários Práticos

Lista de compras (Array)

local compras = {"Pão", "Leite", "Ovos"}

para i, item em obtenha_pares_indexados(compras) faça
    exiba(i .. ". [ ] " .. item)
fim
-- 1. [ ] Pão
-- 2. [ ] Leite
-- 3. [ ] Ovos

Ficha de cadastro (Mapa)

local usuario = {
    nome = "João Silva",
    email = "joao@email.com",
    ativo = verdadeiro
}

exiba("=== Dados do Usuário ===")
para campo, valor em obtenha_pares(usuario) faça
    exiba(campo .. ": " .. converta_para_texto(valor))
fim

Calcular média (Array numérico)

local notas = {8, 7, 9, 6, 10}

local soma = 0
para _, nota em obtenha_pares_indexados(notas) faça
    soma = soma + nota
fim

local media = soma / #notas
exiba("Média: " .. media)  -- Média: 8

Tabuada (Numérico simples)

local numero = 7

exiba("Tabuada do " .. numero)
para i = 1, 10 faça
    exiba(numero .. " x " .. i .. " = " .. (numero * i))
fim

Controlando o Loop

Interromper o loop (interrompa)

local numeros = {1, 2, 3, 4, 5}

para _, n em obtenha_pares_indexados(numeros) faça
    se n == 3 então
        exiba("Encontrei o 3! Parando.")
        interrompa
    fim
    exiba(n)
fim
-- 1
-- 2
-- Encontrei o 3! Parando.
Atenção: Por questões de performance e design, não é permitido colocar um loop para dentro de outro para. Se precisar fazer isso, isole o loop interno em uma função separada.

Erros Comuns

❌ Erro✅ CorretoPor quê?
para i = 10, 1 faça para i = 10, 1, -1 faça Falta o passo negativo
para k em obtenha_pares(t) faça para k, v em obtenha_pares(t) faça obtenha_pares retorna 2 valores
Usar obtenha_pares_indexados em mapa Usar obtenha_pares Chaves nomeadas são ignoradas
Usar obtenha_pares + esperar ordem Usar obtenha_pares_indexados obtenha_pares não garante ordem
🎉 Agora você domina iterações em Sol! Use obtenha_pares_indexados para listas e obtenha_pares para mapas/objetos.
```