- Resolví los 12 días de rompecabezas de Advent of Code 2025 con Gleam, y me impresionaron especialmente sus mensajes de error al nivel de Rust y su estilo funcional centrado en pipelines
- Funciones integradas como
echo, fold_until y list.transpose simplificaron la depuración y la resolución de problemas de combinatoria, mientras que la seguridad basada en tipos opción resultó útil para procesar rompecabezas de grillas
- Se señalaron como puntos incómodos la ausencia de IO de archivos y expresiones regulares en la librería estándar, las limitaciones del pattern matching con listas y la sintaxis explícita para comparaciones al usarse repetidamente
- Por las diferencias en el manejo de enteros entre la VM de Erlang y el target de JavaScript, fue necesario usar
bigi, y en algunos rompecabezas se resolvió el problema llamando herramientas externas (glpsol)
- En general, expresó que el cambio hacia una forma de pensar funcional hizo más clara la resolución de los rompecabezas, y mostró interés en probar Gleam en proyectos reales, como por ejemplo el desarrollo de un servidor web
Advent of Code 2025 y la elección de Gleam
- El autor, que completa Advent of Code cada año, eligió este año el lenguaje Gleam y resolvió 12 días de rompecabezas con él
- Este año el evento se redujo de 25 a 12 días, y aunque cada problema tenía una dificultad alta, la estructura era adecuada para aprender
- Como el avance de los rompecabezas era rápido y aparecieron problemas complejos antes de tener completo el conjunto de herramientas, se convirtió en un entorno ideal para aprender un lenguaje nuevo
Ventajas del lenguaje Gleam
- Se caracteriza por su sintaxis concisa, mensajes de error del compilador útiles y una retroalimentación amable al nivel de Rust
- Su estilo funcional basado en el operador pipe encaja muy bien con la estructura de los problemas de AoC (parseo → transformación → fold)
- La extensión de Gleam para IntelliJ y el LSP funcionaron de forma estable, haciendo agradable el entorno de desarrollo
- La programación funcional (FP), más que el código imperativo, impulsa un cambio de pensamiento hacia una forma de describir la esencia del problema
Funciones principales y ejemplos de uso en código
echo: una función simple de salida que permite inspeccionar valores en medio de un pipeline, útil para depurar sin formatear strings
- También se menciona como inconveniente que, al no haber interpolación de strings, al generar texto se termina usando muchas operaciones
<>"
- Tipos opción (
dict.get): permiten explorar vecinos de forma segura en rompecabezas de grillas sin hacer verificaciones de límites manuales
- Utilidades de listas
list.transpose: simplifica la estructura del rompecabezas mediante una transposición de matriz
list.combination_pairs: al generar pares de puntos 3D, permite resolverlo en una sola línea sin loops anidados
fold_until: una función fold que puede terminar anticipadamente al cumplirse una condición, eficiente para cálculos iterativos en rompecabezas
Restricciones y puntos incómodos de Gleam
- Ausencia de IO de archivos en la librería estándar, reemplazada con el paquete
simplifile
- Las expresiones regulares también requieren una dependencia externa (
gleam_regexp)
- Limitaciones del pattern matching con listas: no es posible una forma como
[first, ..middle, last]
- Manejo explícito de operaciones de comparación: hay que usar el tipo
order, lo que vuelve la sintaxis más verbosa en comparaciones simples
Uso avanzado y casos por rompecabezas
bigi: se usó para evitar overflow de enteros al compilar al target de JavaScript
- Bitmask XOR: en el Día 10-1, el problema de alternar luces se modeló con una operación XOR para resolverlo de forma eficiente
- Llamada a
glpsol: en el Día 10-2, se generó un archivo LP y luego se ejecutó un comando externo para resolver ecuaciones lineales
- Clave de memoización: en el Día 11-2, usar conjuntamente el nodo y el estado como clave permitió completar el cálculo de inmediato
- El rompecabezas final dependía de supuestos sobre la entrada y se resolvió con una simple comparación de áreas (
heuristic_area <= max_area)
Conclusión y planes a futuro
- Gleam mostró fortalezas en seguridad y expresividad pese a las limitaciones de su librería estándar
- Pipelines, tipos opción/resultado, funciones de listas y
fold_until hicieron más clara la resolución de los rompecabezas
- Planea aplicar Gleam en proyectos reales como el desarrollo de servidores web, y expresó su intención de seguir usándolo en el Advent of Code del próximo año
- El código fuente completo está publicado en el repositorio de GitHub (
tymscar/Advent-Of-Code/2025/gleam/aoc/src)
1 comentarios
Comentarios en Hacker News
Gleam es de verdad un lenguaje hermoso. Me gustaría que Elixir evolucionara en esta dirección en cuanto a sistema de tipos
Gleam también corre sobre BEAM, la VM de Erlang, y gracias a eso la concurrencia y el manejo de colas son muy sencillos
El ecosistema también es excelente. Aun así, me preocupa que desde la era de los LLM, el desarrollo de lenguajes posteriores a 2021 parezca haberse detenido
De todos modos, Gleam entró justo antes de que se cerrara esa puerta, y espero que pronto los LLM también se pongan al día
Como los lenguajes no pueden ser totalmente distintos ni en sintaxis ni en filosofía, no creo que eso sea un gran problema
Gleam ofrece por su cuenta un subconjunto de OTP seguro en tipos. Consulta la biblioteca relacionada: gleam-lang/otp
Este año resolví Advent of Code con Gleam y me dejó bastante impresionado
Entre las ventajas, el rendimiento es bueno y el language server es sorprendentemente potente. El autoformateo, los imports automáticos y las sugerencias para pattern matching hacen que la experiencia de desarrollo sea excelente
Como desventajas, el formateador alarga demasiado el código en vertical y, por priorizar la simplicidad, hay mucha repetición como
list.map. Además, el ecosistema de bibliotecas todavía es limitadolist.mapse puede acortar con algo comoimport gleam/list.{range, map}. También sería interesante portar bibliotecas de CList.mapreduce la descubribilidad (discoverability)Me gusta Gleam, pero me decepciona la restricción en las llamadas a funciones recursivas. No se pueden hacer libremente llamadas a funciones internas
Sintácticamente es menos elegante que Scheme y, conceptualmente, más simple que Erlang. Aun así, el tipado estático es una ventaja
También usé OCaml, pero la reproducibilidad del entorno era mala por problemas como los archivos lock de opam. Me gustaría que el ecosistema de SML fuera más grande
Idris 2 tiene tipos dependientes y un diseño elegante, pero el ecosistema es pequeño, y PureScript es más práctico que Haskell, aunque está atado al runtime de JS
Al ver la función
echo, pensé que sería bueno que un depurador trajera por defecto este tipo de función para inspeccionar resultados intermediosEstaría bien poder ver el resultado intermedio de un slice de arreglo o de una cadena de filtros sin modificar el código
Además, me parece ineficiente usar arreglos bidimensionales como grids. Un arreglo unidimensional + información de límites es más seguro y eficiente
No conozco bien Gleam, pero viendo
list.map(fn(line) { line |> calculate_instruction })me da la impresión de que eso se podría escribir simplemente como
list.map(calculate_instruction)Gleam es un gran lenguaje. A mí no me terminó de enganchar mucho, pero me alegra ver que la gente lo disfruta
Pienso que la combinación Gleam + Lustre podría convertirse en el nuevo Elm
Últimamente me pregunto si vale la pena aprender un lenguaje nuevo en esta era de los LLM
Si es un lenguaje en el que los LLM no fueron entrenados, me preocupa que su utilidad como herramienta sea menor
En cambio, Swift tiene una sintaxis compleja y es más difícil de manejar para los LLM
Cuando vi Gleam hace tiempo, me pareció que no tenía despacho dinámico (interface o type class); me pregunto cómo estará eso ahora
[first, ..rest]o[first, second]sí se pueden, pero[first, ..middle, last]no.Supongo que lo bloquean intencionalmente porque sale caro
Por suerte, la policía de títulos de blogs llegó rápido al lugar
Enlace relacionado