5.4 KiB
Solución: Contexto Limpio en Cada Evaluación
Problema Identificado
La aplicación tenía un comportamiento inesperado donde al evaluar una secuencia como:
x
x=1
y+x
x=x+1
x
El primer x
ya mostraba un valor (en este caso 2[Integer]
) cuando debería estar indefinido inicialmente.
Causa Raíz REAL
El problema NO era solo el historial, sino que la aplicación mantenía el contexto de variables entre evaluaciones. Cuando el usuario modificaba cualquier línea, la aplicación reevaluaba manteniendo las variables previamente definidas, en lugar de construir el contexto desde cero.
Esto significaba que:
- Si había
x=1
en alguna línea anterior - Y luego el usuario añadía una línea
x
al principio - El
x
del principio usaba el valor de la evaluación anterior en lugar de iniciar limpio
Solución Implementada
Modificación Principal: Contexto Limpio en Cada Evaluación
Antes:
def _evaluate_and_update(self):
"""Evalúa todas las líneas y actualiza la salida"""
try:
input_content = self.input_text.get("1.0", tk.END)
if not input_content.strip():
self._clear_output()
return
lines = input_content.splitlines()
self._evaluate_lines(lines) # ← Mantenía contexto anterior
except Exception as e:
self._show_error(f"Error durante evaluación: {e}")
Después:
def _evaluate_and_update(self):
"""Evalúa todas las líneas y actualiza la salida"""
try:
input_content = self.input_text.get("1.0", tk.END)
if not input_content.strip():
self._clear_output()
return
# NUEVO: Limpiar completamente el contexto antes de cada evaluación
# Esto garantiza que cada modificación reevalúe todo desde cero
self.engine.clear_all()
lines = input_content.splitlines()
self._evaluate_lines(lines)
except Exception as e:
self._show_error(f"Error durante evaluación: {e}")
Cambios Adicionales
-
Eliminación de llamadas redundantes: Los métodos
clear_variables()
,clear_equations()
yclear_all()
ya no llaman a_evaluate_and_update()
porque ahora cada evaluación limpia automáticamente. -
Limpieza del historial: También se limpió el historial, pero esto era secundario al problema real.
-
Opción manual para limpiar historial: Se añadió en el menú Editar → Limpiar historial.
Comportamiento Resultante
Ahora cada vez que se modifica cualquier línea:
- Se limpia completamente el contexto -
engine.clear_all()
- Se reevalúa TODO desde la línea 1 - construcción paso a paso
- El contexto se construye de arriba hacia abajo - sin memoria de evaluaciones anteriores
- Variables solo existen si están definidas en líneas anteriores - comportamiento predictible
Prueba de Verificación
El script test_contexto_limpio.py
confirma el comportamiento:
=== PRUEBA DE CONTEXTO LIMPIO POR EVALUACIÓN ===
--- PRIMERA EVALUACIÓN: x solo ---
Resultado: x # ← Símbolo puro, sin valor
Variables después: {} # ← Contexto limpio
--- TERCERA EVALUACIÓN: x, x=1, y+x ---
x (antes de asignar): x # ← Siempre símbolo puro al inicio
x=1: 1 # ← Se asigna
y+x: y + 1 # ← Usa el x=1 asignado arriba
Variables después: {'x': 1} # ← Contexto construido paso a paso
Beneficios de la Solución Real
- ✅ Contexto predecible: Cada evaluación inicia completamente limpia
- ✅ Construcción desde arriba: Las variables solo existen si se definen arriba
- ✅ Sin memoria persistente: No hay variables "fantasma" de evaluaciones anteriores
- ✅ Comportamiento intuitivo: Lo que ves es lo que tienes
- ✅ Reevaluación completa: Cada cambio reconstruye todo desde cero
Archivos Modificados
main_calc_app.py
- Método_evaluate_and_update()
con limpieza automáticamain_calc_app.py
- Métodosclear_*()
simplificadosmain_calc_app.py
- Menús simplificados: Eliminadas opciones redundanteshybrid_calc_history.txt
- Limpiado (cambio menor)test_contexto_limpio.py
- Script de prueba (nuevo)
Cambios en la Interfaz de Usuario
Opciones ELIMINADAS del menú (ya no tienen sentido):
-
Menú Editar:
- ❌ "Limpiar variables"
- ❌ "Limpiar ecuaciones"
- ❌ "Limpiar todo"
-
Menú CAS completo:
- ❌ "Mostrar variables"
- ❌ "Mostrar ecuaciones"
- ❌ "Resolver sistema"
Opciones CONSERVADAS (aún útiles):
-
Menú Editar:
- ✅ "Limpiar entrada" - limpia el editor de texto
- ✅ "Limpiar salida" - limpia el panel de resultados
- ✅ "Limpiar historial" - elimina el archivo de historial
-
Menú Archivo:
- ✅ "Nuevo" - inicia sesión nueva (limpia entrada y salida)
- ✅ "Cargar..." / "Guardar como..." - manejo de archivos
La solución real no era el historial, sino garantizar que cada evaluación construye el contexto completamente desde cero.
Impacto en la Experiencia de Usuario
✅ Interfaz más limpia: Sin opciones confusas que no funcionan como se espera ✅ Comportamiento predecible: Lo que ves en el editor es exactamente lo que tienes ✅ Simplicidad: Menos opciones que manejar, enfoque en la funcionalidad principal ✅ Consistencia: El comportamiento es coherente con la filosofía "de arriba hacia abajo"