diff --git a/src/main/kotlin/gay/pizza/pork/eval/CallableFunction.kt b/src/main/kotlin/gay/pizza/pork/eval/CallableFunction.kt new file mode 100644 index 0000000..7b310fd --- /dev/null +++ b/src/main/kotlin/gay/pizza/pork/eval/CallableFunction.kt @@ -0,0 +1,5 @@ +package gay.pizza.pork.eval + +fun interface CallableFunction { + fun call(argument: Any): Any +} diff --git a/src/main/kotlin/gay/pizza/pork/eval/Evaluator.kt b/src/main/kotlin/gay/pizza/pork/eval/Evaluator.kt index 6ef30d0..266bd34 100644 --- a/src/main/kotlin/gay/pizza/pork/eval/Evaluator.kt +++ b/src/main/kotlin/gay/pizza/pork/eval/Evaluator.kt @@ -1,7 +1,6 @@ package gay.pizza.pork.eval import gay.pizza.pork.ast.* -import java.util.function.Function class Evaluator(root: Scope) : Visitor { private var currentScope: Scope = root @@ -21,8 +20,8 @@ class Evaluator(root: Scope) : Visitor { return Unit } - override fun visitLambda(node: Lambda): Function { - return Function { _ -> + override fun visitLambda(node: Lambda): CallableFunction { + return CallableFunction { _ -> currentScope = currentScope.fork() try { var value: Any? = null diff --git a/src/main/kotlin/gay/pizza/pork/eval/Scope.kt b/src/main/kotlin/gay/pizza/pork/eval/Scope.kt index 2c2aee8..dcaf64b 100644 --- a/src/main/kotlin/gay/pizza/pork/eval/Scope.kt +++ b/src/main/kotlin/gay/pizza/pork/eval/Scope.kt @@ -1,7 +1,5 @@ package gay.pizza.pork.eval -import java.util.function.Function - class Scope(val parent: Scope? = null) { private val variables = mutableMapOf() @@ -25,12 +23,11 @@ class Scope(val parent: Scope? = null) { fun call(name: String, argument: Any = Unit): Any { val value = value(name) - if (value !is Function<*, *>) { + if (value !is CallableFunction) { throw RuntimeException("$value is not callable.") } - @Suppress("UNCHECKED_CAST") - val casted = value as Function - return casted.apply(argument) + val function = value as CallableFunction + return function.call(argument) } fun fork(): Scope {