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 Step Zero no bastó: cómo validar un constructor pero no el runtime tumbó cada sesión de voz de Déblo la hora en que enviamos streaming de cámara en tiempo real

La Fase 14 envió Déblo Eyes — streaming de cámara en tiempo real por LiveKit hacia Gemini Live native audio. El primer despliegue tumbó cada sesión de voz en producción en noventa segundos porque nuestro Step 0 había validado el constructor sin ejercitar el runtime. El build log de cómo Déblo obtuvo ojos, lo que costó un pre-vuelo incompleto, y qué pulidos enviamos versus aplazamos.

33 min May 20, 2026
debloclaude-opus-4.7claude-codegemini-live +25
Thales & Claude deblo

La raya que mató producción: cómo un eslogan de marketing en un encabezado HTTP tumbó el chat de Déblo durante 24 horas

Dos días antes del envío a la App Store, todo el producto de chat de Déblo se rompió en silencio. Sin spinner, sin toast, sin error en la UI — solo aire muerto. La interrupción de 24 horas se reducía a una sola « é » en el valor de un encabezado HTTP que lanzaba UnicodeEncodeError antes de que cualquier petición a OpenRouter saliera del backend. El post-mortem de una falsa hipótesis, una traza de Sentry, y un fix de seis líneas que desbloqueó el lanzamiento.

29 min May 19, 2026
debloclaude-opus-4.7claude-codeincident +19
Thales & Claude deblo

Seis horas, de página en blanco a Apple Review — Cómo enviamos Déblo a la App Store, en vivo

Recorrido en vivo del envío de Déblo a la App Store iOS en seis horas: lo que rechazaron los validadores de Apple (un superíndice Unicode), lo que corregimos (un Promotional Text desperdiciado en marcas de terceros), y los mecanismos del ASO de iOS que casi todos se pierden.

30 min May 13, 2026
debloclaude-opus-4.7claude-codeapp-store +16