🎯 Funções

Funções são como receitas: você cria uma vez e usa quantas vezes quiser!

🎯

O que é uma função?

Imagine que você quer fazer bolo de chocolate várias vezes. Seria chato lembrar da receita toda vez, né?

Com funções, você escreve as instruções uma vez e depois é só chamar pelo nome!

Criando sua primeira função

função diga_oi()
    exiba("Olá! 👋")
fim

-- Agora vamos usar!
diga_oi()    -- Mostra: Olá! 👋
diga_oi()    -- Mostra: Olá! 👋

Funções com parâmetros

Funções podem receber informações:

função diga_oi_para(nome)
    exiba("Olá, " .. nome .. "!")
fim

diga_oi_para("Maria")   -- Mostra: Olá, Maria!

Funções que devolvem algo (retorno)

função soma(a, b)
    retorne a + b
fim

local resultado = soma(5, 3)
exiba(resultado)    -- Mostra: 8

Múltiplos retornos

No Sol, funções podem devolver várias coisas de uma vez!

função divide_com_resto(a, b)
    local quociente = a // b
    local resto = a % b
    retorne quociente, resto
fim

local q, r = divide_com_resto(17, 5)
exiba("17 ÷ 5 = " .. q .. " resto " .. r)
-- Mostra: 17 ÷ 5 = 3 resto 2

Argumentos variáveis (...)

Quer receber qualquer quantidade de valores? Use ...:

função soma_tudo(...)
    local args = {...}
    local total = 0
    para i, v em obtenha_pares_indexados(args) faça
        total = total + v
    fim
    retorne total
fim

exiba(soma_tudo(1, 2, 3))           -- 6
exiba(soma_tudo(10, 20, 30, 40))   -- 100

Funções anônimas

Funções sem nome! Úteis para passar como argumento:

-- Função normal
função dobro(x) retorne x * 2 fim

-- Mesma coisa, mas anônima guardada em variável
local dobro = função(x) retorne x * 2 fim

exiba(dobro(5))    -- 10

Closures (Funções que lembram)

Uma closure é uma função que "lembra" das variáveis de onde foi criada:

função cria_contador()
    local contagem = 0

    retorne função()
        contagem = contagem + 1
        retorne contagem
    fim
fim

local contador = cria_contador()

exiba(contador())   -- 1
exiba(contador())   -- 2
exiba(contador())   -- 3
A função interna "lembra" da variável contagem mesmo depois que cria_contador terminou!

Exemplo prático: Fábrica de multiplicadores

função cria_multiplicador(fator)
    retorne função(numero)
        retorne numero * fator
    fim
fim

local dobro = cria_multiplicador(2)
local triplo = cria_multiplicador(3)

exiba(dobro(5))    -- 10
exiba(triplo(5))   -- 15
Funções são super poderosas no Sol! Closures permitem criar código flexível e reutilizável.
```