Create function definition tools
This commit is contained in:
25
src/main/kotlin/io/smnp/api/callable/Function.kt
Normal file
25
src/main/kotlin/io/smnp/api/callable/Function.kt
Normal 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}" }
|
||||
}
|
||||
@@ -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)
|
||||
@@ -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))
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
@@ -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 {
|
||||
|
||||
Reference in New Issue
Block a user