diff options
| author | Michael Williamson <mike@zwobble.org> | 2023-06-10 19:43:04 +0100 |
|---|---|---|
| committer | Michael Williamson <mike@zwobble.org> | 2023-06-10 19:43:04 +0100 |
| commit | 4564de5f2b387ce71c906d980eb9d9ef2f5c4390 (patch) | |
| tree | 4d31a16a025b8f4cc776d32ff33648ba22290696 /src/main/java | |
| parent | 4089116972049123f447d72d1bd5cb5d7389c25e (diff) | |
Add free variables to define function instruction
Diffstat (limited to 'src/main/java')
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 { |
