From 63b3e45d88251ec7647bafcc428f59c1c3d8d2ad Mon Sep 17 00:00:00 2001 From: Michael Williamson Date: Sun, 12 Jan 2025 22:02:25 +0000 Subject: Add Shid declare-native-function instruction --- .../org/shedlang/compiler/shid/ShidSerializer.java | 36 ++++++++--- .../instructions/ShidDeclareNativeFunction.java | 71 ++++++++++++++++++++++ .../shid/instructions/ShidInstruction.java | 2 +- .../shedlang/compiler/shidtopatio/ShidToPatio.java | 3 + 4 files changed, 101 insertions(+), 11 deletions(-) create mode 100644 src/main/java/org/shedlang/compiler/shid/instructions/ShidDeclareNativeFunction.java (limited to 'src/main/java') 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 positionalParams) { + return treeNamed("positional-params", treeList( + positionalParams.stream() + .map(param -> treeString(param.name())) + .toList() + )); + } + + private static Tree namedParamsToTree(List 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 positionalParams, + List 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 positionalParams, + PVector 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); -- cgit v1.2.3