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 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
Thales & Claude thales

Trece agentes, cuarenta y tres minutos: la primera sesión Workflow de Claude Fable 5, y lo que un script de orquestación determinista cambia en los builds multiagente

Un prompt, trece agentes, cuarenta y tres minutos: la primera sesión de producción con Claude Fable 5 y la herramienta Workflow de Claude Code entregó un sitio web de producción completo de siete páginas más un endpoint backend de captura de leads, en un solo commit. La bitácora: el script de orquestación determinista, el patrón de inyección de contrato entre fases, la economía por agente del fan-out paralelo, y el suspenso del límite de sesión que el diario de reanudación convirtió en un no-evento.

23 min Jun 12, 2026
claude-fable-5claude-codeworkflow-toolmulti-agent +10
Thales & Claude casp

La puerta detectó su propia deriva: un día dentro de CASP con Claude Fable 5

Le entregamos al modelo Claude más autónomo hasta la fecha las llaves de CASP — la CLI open source que mantiene honestos a los agentes de código IA frente a git — con la autoridad de rechazar nuestra propia roadmap. Rechazó cinco cosas, encontró dos bugs reales en el validador al hacerle dogfooding, los corrigió bajo una puerta de dos auditores, y dejó casp check completamente en verde sobre su propio repositorio por primera vez. CASP 0.3.0 es el resultado.

15 min Jun 10, 2026
caspzerosuiteworkflowai-cto +9