El otro día me surgió una duda frente a un error de ejecución, es una pena no haber conservado el código, pero os explico porque es muy breve:
IF ( 1 < x < 100 )
say ( "Primer intervalo" );
ELSEIF ( 101 < x < 200 )
say ( "Segundo intervalo" );
ELSEIF ( 201 < x < 300 )
say ( "Último intervalo" );
END
Este tipo de comprobaciones aritméticas compilan, pero la ejecución no es correcta, tuve que terminar haciendo:
IF ( ( 1 < x ) AND ( x < 100 ) )
...etc
También había usado varias veces este tipo de asignaciones encadenadas en estructuras sin problemas:
scale.x = scale.y = scale.z = 2;
Pero el otro día por primera vez tuve un comportamiento extraño en el que sólo uno de los campos fue asignado y terminé haciendo:
scale.x = 2;
scale.y = 2;
scale.z = 2;
¿Alguien es capaz de aclararnos algo sobre el encadenamiento de operaciones, sobre lo que se puede y lo que no se puede hacer?
esto ( 1 < x < 100 ) es lo mismo que poner ( 1 < x ) < 100
esto ( 101 < x < 200 ) es lo mismo que poner ( 101 < x ) < 200
lo mismo para todo lo demas... te sugiero leas el post de precedencia de operadores...
saludos.
La precedencia... Ya entiendo.
Está todo aclarado, pero he posteado esto en sugerencias porque creo recordar que ese tipo de encadenamientos en operadores aritméticos están soportados en lenguajes como C o Java, desconozco si basta con modificar la precedencia de operadores o si sería más complicado que eso y supondría efectos colaterales...
Vamos, se trata de esas sugerencias que han ido saliendo para la 2.0 de Bennu, por si la quieres tener en cuenta xD
Que va, ni c ni java tienen implementado ese tipo de condicional, funcionan exactamente igual que Bennu, por precedencia.
Es decir si equis es mayor que 10 y menor que 20 solo se puede comprobar con if ((x>10) and (x<20)) y no vake if (10<x<20), como propones, ya que equivale a decir si (10 es menor que equis) que devuelve true o false , es decir 1 o 0, y luego comparar ese resultado de 1 o 0 con menor que 20, y como (1 y 0 ) siempre serán mayor que 20 el segundo condicional no serviría para nada en este caso.
Quizás te refieras a otros lenguajes de más alto nivel como lua, o mathematica, o algún otro más cercano a la forma de pensar matemática, pero no te lo puedo confirmar.
ni C ni java...
en bennu podes hacer algo parecido con los switch...
switch(x)
case 1 .. 100:
end
case 101 .. 200:
end
case 201 .. 300:
end
end
Vale, os creo... Entonces sería Ada, un lenguaje mogollón de estructurado, fuertemente tipado y con muchas hostias interesantes que estudiamos intensivamente en la Universidad para luego olvidarlo para siempre.
Ok entonces, pero lo sigo dejando como sugerencia para Bennu 2.0 porque resulta muy cómodo escribir ese tipo de expresiones así.
¿Sobre la asignación encadenada también es algo que no funciona en cualquier lenguaje?
scale.x = scale.y = scale.z = 2;
pues en JAVA no y en C sí.