- Ao resolver os 12 dias de puzzles do Advent of Code 2025 com Gleam, o que mais impressionou foram as mensagens de erro no nível do Rust e o estilo funcional centrado em pipelines
- Funções embutidas como
echo, fold_until e list.transpose simplificaram o debugging e a resolução de problemas de combinação, enquanto a segurança baseada em tipos opcionais se mostrou útil no tratamento de puzzles em grade
- A ausência de IO de arquivos e recursos de regex na biblioteca padrão, as restrições de pattern matching em listas e a sintaxe explícita para comparações foram apontadas como incômodos no uso repetido
- Por causa das diferenças no tratamento de inteiros entre a Erlang VM e o alvo JavaScript, foi necessário usar
bigi, e em alguns puzzles o problema foi resolvido com chamadas a ferramentas externas (glpsol)
- No geral, a mudança para uma forma de pensar funcional tornou a resolução dos puzzles mais clara, e o autor expressa expectativa de aplicar Gleam em projetos reais, como no desenvolvimento de servidores web
Advent of Code 2025 e a escolha do Gleam
- O autor, que completa o Advent of Code todos os anos, escolheu este ano a linguagem Gleam para resolver os puzzles ao longo de 12 dias
- Neste ano, o evento foi reduzido de 25 para 12 dias, e embora cada problema tivesse alta dificuldade, a estrutura foi adequada para aprendizado
- Como o ritmo dos puzzles era rápido e surgiram problemas complexos antes de o conjunto de ferramentas ficar pronto, isso acabou criando um ambiente ideal para aprender uma nova linguagem
Vantagens da linguagem Gleam
- Destaques para a sintaxe concisa, as mensagens de erro úteis do compilador e o feedback amigável no nível do Rust
- O estilo funcional centrado no operador de pipe combina bem com a estrutura dos problemas do AoC (parsing → transformação → fold)
- A extensão de Gleam para IntelliJ e o LSP funcionaram de forma estável, tornando o ambiente de desenvolvimento confortável
- A programação funcional (FP) leva a uma mudança de pensamento: em vez de código imperativo, passa-se a descrever a essência do problema
Principais recursos e exemplos de uso no código
echo: uma função simples de saída que permite inspecionar valores no meio do pipeline, facilitando o debugging sem formatação de strings
- Foi mencionado como ponto incômodo o fato de não haver interpolação de strings, o que faz aumentar o uso do operador
<> na criação de textos
- Tipo opcional (
dict.get): permite explorar vizinhos em puzzles de grade com segurança, sem precisar de checagens explícitas de limite
- Utilitários de lista
list.transpose: simplifica a estrutura do puzzle com a operação de transposição de matriz
list.combination_pairs: gera pares de pontos 3D em uma linha, sem loops aninhados
fold_until: função de fold com encerramento antecipado ao cumprir uma condição, eficiente em cálculos iterativos dos puzzles
Restrições e incômodos do Gleam
- Ausência de IO de arquivos na biblioteca padrão, contornada com o pacote
simplifile
- Recursos de regex também exigem dependência externa (
gleam_regexp)
- Restrições no pattern matching de listas: não é possível usar a forma
[first, ..middle, last]
- Tratamento explícito de comparações: é preciso usar o tipo
order, o que deixa a sintaxe mais verbosa em comparações simples
Uso avançado e exemplos por puzzle
bigi: usado para evitar overflow de inteiros no alvo JavaScript
- Bitmask com XOR: no Day 10-1, o problema de alternar luzes foi modelado com operação XOR para uma solução eficiente
- Chamada de
glpsol: no Day 10-2, foi gerado um arquivo LP e executado um comando externo para resolver equações lineares
- Chave de memoização: no Day 11-2, nó e estado foram usados juntos como chave, permitindo cálculo imediato
- O último puzzle dependia de hipóteses sobre a entrada e foi resolvido com uma simples comparação de área (
heuristic_area <= max_area)
Conclusão e planos futuros
- O Gleam mostrou força em segurança e expressividade, apesar dos limites da biblioteca padrão
- Pipelines, tipos option/result, funções de lista e
fold_until tornaram a resolução dos puzzles mais clara
- O autor pretende aplicar a linguagem futuramente em projetos reais, como desenvolvimento de servidores web, e afirma que pretende continuar usando Gleam no Advent of Code do próximo ano
- O código-fonte completo está disponível em um repositório no GitHub (
tymscar/Advent-Of-Code/2025/gleam/aoc/src)
1 comentários
Comentários no Hacker News
Gleam é realmente uma linguagem linda. Fico pensando como seria bom se o Elixir evoluísse nessa direção em termos de sistema de tipos
O Gleam também roda sobre a BEAM, a VM do Erlang, e por isso concorrência e processamento de filas ficam muito fáceis
O ecossistema também é excelente. Ainda assim, preocupa a sensação de que o desenvolvimento de linguagens desde 2021 parou depois da era dos LLMs
Mesmo assim, o Gleam entrou bem no momento certo antes dessa porta se fechar, e espero que os LLMs logo acompanhem
Como as linguagens não podem ser totalmente diferentes em sintaxe ou filosofia, não acho que isso vá ser um grande problema
O Gleam oferece por conta própria um subconjunto type-safe de OTP. Veja a biblioteca relacionada: gleam-lang/otp
Resolvi o Advent of Code deste ano em Gleam e fiquei bastante impressionado
Entre os pontos fortes, o desempenho é bom e o language server é surpreendentemente poderoso. Formatação automática, auto import, complementos para pattern matching — a experiência de desenvolvimento é excelente
Os pontos fracos são que o formatter estica demais o código na vertical e, por priorizar simplicidade, há muita repetição de escrita como
list.map. Além disso, o ecossistema de bibliotecas ainda é limitadolist.mappode ser reduzido com algo comoimport gleam/list.{range, map}. Também seria interessante portar bibliotecas em CList.mapprejudica a descoberta de recursos (discoverability)Gosto de Gleam, mas acho uma pena a limitação nas chamadas de funções recursivas. Não dá para chamar funções internas livremente
Em termos de sintaxe, é menos elegante que Scheme, e conceitualmente é mais simples que Erlang. Ainda assim, a tipagem estática é uma vantagem
Também usei OCaml, mas a reprodutibilidade do ambiente era pior por problemas com lock file no opam. Fico pensando que seria bom se o ecossistema de SML fosse maior
Idris 2 tem tipos dependentes e um design elegante, mas o ecossistema é pequeno, e PureScript é mais prático que Haskell, porém preso ao runtime de JS
Ao ver o recurso
echo, pensei que seria ótimo se depuradores tivessem por padrão esse tipo de visualização de resultados intermediáriosSeria bom poder ver os resultados no meio de slices de array ou cadeias de filtro sem precisar alterar o código
Também acho ineficiente usar array bidimensional como grid. Array unidimensional + informação de limites parece mais seguro e eficiente
Não conheço bem Gleam, mas em
list.map(fn(line) { line |> calculate_instruction })não daria para simplesmente escrever
list.map(calculate_instruction)?Gleam é uma ótima linguagem. Não me conquistou tanto assim, mas fico feliz de ver as pessoas se divertindo com ela
Acho que a combinação Gleam + Lustre pode acabar se tornando o novo Elm
Hoje em dia, na era dos LLMs, fico pensando se ainda vale a pena aprender novas linguagens
Se for uma linguagem que o LLM não aprendeu, preocupa a perda de utilidade como ferramenta
Já Swift tem uma sintaxe complexa, o que torna mais difícil para LLMs lidarem com ela
Quando vi Gleam no passado, pareceu que faltava despacho dinâmico (interface ou type class); queria saber como isso está hoje
[first, ..rest]ou[first, second]funcionam, mas[first, ..middle, last]não.Imagino que isso tenha sido bloqueado de propósito por ter custo alto
Felizmente, a polícia dos títulos de blog apareceu rapidamente
Link relacionado