DocumentaciónAsignación Condicional

Asignacion Condicional Avanzada

La asignacion condicional avanzada permite escribir decisiones y construcciones de vectores en una forma compacta y expresiva.

En BLOX existen dos familias principales:

  • asignacion condicional escalar
  • construccion vectorial con MIENTRAS ... VALOR ...

Ambas comparten la palabra clave VALOR, pero no tienen exactamente la misma semantica.


1. Asignacion condicional escalar

Se usa para asignar un valor a una variable segun una condicion.

Sintaxis

ejemplo.blox
variable = SI (condicion) VALOR expr
variable = SI (condicion) VALOR expr SINO expr2

Semantica

Forma completa

ejemplo.blox
variable = SI (condicion) VALOR expr SINO expr2

Significa:

  • si la condicion es verdadera, se asigna expr
  • si la condicion es falsa, se asigna expr2

Es equivalente a:

ejemplo.blox
SI (condicion) ENTONCES
    variable = expr
SINO
    variable = expr2
FIN_SI

Forma abreviada sin SINO

ejemplo.blox
variable = SI (condicion) VALOR expr

Significa:

  • si la condicion es verdadera, se asigna expr
  • si la condicion es falsa, la variable conserva su valor anterior

Es equivalente a:

ejemplo.blox
SI (condicion) ENTONCES
    variable = expr
FIN_SI

Ejemplo con NUMERICO

ejemplo.blox
FUNCION PRINCIPAL
INICIO

    NUMERICO mayor, c, d

    c = 54
    d = 10

    mayor = SI (c > d) VALOR c SINO d

    IMPRIMIR("\nmayor = ", mayor)   // Esperado: 54

FINAL

Ejemplo sin SINO

ejemplo.blox
FUNCION maximo(V)
INICIO
    NUMERICO i, dimension, mayor

    dimension = V.dim
    mayor = V[0]

    i = 1
    MIENTRAS (i < dimension) HACER
        mayor = SI (V[i] > mayor) VALOR V[i]
        i = i + 1
    FIN_MIENTRAS

    RETORNAR mayor
FINAL_FUNCION

En este caso:

  • si V[i] > mayor, mayor se actualiza
  • si no, mayor conserva su valor anterior

2. Construccion vectorial con MIENTRAS

Esta forma permite construir un vector elemento a elemento usando el iterador interno k.

Nota importante sobre la clausula MIENTRAS

En esta construccion vectorial, MIENTRAS no aparece solo ni recibe una condicion logica arbitraria como en los bucles normales.

Una forma general de esta sintaxis es:

ejemplo.blox
v = MIENTRAS (k < limite) SI (condicion) VALOR expr1 SINO expr2

donde limite puede ser:

  • un literal numerico
  • una variable numerica
  • una expresion numerica

Ademas:

  • k es un iterador interno de esta construccion
  • no necesita ser declarado
  • no puede reemplazarse por otro nombre como i

y condicion puede ser:

  • una variable del tipo LOGICO
  • cualquier expresion logica

Por ejemplo, esta forma es valida:

ejemplo.blox
v = MIENTRAS (k < limite) VALOR k

pero esta forma no pertenece a la sintaxis soportada:

ejemplo.blox
v = MIENTRAS (i < limite) VALOR i

En la implementacion actual, la construccion reconoce especificamente el iterador k.

Esa clausula no es la unica variante soportada.

Podemos escribirla de varias maneras, por ejemplo:

ejemplo.blox
v = MIENTRAS (k < limite) VALOR expr
v = MIENTRAS (k < limite) SI (condicion) VALOR expr
v = MIENTRAS (k < limite) SI (condicion) VALOR expr1 SINO expr2

Semantica de cada parte

  • MIENTRAS (k < limite) define el recorrido del indice k
  • VALOR ... define el valor que se agrega al vector
  • SI (condicion) es opcional y permite filtrar o elegir entre ramas

Formas soportadas

ejemplo.blox
vector = MIENTRAS (k < limite) VALOR expr
vector = MIENTRAS (k < limite) SI (condicion) VALOR expr
vector = MIENTRAS (k < limite) SI (condicion) VALOR expr SINO expr2

Interpretacion

  • sin SI: mapeo directo
  • con SI y sin SINO: filtro + proyeccion
  • con SI y SINO: seleccion completa

Semantica

Mapeo directo

ejemplo.blox
vector = MIENTRAS (k < limite) VALOR expr

Para cada valor de k:

  • se evalua expr
  • el resultado se agrega al vector

Es una forma compacta de generar un vector completo.

Ejemplo: linspace

