aboutsummaryrefslogtreecommitdiff
path: root/src/main/java
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2023-06-10 19:43:04 +0100
committerMichael Williamson <mike@zwobble.org>2023-06-10 19:43:04 +0100
commit4564de5f2b387ce71c906d980eb9d9ef2f5c4390 (patch)
tree4d31a16a025b8f4cc776d32ff33648ba22290696 /src/main/java
parent4089116972049123f447d72d1bd5cb5d7389c25e (diff)
Add free variables to define function instruction
Diffstat (limited to 'src/main/java')
-rw-r--r--src/main/java/org/shedlang/compiler/ast/typed/TypedFunctionDefinitionNode.java12
-rw-r--r--src/main/java/org/shedlang/compiler/stackir/StackCompiler.java1
-rw-r--r--src/main/java/org/shedlang/compiler/stackir/instructions/DefineFunctionInstruction.java2
3 files changed, 15 insertions, 0 deletions
diff --git a/src/main/java/org/shedlang/compiler/ast/typed/TypedFunctionDefinitionNode.java b/src/main/java/org/shedlang/compiler/ast/typed/TypedFunctionDefinitionNode.java
index 79d13152..9bec5e5c 100644
--- a/src/main/java/org/shedlang/compiler/ast/typed/TypedFunctionDefinitionNode.java
+++ b/src/main/java/org/shedlang/compiler/ast/typed/TypedFunctionDefinitionNode.java
@@ -115,6 +115,18 @@ public record TypedFunctionDefinitionNode(
);
}
+ public Builder addFreeVariable(String freeVariable) {
+ return new TypedFunctionDefinitionNode.Builder(
+ this.name,
+ this.positionalParams,
+ this.namedParams,
+ this.effect,
+ this.returnType,
+ this.freeVariables.plus(freeVariable),
+ this.body
+ );
+ }
+
public TypedFunctionDefinitionNode.Builder addStatement(TypedFunctionStatementNode statement) {
return new TypedFunctionDefinitionNode.Builder(
this.name,
diff --git a/src/main/java/org/shedlang/compiler/stackir/StackCompiler.java b/src/main/java/org/shedlang/compiler/stackir/StackCompiler.java
index 55cd628f..aa59bc81 100644
--- a/src/main/java/org/shedlang/compiler/stackir/StackCompiler.java
+++ b/src/main/java/org/shedlang/compiler/stackir/StackCompiler.java
@@ -69,6 +69,7 @@ public class StackCompiler {
node.params().named().stream()
.map(param -> new DefineFunctionInstruction.Param(param.name(), param.source()))
.toList(),
+ node.freeVariables(),
node.body().stream()
.flatMap(statement -> compileFunctionStatement(statement).stream())
.toList(),
diff --git a/src/main/java/org/shedlang/compiler/stackir/instructions/DefineFunctionInstruction.java b/src/main/java/org/shedlang/compiler/stackir/instructions/DefineFunctionInstruction.java
index fef0583f..379f1f68 100644
--- a/src/main/java/org/shedlang/compiler/stackir/instructions/DefineFunctionInstruction.java
+++ b/src/main/java/org/shedlang/compiler/stackir/instructions/DefineFunctionInstruction.java
@@ -3,11 +3,13 @@ package org.shedlang.compiler.stackir.instructions;
import org.shedlang.compiler.sources.Source;
import java.util.List;
+import java.util.Set;
public record DefineFunctionInstruction(
String name,
List<Param> positionalParams,
List<Param> namedParams,
+ Set<String> freeVariables,
List<Instruction> body,
Source source
) implements Instruction {