Calc/.doc/Guia_Base.md

7.0 KiB

Guía de Principios Arquitectónicos - Calculadora Algebraica Híbrida

Filosofía Central: Álgebra Simbólica con Evaluación Numérica

Concepto Fundamental

La calculadora mantiene forma simbólica como representación primaria y proporciona evaluación numérica como información complementaria cuando es posible y útil.

Principio de Evaluación Numérica: El resultado siempre se intenta calcular numéricamente y se muestra cuando la representación string del resultado numérico difiere del resultado algebraico.

Sistema de Asignaciones y Ecuaciones

Principio: Separación clara entre asignaciones y ecuaciones

# Asignación de variable
x = 5              # → Se guarda el valor simbólico (NO se agrega como ecuación)
y = x + a          # → Se guarda la expresión simbólica

# Ecuación pura (detección automática)
x**2 + 2*x = 8     # → Se agrega como ecuación Eq(x**2 + 2*x, 8)
a + b = 10         # → Se agrega como ecuación Eq(a + b, 10)
a > b + 1          # → Se agrega como desigualdad

Criterios de Detección de Ecuaciones

Se considera ecuación si:

  • Contiene = Y NO es una asignación simple de variable
  • Contiene operadores de comparación: ==, >, <, >=, <=
  • Tiene estructura algebraica en ambos lados del =

NO se considera ecuación:

  • Asignaciones simples: x = 5, y = expresión
  • Líneas con solo números o comentarios

Uso de solve() y el Atajo =?

Principio: variable=? es equivalente a solve(variable)

# Ambas formas son idénticas:
solve(a)    # Resuelve 'a' usando el sistema de ecuaciones
a=?         # Atajo sintáctico para solve(a)

El comando intenta resolver algebraicamente y numéricamente en paralelo cuando es posible.


Sistema de Tokenización con Prioridades

Principio: Las prioridades son números arbitrarios que determinan el orden de aplicación

Prioridad 5:  IntBase    → Patrón: 16#FF (muy específico)
Prioridad 6:  Hex/Bin    → Patrón: 0xFF, 0b1010 (específico)
Prioridad 10: FourBytes  → Patrón: x.x.x.x (general)

Regla: Menor número = se aplica primero

Esto garantiza que 16#10.10.10.10 se tokenice como IntBase antes de considerar FourBytes.


Conversión Perezosa y Tipos Especializados

Principio: Mantener el tipo especializado siempre que sea posible

Se evita convertir a SymPy al máximo. Los objetos especializados mantienen su tipo cuando pueden resolver la operación internamente.

# Operaciones que mantienen el tipo especializado:
Hex(15) + 1         Hex(16)      # Hex maneja la suma
16#15 + 1          → 16#16        # IntBase maneja la suma
10.1.1.1 + 1        10.1.1.2     # FourBytes maneja la suma

# Conversión a SymPy solo cuando es necesario:
sin(16#FF)         → sin(255)     # sin() requiere SymPy
solve(x + 16#10)   → solve()      # Álgebra compleja requiere SymPy

Regla: Solo se convierte a SymPy cuando el token no es atómico o la operación requiere capacidades algebraicas avanzadas.


Contexto Limpio por Evaluación

Principio: Cada evaluación comienza desde cero

Contexto Limpio significa:

  • Se eliminan todas las ecuaciones previas
  • Se eliminan todas las variables definidas
  • Se re-evalúa todo el contenido línea por línea
  • Comportamiento idéntico a iniciar una nueva sesión

Esto garantiza resultados predecibles y sin efectos secundarios acumulados.


Resultados Interactivos

Principio: Activación mediante clicks en elementos con binding

Los resultados interactivos se crean cuando el tipo de resultado requiere visualización expandida:

plot(sin(x))        "📊 Ver Plot"      # Click abre ventana matplotlib
Matrix([[1,2],[3,4]])  "📋 Ver Matriz" # Click muestra matriz formateada
[1,2,3,4,5,6,7,8]   "📋 Ver Lista"     # Click expande contenido

Activación: Click en el texto con binding dispara la ventana emergente correspondiente.


Sistema de Autocompletado

Principio: Sistema extensible con prioridades (por implementar)

Se propone usar un sistema de prioridades numéricas similar al de tokenización:

Prioridad 1: Métodos del objeto específico
Prioridad 2: Métodos de la clase base
Prioridad 3: Funciones SymPy relevantes
Prioridad 4: Helpers contextuales

Integración con SymPy

Principio: En casos de conflicto, siempre prevalece SymPy

Cuando hay ambigüedad o conflicto entre tipos personalizados y SymPy:

  • Funciones SymPy tienen precedencia
  • Símbolos SymPy (como e, pi) mantienen su significado matemático
  • Las conversiones fallidas retornan a comportamiento SymPy estándar

Arquitectura de Tipos Personalizados

Clases Base Universales

IntBase: Números en cualquier base

  • Aritmética nativa que preserva la base
  • Conversión a SymPy solo cuando necesario
  • Soporte para símbolos algebraicos

FourBytes: Patrones x.x.x.x

  • Aritmética de 32-bit para IPs
  • Soporte para elementos simbólicos
  • Base para tipos como IP4

Principio de Extensibilidad

Cada tipo en custom_types/ define:

  1. Su lógica de tokenización
  2. Sus operaciones aritméticas
  3. Sus métodos de conversión
  4. Su ayuda contextual
  5. Sus sugerencias de autocompletado

Flujo de Evaluación Completo

Entrada Usuario
    ↓
[Tokenización Universal]
    ↓
¿Asignación o Ecuación?
    ├─ Asignación → Guardar valor simbólico
    └─ Ecuación → Agregar al sistema
    ↓
[Evaluación]
    ├─ Mantener tipo especializado si es posible
    └─ Convertir a SymPy si es necesario
    ↓
[Resultado]
    ├─ Forma simbólica (siempre)
    └─ Evaluación numérica (si difiere como string)

Ejemplos Integrales

# Tokenización y tipos especializados
16#FF + 2#1010     → 16#109        # IntBase preservado
192.168.1.1 + 5     192.168.1.6   # FourBytes preservado

# Asignaciones vs ecuaciones
x = 10             # Asignación (solo guarda valor)
x + y = 15         # Ecuación (se agrega al sistema)
y=?                # solve(y) → y = 5

# Evaluación numérica automática
4/5                 4/5  0.8     # Difiere como string
sqrt(2)             2  1.414    # Difiere como string
2 + 3               5             # NO se muestra ≈ (igual string)

# Resultados interactivos
plot(sin(x))        "📊 Ver Plot" [clickeable]
Matrix([[1,2]])     "📋 Ver Matriz" [clickeable]

Principios de Diseño Resumidos

  1. Álgebra primero: Mantener forma simbólica siempre
  2. Evaluación numérica inteligente: Mostrar solo cuando agrega valor
  3. Tipos especializados preservados: Conversión a SymPy solo cuando necesario
  4. Tokenización ordenada: Sistema de prioridades simple y predecible
  5. Contexto limpio: Cada evaluación desde cero
  6. Extensibilidad: Nuevos tipos se integran automáticamente
  7. SymPy prevalece: En conflictos, el comportamiento matemático estándar gana

Este documento ahora refleja con precisión la arquitectura implementada y sirve como guía coherente para el desarrollo futuro.