From 33cec419ce442aaaf8559abdd5920cd61699104e Mon Sep 17 00:00:00 2001 From: Michael Williamson Date: Sat, 10 Jun 2023 15:59:25 +0100 Subject: Compile function definition into stack instructions --- .../shedlang/compiler/stackir/StackCompiler.java | 27 ++++++++++++++++++++++ 1 file changed, 27 insertions(+) (limited to 'src/main/java/org/shedlang/compiler/stackir') diff --git a/src/main/java/org/shedlang/compiler/stackir/StackCompiler.java b/src/main/java/org/shedlang/compiler/stackir/StackCompiler.java index 4623bc5d..406da12c 100644 --- a/src/main/java/org/shedlang/compiler/stackir/StackCompiler.java +++ b/src/main/java/org/shedlang/compiler/stackir/StackCompiler.java @@ -59,6 +59,26 @@ public class StackCompiler { private static PVector compileExpressionStatement(TypedExpressionStatementNode node) { return compileExpression(node.expression()).plus(new DiscardInstruction(node.source())); } + + private static PVector compileFunctionDefinition(TypedFunctionDefinitionNode node) { + var defineFunctionInstruction = new DefineFunctionInstruction( + node.name(), + node.params().positional().stream() + .map(param -> new DefineFunctionInstruction.Param(param.name(), param.source())) + .toList(), + node.params().named().stream() + .map(param -> new DefineFunctionInstruction.Param(param.name(), param.source())) + .toList(), + node.body().stream() + .flatMap(statement -> compileFunctionStatement(statement).stream()) + .toList(), + node.source() + ); + + var storeInstruction = new LocalStoreInstruction(node.name(), node.source()); + + return P.vector(defineFunctionInstruction, storeInstruction); + } public static PVector compileFunctionStatement(TypedFunctionStatementNode node) { return switch (node) { @@ -71,6 +91,13 @@ public class StackCompiler { return P.vector(new PushIntInstruction(node.value(), node.source())); } + public static PVector compileNamespaceStatement(TypedNamespaceStatementNode node) { + return switch (node) { + case TypedFunctionDefinitionNode functionDefinition -> + compileFunctionDefinition(functionDefinition); + }; + } + private static PVector compileReference(TypedReferenceNode node) { return P.vector(new LocalLoadInstruction(node.name(), node.source())); } -- cgit v1.2.3