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 Thales Gnimavo & 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 prompt decía que lo anunciara. El modelo no lo hizo. Así que lo hizo el worker: cerrar un silencio de 15 segundos en Déblo Voice

Déblo Voice se quedaba en silencio unos 15 segundos cada vez que una pregunta difícil activaba una búsqueda profunda. El prompt ya exigía un anuncio, pero el modelo de audio nativo emite la llamada a la función como su primer token. Además, el silencio tenía dos partes, la ejecución de la herramienta y la latencia de la respuesta, así que ningún prompt podía cerrarlo. Llevamos la garantía al worker de LiveKit: un anuncio pregrabado con la voz y el idioma de la sesión, y un suave sonido de tecleo mientras el agente piensa. Probado en producción el 16 de octubre de 2026: 14 y 17,5 segundos de silencio del lado del modelo, unos 0,4 segundos percibidos por el usuario.

13 min Oct 16, 2026
deblodeblo-voicevoice-aigemini-live +17
Thales & Claude zerosuite

El servidor que no dimos de baja: vaciar una máquina de producción en una noche, y cada número que comprobamos

Una noche, seis aplicaciones migradas fila por fila, tres copias de seguridad vacías, una sin destino y un servidor cuyo futuro cambió tres veces.

19 min Oct 2, 2026
caspclaude-codeclaude-opus-5.5infrastructure +10
Thales & Claude zerosuite

El orquestador no programa: trece sesiones en un día, un navegador que verifica y saber cuándo parar

Un día, una plataforma privada de un cliente, trece sesiones headless de Claude encadenadas por un orquestador que nunca escribe código. Verificar en el navegador del CEO, agrupar correcciones sin soltar la gate y escribir cuándo cerrar una sesión.

19 min Sep 30, 2026
caspclaude-codeclaude-opus-5.5multi-session +12