ejemplo.blox
FUNCION linspace(puntos, x_min, x_max)
INICIO
    SI (puntos < 1) ENTONCES
        VECTOR v[1]
        v[0] = x_min
        RETORNAR v
    FIN_SI

    NUMERICO dx, aux

    aux = SI (puntos > 1) VALOR puntos SINO 1
    dx = (x_max - x_min) / aux

    VECTOR v[puntos]
    v = MIENTRAS (k < puntos) VALOR x_min + k*dx

    RETORNAR v
FINAL_FUNCION

Filtro + proyeccion

ejemplo.blox
vector = MIENTRAS (k < limite) SI (condicion) VALOR expr

Para cada valor de k:

  • si la condicion es verdadera, se agrega expr
  • si la condicion es falsa, no se agrega ningun elemento

El vector resultado puede tener menos elementos que limite.

Ejemplo

ejemplo.blox
FUNCION PRINCIPAL
INICIO

    VECTOR v

    v = MIENTRAS (k < 6) SI (k % 2 == 0) VALOR k

    DEPURAR(v)   // Esperado: [0, 2, 4]

FINAL

Seleccion completa

ejemplo.blox
vector = MIENTRAS (k < limite) SI (condicion) VALOR expr SINO expr2

Para cada valor de k:

  • si la condicion es verdadera, se agrega expr
  • si la condicion es falsa, se agrega expr2

En este caso, el vector final normalmente tendra limite elementos.

Ejemplo

ejemplo.blox
FUNCION PRINCIPAL
INICIO

    VECTOR v[15]

    v = MIENTRAS (k < v.dim) SI (k % 5 == 0) VALOR pi/RAIZ(2) SINO 0

    vectores.imprimir(v)

FINAL

Este ejemplo llena el vector con:

  • pi/RAIZ(2) en los indices multiplo de 5
  • 0 en las demas posiciones

3. Diferencia conceptual entre escalares y vectores

Aunque ambas sintaxis usan SI (...) VALOR ..., no hacen lo mismo.

En escalares

ejemplo.blox
x = SI (cond) VALOR expr

Aqui ya existe un destino previo: la variable x.

Si la condicion es verdadera:

  • se asigna expr

Si la condicion es falsa:

  • x conserva su valor anterior

Es decir, la forma escalar sin SINO no crea un valor nuevo para la rama falsa. Lo que hace es preservar el estado que la variable ya tenia antes de la asignacion.

En vectores

ejemplo.blox
v = MIENTRAS (...) SI (cond) VALOR expr

Aqui no existe un valor previo por posicion que haya que conservar. El vector se va construyendo durante el recorrido.

Si la condicion es verdadera:

  • se agrega expr al vector resultado

Si la condicion es falsa:

  • no se agrega ningun elemento

Es decir, la forma vectorial sin SINO no preserva un valor anterior. Simplemente omite esa posicion del resultado.

Diferencia clave

  • en escalares, la rama falsa preserva el contenido previo de una variable ya existente
  • en vectores, la rama falsa reduce la salida porque no agrega un nuevo elemento

Por eso las dos formas pueden parecer parecidas en la sintaxis, pero no tienen la misma semantica. La diferencia es intencional y hace que ambas resulten utiles.


4. Cuando conviene usar cada forma

Usa asignacion condicional escalar cuando:

  • quieres decidir un valor entre dos alternativas
  • quieres actualizar una variable solo si una condicion se cumple
  • quieres escribir codigo mas compacto sin perder claridad

Usa construccion vectorial con MIENTRAS cuando:

  • quieres generar un vector a partir de una formula
  • quieres filtrar elementos mientras construyes el resultado
  • quieres evitar bucles manuales para tareas de mapeo o seleccion

5. Buenas practicas

  • Usa la forma sin SINO solo cuando la semantica sea evidente.
  • Si la condicion o la expresion son muy largas, considera partirlas en variables auxiliares.
  • En vectores, recuerda que la forma sin SINO puede reducir el tamano final del resultado.
  • Si necesitas conservar exactamente la misma cantidad de elementos, usa la forma con SINO.

6. Resumen rapido

Escalares

ejemplo.blox
var = SI (cond) VALOR expr
var = SI (cond) VALOR expr SINO expr2

Vectores

ejemplo.blox
v = MIENTRAS (k < limite) VALOR expr
v = MIENTRAS (k < limite) SI (cond) VALOR expr
v = MIENTRAS (k < limite) SI (cond) VALOR expr SINO expr2

Idea clave

  • en escalares sin SINO, se conserva el valor anterior
  • en vectores sin SINO, se filtran los elementos