From 63a90a599c981e4624b7a8c77e3e8308bfc3ff46 Mon Sep 17 00:00:00 2001 From: Alex Zenla Date: Tue, 5 Sep 2023 02:42:15 -0700 Subject: [PATCH] evaluator: functions now use their own evaluation visitor --- .../pizza/pork/evaluator/EvaluationContext.kt | 17 +++++++++-------- .../pizza/pork/evaluator/EvaluationVisitor.kt | 10 +++------- .../gay/pizza/pork/evaluator/Evaluator.kt | 2 +- 3 files changed, 13 insertions(+), 16 deletions(-) diff --git a/evaluator/src/main/kotlin/gay/pizza/pork/evaluator/EvaluationContext.kt b/evaluator/src/main/kotlin/gay/pizza/pork/evaluator/EvaluationContext.kt index 2114d61..bc33d65 100644 --- a/evaluator/src/main/kotlin/gay/pizza/pork/evaluator/EvaluationContext.kt +++ b/evaluator/src/main/kotlin/gay/pizza/pork/evaluator/EvaluationContext.kt @@ -8,18 +8,16 @@ class EvaluationContext( val evaluationContextProvider: EvaluationContextProvider, rootScope: Scope ) { - private var isAlreadySetup = false - val internalRootScope = rootScope.fork() val externalRootScope = rootScope.fork() - private val evaluationVisitor = EvaluationVisitor(internalRootScope) + private var initialized = false - fun setup() { - if (isAlreadySetup) { + fun init() { + if (initialized) { return } - isAlreadySetup = true + initialized = true val imports = compilationUnit.declarations.filterIsInstance() for (import in imports) { val evaluationContext = evaluationContextProvider.provideEvaluationContext(import.path.text) @@ -27,10 +25,13 @@ class EvaluationContext( } for (definition in compilationUnit.definitions) { + val evaluationVisitor = EvaluationVisitor(internalRootScope) evaluationVisitor.visit(definition) - if (definition.modifiers.export) { - externalRootScope.define(definition.symbol.id, internalRootScope.value(definition.symbol.id)) + if (!definition.modifiers.export) { + continue } + val internalValue = internalRootScope.value(definition.symbol.id) + externalRootScope.define(definition.symbol.id, internalValue) } } } diff --git a/evaluator/src/main/kotlin/gay/pizza/pork/evaluator/EvaluationVisitor.kt b/evaluator/src/main/kotlin/gay/pizza/pork/evaluator/EvaluationVisitor.kt index ae47c62..5904f74 100644 --- a/evaluator/src/main/kotlin/gay/pizza/pork/evaluator/EvaluationVisitor.kt +++ b/evaluator/src/main/kotlin/gay/pizza/pork/evaluator/EvaluationVisitor.kt @@ -102,18 +102,14 @@ class EvaluationVisitor(val root: Scope) : NodeVisitor { } override fun visitFunctionDefinition(node: FunctionDefinition): Any { - val blockFunction = visitBlock(node.block) as BlockFunction val function = CallableFunction { arguments -> - val formerScope = currentScope currentScope = root.fork() for ((index, argumentSymbol) in node.arguments.withIndex()) { currentScope.define(argumentSymbol.id, arguments.values[index]) } - try { - return@CallableFunction blockFunction.call() - } finally { - currentScope = formerScope - } + val visitor = EvaluationVisitor(currentScope) + val blockFunction = visitor.visitBlock(node.block) as BlockFunction + return@CallableFunction blockFunction.call() } currentScope.define(node.symbol.id, function) return None diff --git a/evaluator/src/main/kotlin/gay/pizza/pork/evaluator/Evaluator.kt b/evaluator/src/main/kotlin/gay/pizza/pork/evaluator/Evaluator.kt index 8b37212..13fb1d4 100644 --- a/evaluator/src/main/kotlin/gay/pizza/pork/evaluator/Evaluator.kt +++ b/evaluator/src/main/kotlin/gay/pizza/pork/evaluator/Evaluator.kt @@ -16,7 +16,7 @@ class Evaluator(val world: World, val scope: Scope) : EvaluationContextProvider val context = contexts.computeIfAbsent(identity) { EvaluationContext(unit, this, scope) } - context.setup() + context.init() return context } }