@@ -6,6 +6,7 @@ class Calculator(expressions: Array<String> = emptyArray()) : EvalContext {
66 private val evaluator = EvalVisitor (this )
77 private val variables = HashMap <String , Double >()
88 private val constants = constant()
9+ private val functions = HashMap <String , Function >()
910 private var expression = Expression ()
1011 var value: Number = expression.value
1112 get() = expression.getValue()
@@ -14,6 +15,14 @@ class Calculator(expressions: Array<String> = emptyArray()) : EvalContext {
1415 expressions.forEach { eval(it) }
1516 }
1617
18+ private fun callFunction (name : String , args : Array <Double >): Double {
19+ return if (functions.containsKey(name)) {
20+ functions[name]!! .call(args)
21+ } else {
22+ invoke(name.toLowerCase(), args)
23+ }
24+ }
25+
1726 fun eval (expr : String = ""): Calculator {
1827 expression = when (expr.isEmpty()) {
1928 true -> expression
@@ -31,9 +40,13 @@ class Calculator(expressions: Array<String> = emptyArray()) : EvalContext {
3140 expression = Expression ()
3241 }
3342
43+ fun plugin (function : Function ) {
44+ functions.put(function.name, function)
45+ }
46+
3447 override fun toString () = expression.toString()
3548 override fun isConstant (name : String ) = constants.contains(name.toLowerCase())
36- override fun call (name : String , args : ArrayList <Double >) = invoke (name.toLowerCase() , args)
49+ override fun call (name : String , args : Array <Double >) = callFunction (name, args)
3750 override fun get (name : String ) = constants.getOrDefault(name.toLowerCase(), variables.getOrDefault(name, Double .NaN ))
3851 override fun put (name : String , value : Double ) = when (isConstant(name)) {
3952 true -> Double .NaN
0 commit comments