From 52bc86e76ad85a9af69f50bbc8ed9a41af7c4eeb Mon Sep 17 00:00:00 2001 From: Michael Williamson Date: Sat, 2 Dec 2023 20:27:14 +0000 Subject: Add variant to define-function instruction --- .../compiler/shid/InstructionSerializer.java | 4 ++++ .../org/shedlang/compiler/shid/ShidCodeGen.java | 5 ++++ .../shid/instructions/ShidDefineFunction.java | 28 ++++++++++++++++------ 3 files changed, 30 insertions(+), 7 deletions(-) (limited to 'src/main/java') diff --git a/src/main/java/org/shedlang/compiler/shid/InstructionSerializer.java b/src/main/java/org/shedlang/compiler/shid/InstructionSerializer.java index afbccf6c..760a1095 100644 --- a/src/main/java/org/shedlang/compiler/shid/InstructionSerializer.java +++ b/src/main/java/org/shedlang/compiler/shid/InstructionSerializer.java @@ -60,6 +60,10 @@ public class InstructionSerializer { case ShidDefineFunction defineFunctionInstruction -> treeListIndented( treeIdentifier("define-function"), + treeNamed("variant", switch (defineFunctionInstruction.variant()) { + case EFFECT_HANDLER_METHOD -> treeString("effect-handler-method"); + case FUNCTION -> treeString("function"); + }), treeNamed("name", treeString(defineFunctionInstruction.name())), treeNamed("positional-params", treeList( defineFunctionInstruction.positionalParams().stream() diff --git a/src/main/java/org/shedlang/compiler/shid/ShidCodeGen.java b/src/main/java/org/shedlang/compiler/shid/ShidCodeGen.java index 3d52861e..8c930b29 100644 --- a/src/main/java/org/shedlang/compiler/shid/ShidCodeGen.java +++ b/src/main/java/org/shedlang/compiler/shid/ShidCodeGen.java @@ -214,6 +214,7 @@ public class ShidCodeGen { String name, TypedParamsNode params, TypedFunctionBodyNode body, + ShidDefineFunction.Variant variant, Source source, Context context ) { @@ -260,6 +261,7 @@ public class ShidCodeGen { namedParams, freeVariables, bodyInstructions, + variant, source ); @@ -288,6 +290,7 @@ public class ShidCodeGen { node.name(), node.signature().params(), node.body(), + ShidDefineFunction.Variant.FUNCTION, node.source(), context ); @@ -307,6 +310,7 @@ public class ShidCodeGen { "anonymous", node.signature().params(), node.body(), + ShidDefineFunction.Variant.FUNCTION, node.source(), context ); @@ -649,6 +653,7 @@ public class ShidCodeGen { node.name(), node.params(), node.body(), + ShidDefineFunction.Variant.EFFECT_HANDLER_METHOD, node.source(), context ); diff --git a/src/main/java/org/shedlang/compiler/shid/instructions/ShidDefineFunction.java b/src/main/java/org/shedlang/compiler/shid/instructions/ShidDefineFunction.java index 16561049..f0a45844 100644 --- a/src/main/java/org/shedlang/compiler/shid/instructions/ShidDefineFunction.java +++ b/src/main/java/org/shedlang/compiler/shid/instructions/ShidDefineFunction.java @@ -18,19 +18,26 @@ public record ShidDefineFunction( List namedParams, FreeVariables freeVariables, List body, + Variant variant, Source source ) implements ShidInstruction { public record Param(String name, Source source) { } + public enum Variant { + EFFECT_HANDLER_METHOD, + FUNCTION, + } + public static Builder builder() { return new Builder( "f", P.vector(), P.vector(), FreeVariables.builder(), - P.vector() + P.vector(), + Variant.FUNCTION ); } @@ -39,7 +46,8 @@ public record ShidDefineFunction( PVector positionalParams, PVector namedParams, FreeVariables.Builder freeVariables, - PVector body + PVector body, + ShidDefineFunction.Variant variant ) { public ShidDefineFunction build() { return new ShidDefineFunction( @@ -48,6 +56,7 @@ public record ShidDefineFunction( namedParams, freeVariables.build(), body, + variant, Sources.NULL ); } @@ -58,7 +67,8 @@ public record ShidDefineFunction( this.positionalParams, this.namedParams, this.freeVariables, - this.body + this.body, + this.variant ); } @@ -68,7 +78,8 @@ public record ShidDefineFunction( this.positionalParams.plus(new Param(name, Sources.NULL)), this.namedParams, this.freeVariables, - this.body + this.body, + this.variant ); } @@ -78,7 +89,8 @@ public record ShidDefineFunction( this.positionalParams, this.namedParams.plus(new Param(name, Sources.NULL)), this.freeVariables, - this.body + this.body, + this.variant ); } @@ -88,7 +100,8 @@ public record ShidDefineFunction( this.positionalParams, this.namedParams, this.freeVariables.plus(name, Sources.NULL), - this.body + this.body, + this.variant ); } @@ -98,7 +111,8 @@ public record ShidDefineFunction( this.positionalParams, this.namedParams, this.freeVariables, - this.body.plus(instruction) + this.body.plus(instruction), + this.variant ); } } -- cgit v1.2.3