mirror of
https://github.com/GayPizzaSpecifications/pork.git
synced 2025-08-03 13:11:32 +00:00
while loop support, and native functions (including ffi!)
This commit is contained in:
@ -10,7 +10,8 @@ dependencies {
|
||||
api(project(":parser"))
|
||||
api(project(":frontend"))
|
||||
api(project(":evaluator"))
|
||||
implementation(libs.clikt)
|
||||
api(project(":ffi"))
|
||||
api("com.github.ajalt.clikt:clikt:4.2.0")
|
||||
implementation(project(":common"))
|
||||
}
|
||||
|
||||
|
@ -5,9 +5,11 @@ import com.github.ajalt.clikt.parameters.arguments.argument
|
||||
import com.github.ajalt.clikt.parameters.options.flag
|
||||
import com.github.ajalt.clikt.parameters.options.option
|
||||
import gay.pizza.dough.fs.PlatformFsProvider
|
||||
import gay.pizza.pork.evaluator.Arguments
|
||||
import gay.pizza.pork.evaluator.CallableFunction
|
||||
import gay.pizza.pork.evaluator.None
|
||||
import gay.pizza.pork.evaluator.Scope
|
||||
import gay.pizza.pork.ffi.JnaNativeProvider
|
||||
|
||||
class RunCommand : CliktCommand(help = "Run Program", name = "run") {
|
||||
val loop by option("--loop", help = "Loop Program").flag()
|
||||
@ -28,8 +30,12 @@ class RunCommand : CliktCommand(help = "Run Program", name = "run") {
|
||||
None
|
||||
})
|
||||
|
||||
val main = tool.loadMainFunction(scope, setupEvaluator = {
|
||||
addNativeFunctionProvider("ffi", JnaNativeProvider())
|
||||
})
|
||||
|
||||
maybeLoopAndMeasure(loop, measure) {
|
||||
tool.evaluate(scope)
|
||||
main.call(Arguments(emptyList()))
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -5,6 +5,7 @@ import gay.pizza.pork.parser.Printer
|
||||
import gay.pizza.pork.ast.CompilationUnit
|
||||
import gay.pizza.pork.ast.visit
|
||||
import gay.pizza.pork.evaluator.Arguments
|
||||
import gay.pizza.pork.evaluator.CallableFunction
|
||||
import gay.pizza.pork.evaluator.Evaluator
|
||||
import gay.pizza.pork.evaluator.Scope
|
||||
import gay.pizza.pork.frontend.ContentSource
|
||||
@ -29,11 +30,12 @@ abstract class Tool {
|
||||
|
||||
fun <T> visit(visitor: NodeVisitor<T>): T = visitor.visit(parse())
|
||||
|
||||
fun evaluate(scope: Scope) {
|
||||
fun loadMainFunction(scope: Scope, setupEvaluator: Evaluator.() -> Unit = {}): CallableFunction {
|
||||
val contentSource = createContentSource()
|
||||
val world = World(contentSource)
|
||||
val evaluator = Evaluator(world, scope)
|
||||
setupEvaluator(evaluator)
|
||||
val resultingScope = evaluator.evaluate(rootFilePath())
|
||||
resultingScope.call("main", Arguments(emptyList()))
|
||||
return resultingScope.value("main") as CallableFunction
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user