Skip to content

Commit 99a912e

Browse files
authored
Merge pull request #55 from javecs/feature/environment
ユーザー関数が実行中に他のユーザー関数を呼び出せる環境を作成しました。
2 parents 59a5337 + 8b6dcb2 commit 99a912e

5 files changed

Lines changed: 32 additions & 12 deletions

File tree

build.gradle

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ plugins {
1616
}
1717

1818
group 'xyz.javecs.tools'
19-
version '0.2.1'
19+
version '0.2.2'
2020

2121
apply plugin: 'kotlin'
2222
apply plugin: 'antlr'

src/main/kotlin/xyz/javecs/tools/expr/Calculator.kt

Lines changed: 10 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -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)
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
package xyz.javecs.tools.expr
2+
3+
class Environment {
4+
private val functions: HashMap<String, Function> = HashMap()
5+
fun register(f: Function) {
6+
functions.put(f.name, f)
7+
f.setEnvironment(this)
8+
}
9+
fun isRegistered(name: String) = functions.containsKey(name)
10+
fun invoke(name: String, args: Array<Double>) = functions[name]!!.call(args)
11+
}

src/main/kotlin/xyz/javecs/tools/expr/Function.kt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,9 @@ class Function(signature: String, val codes: Array<String>) {
1717
private val calc = Calculator()
1818
val name = validate(signature).first
1919
val params = validate(signature).second
20+
fun setEnvironment(environment: Environment) {
21+
calc.environment = environment
22+
}
2023
fun call(args: Array<Double>): Double {
2124
if (params.size != args.size) return Double.NaN
2225
calc.clear()

src/test/kotlin/xyz/javecs/tools/expr/test/kotlin/CalculatorPluginTest.kt

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,4 +11,11 @@ class CalculatorPluginTest {
1111
calc.plugin(Function("f(x,y)", arrayOf("x + y")))
1212
assertEquals(3, calc.eval("f(1,2)").value)
1313
}
14+
15+
@Test fun plugin2() {
16+
val calc = Calculator()
17+
.plugin(Function("f(x,y)", arrayOf("x + y")))
18+
.plugin(Function("g(x,y,z)", arrayOf("f(x,y) + z")))
19+
assertEquals(6, calc.eval("g(1,2,3)").value)
20+
}
1421
}

0 commit comments

Comments
 (0)