a>10 && b<c+5 && (a+b)<c*4
js | 239 ms |
mxParser | 56713 ms |
evalex | 35 ms |
groovy | 118 ms |
Jexl | 62 ms |
s"{a>10}"
but I could not find a way to turn a regular string into a string for interpolation.
s"You are ${age / 10} decades old, $name!"
it really
StringContext ("You are ", " decades old, ", "!").s (age / 10, name)
and turns into "You are " + (age / 10) + " decades old, " + (name) + "!"
val e = ScriptEngineManager().getEngineByName("js") fun jsEvaluate(a: Double, b: Double, c: Double): Boolean { e.context.setAttribute("a", a, ScriptContext.ENGINE_SCOPE) e.context.setAttribute("b", b, ScriptContext.ENGINE_SCOPE) e.context.setAttribute("c", c, ScriptContext.ENGINE_SCOPE) return e.eval(expr) as Boolean }
val mxExpr = org.mariuszgromada.math.mxparser.Expression(expr) fun mxParserEvaluate(a: Double, b: Double, c: Double): Boolean { val v1 = Argument("a = $a") val v2 = Argument("b = $b") val v3 = Argument("c = $c") mxExpr.addArguments(v1, v2, v3) return mxExpr.calculate() == 1.0 }
val evalExpression = com.udojava.evalex.Expression(expr) fun evalexEvaluate(a: Double, b: Double, c: Double): Boolean { val eval = evalExpression.with("a", BigDecimal.valueOf(a)).and("b", BigDecimal.valueOf(b)).and("c", BigDecimal.valueOf(c)).eval() return eval == BigDecimal.ONE }
val template = groovy.text.GStringTemplateEngine().createTemplate(expr) fun groovyEvaluate(a: Double, b: Double, c: Double): Boolean { val binding = HashMap<String, Double>() binding.put("a", a) binding.put("b", b) binding.put("c", c) val template = template.make(binding) return template.toString().toBoolean() }
val jexl = JexlBuilder().create() val jexlExp = jexl.createExpression(expr) fun jexlEvaluate(a: Double, b: Double, c: Double): Boolean { val jc = MapContext() jc.set("a", a) jc.set("b", b) jc.set("c", c) return jexlExp.evaluate(jc) as Boolean }
Source: https://habr.com/ru/post/354692/