Diferencias con el ex4j original¶
- Índice de contenidos
- Diferencias con el ex4j original
- Nota
- Diferencias Generales
Nota¶
Existen muchas diferencias con exp4j
original, algunas de las cuales pueden causar problemas de compatibilidad para usuarios avanzados de exp4j
.
Diferencias Generales¶
Entre los cambios mas significativos de esta versión de exp4j
se encuentran: un simplificador (preevaluador), manejo de variables, funciones adicionales, enums, constantes como funciones e impresión de tokens.
Simplificador (preevaluador)¶
El simplificador es una funcionalidad intereante (discusión original) cuando las expresiones tienen operaciones conocidas en tiempo de creación, por ejemplo, consideremos la expresión 2^x + 4 / 2
que puede convertirse en 2^x + 2
. No parece demasiado.... o si? la realidad es que al utilizar múltiples evaluaciones, muchas constantes varios valores de x
(por ejemplo al graficar) esta diferencia es muy notoria (primera prueba de performance).
Otra simplificación interesante es al utilizar expresiones del tipo if(exp, v_true, v_false)
, el simplificador puede quitar (en algunos casos) el bloque if
completo, por ejemplo if(1 > 0 & 3 < 4, a * pi(), e())
se convierte en a * pi()
(de hecho en if(1, a * pi(), e())
... Todavía estoy trabajando en esto...
Usando el simplificador¶
Por defecto se encuentra desactivado, dado que no es realmente necesarios cuando se ejecuta una operación una sola vez (el simplificador hace toda una evaluación para funcionar).
Para activar el simplificador simplemente es necesario pasar true
al builder:
// por defecto ExpressionBuilder#build() es #build(false)
Expression ex = new ExpressionBuilder("2^3 + 4 / 2").build(true);
double result = ex.evaluate();
Una pequeña nota¶
Un simplificador debería simplificar solamente funciones determinísticas, por lo tanto ahora disponemos de una bandera deterministic
en el constructor de las funciones (valor por defecto true
). Por lo tanto si utiliza funciones no deterministas deberá cambiar la declaración de la función a:
Function rand_deterministica = new Function("randd", 0) {
@Override
public double apply(double... args) {
// Falla épica de simplificación
return Math.random();
}
};
A esto:
Function rand_NO_deterministica = new Function("randnd", 0, false) {
// Esta bandera ^^^^^
@Override
public double apply(double... args) {
return Math.random();
}
};
Este cambio puede resultar molesto para aquellos que utlicen muchas funciones no deterministas... aunque dado que el simplificador está desactivado por defecto, la mayoría de la gente no debería tener problemas.
Manejo interno de variables¶
Esto no es un cambio muy importante, la idea es mejorar un poco el rendimiento, evitar errores y generar un código mas legible. Pero no honra la filosofía de inmutabilidad de las calculadoras basadas en stacks, así que si desea comenzar a hackear exp4j
va a tener que tomar esto en cuenta.
Entonces... ¿cuál es el cambio?¶
El cambio real es d2d96fce y en 7f280988 puede verse una de las situaciones que se generan.
The original exp4j
uses one token per variable, that's to say one token each time a variable is present in an expression which creates every time a variable is set, a state where the same variable has a different values in an expression. That's really a no go for me.
Esta versión de exp4j
usa el mismo token para todas las instancias de una variable en una expresión (en versiones anteriores existían situaciones en las que podía tenerse varios valores diferentes para una sola variable.
Impresión de tokens¶
A partir de esta versión es posible imprimir la representación interna de una expresión.
¿Cómo?¶
Las dos formas básicas son:
Expression exp = new ExpressionBuilder("2x + 1").variable("x").build();
String out1 = exp.toString();
// out1 -> 2.0 x * 1.0 +
String out2 = exp.toTokenString();
// out2 -> NUMBER[2.0] VARIABLE[x] OPERATOR[*] NUMBER[1.0] OPERATOR[+]
Constantes como funciones¶
Finalmente nos encontramos con el cambio que va a resultar mas molesto por algunos usuarios, y el que tiene mas probabilidades de romper cosas. En la verisión original de exp4j
las constantes eran declaradas como variables inmutables, pero en esta versión de exp4j
son declaradas como funciones, por lo tanto una expresión como d * pi
pasa a ser d * pi()
.
Cache de evaluación¶
Se implementó #752 y el cache de evaluación está disponible.
Traducciones¶
Todos los mensajes y advertencias pueden ser traducidos, y ya se tiene la primera traducción al Español
Serialización¶
Todas las expresiones son Serializable
s!
Funciones adicionales¶
Actualizado por Federico Vera hace más de 6 años · 4 revisiones
Volver al inicio