You are viewing a plain text version of this content. The canonical link for it is here.
Posted to user@commons.apache.org by Henri Biestro <he...@apache.org> on 2020/10/27 10:39:58 UTC

Re: [jexl] Make jexl consider power operator

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 <mi...@irt-saintexupery.com> 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: user-unsubscribe@commons.apache.org
For additional commands, e-mail: user-help@commons.apache.org