aboutsummaryrefslogtreecommitdiff
path: root/src/main/java
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2025-01-12 22:02:25 +0000
committerMichael Williamson <mike@zwobble.org>2025-01-12 22:02:25 +0000
commit63b3e45d88251ec7647bafcc428f59c1c3d8d2ad (patch)
treeb3b8147ea0588bb8b10bb2bdcf1e9ba17cc431a5 /src/main/java
parenta3aadd9903e64a7a459227e28feeee03d05560b3 (diff)
Add Shid declare-native-function instruction
Diffstat (limited to 'src/main/java')
-rw-r--r--src/main/java/org/shedlang/compiler/shid/ShidSerializer.java36
-rw-r--r--src/main/java/org/shedlang/compiler/shid/instructions/ShidDeclareNativeFunction.java71
-rw-r--r--src/main/java/org/shedlang/compiler/shid/instructions/ShidInstruction.java2
-rw-r--r--src/main/java/org/shedlang/compiler/shidtopatio/ShidToPatio.java3
4 files changed, 101 insertions, 11 deletions
diff --git a/src/main/java/org/shedlang/compiler/shid/ShidSerializer.java b/src/main/java/org/shedlang/compiler/shid/ShidSerializer.java
index 83ec1821..76526fd0 100644
--- a/src/main/java/org/shedlang/compiler/shid/ShidSerializer.java
+++ b/src/main/java/org/shedlang/compiler/shid/ShidSerializer.java
@@ -73,6 +73,14 @@ public class ShidSerializer {
)
);
+ case ShidDeclareNativeFunction declareNativeFunction ->
+ treeListIndented(
+ treeIdentifier("declare-native-function"),
+ treeNamed("name", treeString(declareNativeFunction.name())),
+ positionalParamsToTree(declareNativeFunction.positionalParams()),
+ namedParamsToTree(declareNativeFunction.namedParams())
+ );
+
case ShidDefineEffect defineEffectInstruction ->
treeList(
treeIdentifier("define-effect"),
@@ -87,16 +95,8 @@ public class ShidSerializer {
case FUNCTION -> treeString("function");
}),
treeNamed("name", treeString(defineFunctionInstruction.name())),
- treeNamed("positional-params", treeList(
- defineFunctionInstruction.positionalParams().stream()
- .map(param -> treeString(param.name()))
- .toList()
- )),
- treeNamed("named-params", treeList(
- defineFunctionInstruction.namedParams().stream()
- .map(param -> treeString(param.name()))
- .toList()
- )),
+ positionalParamsToTree(defineFunctionInstruction.positionalParams()),
+ namedParamsToTree(defineFunctionInstruction.namedParams()),
treeNamed("free-variables", treeList(
defineFunctionInstruction.freeVariables().stream()
.map(freeVariable -> treeString(freeVariable.name()))
@@ -322,6 +322,22 @@ public class ShidSerializer {
};
}
+ private static Tree positionalParamsToTree(List<ShidParam> positionalParams) {
+ return treeNamed("positional-params", treeList(
+ positionalParams.stream()
+ .map(param -> treeString(param.name()))
+ .toList()
+ ));
+ }
+
+ private static Tree namedParamsToTree(List<ShidParam> namedParams) {
+ return treeNamed("named-params", treeList(
+ namedParams.stream()
+ .map(param -> treeString(param.name()))
+ .toList()
+ ));
+ }
+
private static Tree userDefinedEffectToTree(UserDefinedEffect effect) {
return treeString(effect.describe());
}
diff --git a/src/main/java/org/shedlang/compiler/shid/instructions/ShidDeclareNativeFunction.java b/src/main/java/org/shedlang/compiler/shid/instructions/ShidDeclareNativeFunction.java
new file mode 100644
index 00000000..f74f447b
--- /dev/null
+++ b/src/main/java/org/shedlang/compiler/shid/instructions/ShidDeclareNativeFunction.java
@@ -0,0 +1,71 @@
+package org.shedlang.compiler.shid.instructions;
+
+import org.pcollections.PVector;
+import org.shedlang.compiler.sources.Source;
+import org.shedlang.compiler.sources.Sources;
+import org.shedlang.compiler.util.P;
+
+import java.util.List;
+
+/**
+ * Push a native function value onto the temporary value stack with the given
+ * declaration.
+ */
+public record ShidDeclareNativeFunction(
+ String name,
+ List<ShidParam> positionalParams,
+ List<ShidParam> namedParams,
+ Source source
+) implements ShidInstruction {
+ @Override
+ public boolean isBlockTerminator() {
+ return false;
+ }
+
+ public static Builder builder() {
+ return new Builder(
+ "f",
+ P.vector(),
+ P.vector()
+ );
+ }
+
+ public record Builder(
+ String name,
+ PVector<ShidParam> positionalParams,
+ PVector<ShidParam> namedParams
+ ) {
+ public ShidDeclareNativeFunction build() {
+ return new ShidDeclareNativeFunction(
+ name,
+ positionalParams,
+ namedParams,
+ Sources.NULL
+ );
+ }
+
+ public Builder withName(String name) {
+ return new Builder(
+ name,
+ this.positionalParams,
+ this.namedParams
+ );
+ }
+
+ public Builder addPositionalParam(String name) {
+ return new Builder(
+ this.name,
+ this.positionalParams.plus(new ShidParam(name, Sources.NULL)),
+ this.namedParams
+ );
+ }
+
+ public Builder addNamedParam(String name) {
+ return new Builder(
+ this.name,
+ this.positionalParams,
+ this.namedParams.plus(new ShidParam(name, Sources.NULL))
+ );
+ }
+ }
+}
diff --git a/src/main/java/org/shedlang/compiler/shid/instructions/ShidInstruction.java b/src/main/java/org/shedlang/compiler/shid/instructions/ShidInstruction.java
index b58defdd..963b9b80 100644
--- a/src/main/java/org/shedlang/compiler/shid/instructions/ShidInstruction.java
+++ b/src/main/java/org/shedlang/compiler/shid/instructions/ShidInstruction.java
@@ -3,7 +3,7 @@ package org.shedlang.compiler.shid.instructions;
import org.shedlang.compiler.sources.Source;
public sealed interface ShidInstruction
- permits ShidBlock, ShidCall, ShidDefineEffect, ShidDefineFunction, ShidDefineStruct, ShidDiscard, ShidDuplicate, ShidEffectHandlerBreak, ShidFieldLoad, ShidIf, ShidIntAdd, ShidIntEquals, ShidIntNotEqual, ShidIntSub, ShidLocalDrop, ShidLocalLoad, ShidLocalStore, ShidLoop, ShidLoopBreak, ShidLoopContinue, ShidMethodLoad, ShidMethodStore, ShidNamespaceFieldStore, ShidNamespaceImport, ShidPushBool, ShidPushInt, ShidPushString, ShidPushUnit, ShidResume, ShidReturn, ShidStringAdd, ShidSwitch, ShidTry, ShidTupleCreate, ShidTupleGet, ShidVarLoad, ShidVarStore {
+ permits ShidBlock, ShidCall, ShidDeclareNativeFunction, ShidDefineEffect, ShidDefineFunction, ShidDefineStruct, ShidDiscard, ShidDuplicate, ShidEffectHandlerBreak, ShidFieldLoad, ShidIf, ShidIntAdd, ShidIntEquals, ShidIntNotEqual, ShidIntSub, ShidLocalDrop, ShidLocalLoad, ShidLocalStore, ShidLoop, ShidLoopBreak, ShidLoopContinue, ShidMethodLoad, ShidMethodStore, ShidNamespaceFieldStore, ShidNamespaceImport, ShidPushBool, ShidPushInt, ShidPushString, ShidPushUnit, ShidResume, ShidReturn, ShidStringAdd, ShidSwitch, ShidTry, ShidTupleCreate, ShidTupleGet, ShidVarLoad, ShidVarStore {
/**
* If an instruction is a terminator, execution is guaranteed to leave the
diff --git a/src/main/java/org/shedlang/compiler/shidtopatio/ShidToPatio.java b/src/main/java/org/shedlang/compiler/shidtopatio/ShidToPatio.java
index beb8118a..11fcdee8 100644
--- a/src/main/java/org/shedlang/compiler/shidtopatio/ShidToPatio.java
+++ b/src/main/java/org/shedlang/compiler/shidtopatio/ShidToPatio.java
@@ -595,6 +595,9 @@ public class ShidToPatio {
yield context;
}
+ case ShidDeclareNativeFunction declareNativeFunction ->
+ throw new UnsupportedOperationException("TODO");
+
case ShidPushBool pushBool ->
pushValue(pushBool.value() ? 1 : 0, pushBool.source(), context);