In Java, the following does the trick:
// Extend Arithmetic
public static class ExtendedJexlArithmetic extends JexlArithmetic {
public ExtendedJexlArithmetic(boolean strict){
super(strict);
}
public double xor(Number l, Number r){
return Math.pow(l.doubleValue(), r.doubleValue());
}
}
@Test
public void test333() throws Exception {
JexlEngine jexl = new JexlBuilder().arithmetic(new
ExtendedJexlArithmetic(true)).create();
JexlScript spow = jexl.createScript("x ^ y", "x", "y");
Object r = spow.execute(null, 2, 3);
Assert.assertTrue(r instanceof Number);
Assert.assertEquals(8.d, ((Number) r).doubleValue(), 1e-7);
}
On 2020/09/23 14:28:33, BENGUIGUI Michael
<[email protected]> wrote:
> Dear all,
>
> I am trying to evaluate the following expression via jexl : x^y
> What I've tried, is to extend JexlArithmetic:
>
> // Extend Arithmetic
> public class ExtendedJexlArithmetic extends JexlArithmetic
> {
> public ExtendedJexlArithmetic(boolean strict){
> super(strict);
> }
>
> public xor(Object l, Object r){
> return Math.pow(l, r);
> }
> }
>
> def engine = new
> JexlBuilder().cache(512).strict(true).silent(false).namespaces(ns).arithmetic(new
> ExtendedJexlArithmetic(true)).create();
> engine.createExpression(model_formula).evaluate(contextMap);
>
>
> However, it does not consider operator priority. As a result, I am still
> getting wrong results:
>
> 2+4^3 -> 216 (instead of 66).
>
> How can I properly fix this ?
>
> Thhhx!
>
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]