aboutsummaryrefslogtreecommitdiff
path: root/src/main/java
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2023-12-02 20:27:14 +0000
committerMichael Williamson <mike@zwobble.org>2023-12-02 20:27:14 +0000
commit52bc86e76ad85a9af69f50bbc8ed9a41af7c4eeb (patch)
tree7bdc32af133e8070fd0b45f245aa52e080cc655b /src/main/java
parenta2871ec4e2afd4a8bff033f8488b1c207d4c7a70 (diff)
Add variant to define-function instruction
Diffstat (limited to 'src/main/java')
-rw-r--r--src/main/java/org/shedlang/compiler/shid/InstructionSerializer.java4
-rw-r--r--src/main/java/org/shedlang/compiler/shid/ShidCodeGen.java5
-rw-r--r--src/main/java/org/shedlang/compiler/shid/instructions/ShidDefineFunction.java28
3 files changed, 30 insertions, 7 deletions
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<Param> namedParams,
FreeVariables freeVariables,
List<ShidInstruction> 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<Param> positionalParams,
PVector<Param> namedParams,
FreeVariables.Builder freeVariables,
- PVector<ShidInstruction> body
+ PVector<ShidInstruction> 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
);
}
}