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
variable = SI (condicion) VALOR expr
variable = SI (condicion) VALOR expr SINO expr2
Semantica
Forma completa
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:
SI (condicion) ENTONCES
variable = expr
SINO
variable = expr2
FIN_SI
Forma abreviada sin SINO
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:
SI (condicion) ENTONCES
variable = expr
FIN_SI
Ejemplo con NUMERICO
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
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,mayorse actualiza - si no,
mayorconserva 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:
v = MIENTRAS (k < limite) SI (condicion) VALOR expr1 SINO expr2
donde limite puede ser:
- un literal numerico
- una variable numerica
- una expresion numerica
Ademas:
kes 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:
v = MIENTRAS (k < limite) VALOR k
pero esta forma no pertenece a la sintaxis soportada:
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:
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 indicekVALOR ...define el valor que se agrega al vectorSI (condicion)es opcional y permite filtrar o elegir entre ramas
Formas soportadas
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
SIy sinSINO: filtro + proyeccion - con
SIySINO: seleccion completa
Semantica
Mapeo directo
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
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
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
FUNCION PRINCIPAL
INICIO
VECTOR v
v = MIENTRAS (k < 6) SI (k % 2 == 0) VALOR k
DEPURAR(v) // Esperado: [0, 2, 4]
FINAL
Seleccion completa
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
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 50en las demas posiciones
3. Diferencia conceptual entre escalares y vectores
Aunque ambas sintaxis usan SI (...) VALOR ..., no hacen lo mismo.
En escalares
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:
xconserva 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
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
expral 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
SINOsolo 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
SINOpuede reducir el tamano final del resultado. - Si necesitas conservar exactamente la misma cantidad de elementos, usa la forma con
SINO.
6. Resumen rapido
Escalares
var = SI (cond) VALOR expr
var = SI (cond) VALOR expr SINO expr2
Vectores
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