Create function definition tools

This commit is contained in:
2020-03-08 00:10:26 +01:00
parent 634ea2711b
commit d24f1d72c7
4 changed files with 54 additions and 2 deletions

View File

@@ -0,0 +1,25 @@
package io.smnp.api.callable
import io.smnp.api.environment.Environment
import io.smnp.api.model.Value
abstract class Function(val name: String) {
private var definitions: List<FunctionDefinition> = mutableListOf()
abstract fun define(new: FunctionDefinitionTool)
init {
definitions = FunctionDefinitionTool().apply { define(this) }.definitions
}
fun call(environment: Environment, vararg arguments: Value): Value {
val (definition, args) = definitions
.map { Pair(it, it.signature.parse(arguments.toList())) }
.first { (_, args) -> args.signatureMatched }
// TODO: Throw exception if signature is not matched
return definition.body(environment, args.arguments)
}
val signature: String
get() = definitions.joinToString("\nor\n") { "$name${it.signature}" }
}

View File

@@ -0,0 +1,7 @@
package io.smnp.api.callable
import io.smnp.api.environment.Environment
import io.smnp.api.model.Value
import io.smnp.api.signature.Signature
class FunctionDefinition(val signature: Signature, val body: (Environment, List<Value>) -> Value)

View File

@@ -0,0 +1,20 @@
package io.smnp.api.callable
import io.smnp.api.environment.Environment
import io.smnp.api.model.Value
import io.smnp.api.signature.Signature
class FunctionDefinitionTool {
val definitions: MutableList<FunctionDefinition> = mutableListOf()
infix fun function(signature: Signature): FunctionDefinitionToolStage2 {
return FunctionDefinitionToolStage2(signature)
}
inner class FunctionDefinitionToolStage2(private val signature: Signature) {
infix fun define(body: (Environment, List<Value>) -> Value) {
definitions.add(FunctionDefinition(signature, body))
}
}
}

View File

@@ -1,11 +1,11 @@
package io.smnp.api.model
class ArgumentsList(val isValid: Boolean, val arguments: List<Value>) {
class ArgumentsList(val signatureMatched: Boolean, val arguments: List<Value>) {
operator fun get(index: Int) = arguments[index]
fun toArray() = arguments.toTypedArray()
override fun toString() = if(isValid) "valid($arguments)" else "invalid"
override fun toString() = if(signatureMatched) "valid($arguments)" else "invalid"
companion object {
fun valid(arguments: List<Value>): ArgumentsList {