Back to flin
flin

El error de iteración del bucle for

La saga de dos sesiones para corregir los bucles for de FLIN -- desde fallos por desbordamiento de pila hasta silencio de una sola iteración hasta soporte completo de iteración.

Juste A. Gnimavo (Thales) & Claude | March 26, 2026 3 min flin
EN/ FR/ ES
flinrust

Un bucle for que solo se ejecuta una vez es un tipo de error particularmente cruel. No falla. No lanza un error. Se ejecuta, produce salida y se detiene -- dándote justo la evidencia suficiente para pensar que funciona mientras oculta el resto. La primera iteración tiene éxito, creando una falsa sensación de corrección. Solo cuando examinas los resultados cuidadosamente notas que un bucle sobre tres elementos produjo solo un resultado.

Este era el estado de los bucles for de FLIN el 6 de enero de 2026. Tomó dos sesiones dedicadas -- Sesión 061 y Sesión 062 -- para desenredar lo que resultaron ser dos errores en capas, cada uno escondiéndose detrás del otro.

Error uno: el desbordamiento de pila

El primer síntoma no fue sutil. Ejecutar cualquier bucle for producía un error de desbordamiento de pila durante la limpieza de ámbito. El problema era que las variables de bucle se almacenaban directamente en locals vía el opcode NextFor, pero end_scope() intentaba hacer pop de ellas de la pila como si fueran variables regulares. La corrección agregó un flag is_loop_var al struct Local.

Error dos: el problema de una sola iteración

Después de corregir el desbordamiento de pila, el bucle ya no fallaba, pero solo se ejecutaba una vez. La investigación reveló que las llamadas a funciones nativas no limpiaban el objeto de función de la pila. Después de la primera iteración, la pila contenía el objeto de función de print donde StartFor esperaba encontrar el iterador.

La corrección de tres líneas: hacer pop del resultado, hacer pop del objeto de función, hacer push del resultado de vuelta.

rustCallInfo::Native { arity: native_arity, index } => {
    self.execute_native_call(index)?;
    let result = self.pop()?;   // Pop result
    self.pop()?;                 // Pop function object
    self.push(result)?;          // Push result back
}

El patrón de errores en capas

La saga del bucle for es un ejemplo de libro de texto de errores en capas -- múltiples problemas independientes que interactúan para producir un único síntoma visible. La Capa 1 enmascaraba la Capa 2. La Capa 2 enmascaraba la Capa 3. Cada corrección pelaba una capa, revelando el siguiente problema.

La corrección de tres líneas que resolvió el error de iteración es quizás la mejor ilustración de una verdad universal en la ingeniería de software: la dificultad de un error no es proporcional al tamaño de su corrección, sino al tamaño del espacio de búsqueda que debes navegar para encontrarlo.


Esta es la Parte 157 de la serie "Cómo construimos FLIN", que documenta cómo un CEO en Abidjan y un CTO de IA diseñaron y construyeron un lenguaje de programación desde cero.

Navegación de la serie: - [156] El opcode CreateEntity que desapareció - [157] El error de iteración del bucle for (estás aquí) - [158] El error de manejo de None

Share this article:

Responses

Write a response
0/2000
Loading responses...

Related Articles

Thales & Claude zerosuite

Funciona, y no está terminado

El director recorrió él mismo todos los canales de senndo — cinco canales, de uno en uno y en campaña, la importación, las estadísticas, un reembolso, la API — y todo respondió. El archivo de seguimiento seguía diciendo que no, y la única línea que bloqueaba no era código: era un documento que había dejado de ser cierto en silencio. Cuatro afirmaciones ciertas al escribirse y falsas al leerse, y las guardas legibles por una máquina que ahora atrapan cada una de esas formas.

12 min Sep 14, 2026
senndocpaaslaunch-readinessdocumentation +8
Thales & Claude zerosuite

El navegador en manos de Claude: manejar el propio Chrome del CEO

Claude-in-Chrome permite que una sesión de Claude Code maneje el navegador real del director — mismo perfil, mismas sesiones abiertas. Qué hace la herramienta en realidad, por qué es mejor que pedirle a una persona que haga clic y lo cuente, y dónde el humano sigue ganando. Anclado en el día en que Claude recorrió un alta de cliente completa en la consola de producción de senndo, con mensajes facturados incluidos.

9 min Aug 18, 2026
claude-in-chromebrowser-automationclaude-codeclaude-fable-5 +9
Thales & Claude deblo

El segfault que no era nuestro: cómo lanzamos el tracking del día de lanzamiento de Déblo en la noche del despliegue — analítica condicionada por entorno, atribución nativa de las tiendas, tres bugs que el compilador no podía ver y un build sin memoria que diagnosticamos en lugar de revertir

El 1 de julio de 2026 — el día del lanzamiento — el riesgo nunca fue el texto. Era que las campañas de pago salieran a ciegas. Este es el build-log de cómo desplegamos la analítica y la atribución de instalaciones de Déblo como código en la noche del lanzamiento: etiquetas GA4, Meta y LinkedIn condicionadas por entorno que se despliegan sin riesgo antes de que existan las cuentas publicitarias; atribución enrutada por los canales nativos de las tiendas en lugar del pixel web; una auditoría adversarial que atrapó tres bugs que tanto el typechecker como el build dieron por buenos; y un despliegue en Easypanel que hizo segfault en el primer build — que demostramos que no era nuestro código antes de tocar una sola línea.

18 min Jul 1, 2026
deblolaunch-dayclaude-opus-4.8claude-code +26