@@ -6,21 +6,19 @@ 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 >()
109 private var expression = Expression ()
10+ var environment = Environment ()
1111 var value: Number = expression.value
1212 get() = expression.getValue()
1313
1414 init {
1515 expressions.forEach { eval(it) }
1616 }
1717
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- }
18+ private fun callFunction (name : String , args : Array <Double >) = if (environment.isRegistered(name)) {
19+ environment.invoke(name, args)
20+ } else {
21+ invoke(name.toLowerCase(), args)
2422 }
2523
2624 fun eval (expr : String = ""): Calculator {
@@ -35,15 +33,16 @@ class Calculator(expressions: Array<String> = emptyArray()) : EvalContext {
3533 return this
3634 }
3735
36+ fun plugin (f : Function ): Calculator {
37+ environment.register(f)
38+ return this
39+ }
40+
3841 fun clear () {
3942 variables.clear()
4043 expression = Expression ()
4144 }
4245
43- fun plugin (function : Function ) {
44- functions.put(function.name, function)
45- }
46-
4746 override fun toString () = expression.toString()
4847 override fun isConstant (name : String ) = constants.contains(name.toLowerCase())
4948 override fun call (name : String , args : Array <Double >) = callFunction(name, args)
0 commit comments