summaryrefslogtreecommitdiff
path: root/evaluator/src
diff options
context:
space:
mode:
Diffstat (limited to 'evaluator/src')
-rw-r--r--evaluator/src/main/java/lv/enes/orang/evaluator/EmptyTuple.java (renamed from evaluator/src/main/java/lv/enes/orang/evaluator/Nothing.java)6
-rw-r--r--evaluator/src/main/java/lv/enes/orang/evaluator/Evaluator.java24
-rw-r--r--evaluator/src/main/java/lv/enes/orang/evaluator/PartialFunction.java2
-rw-r--r--evaluator/src/main/java/lv/enes/orang/evaluator/Tuple.java25
-rw-r--r--evaluator/src/main/java/lv/enes/orang/evaluator/Value.java3
5 files changed, 48 insertions, 12 deletions
diff --git a/evaluator/src/main/java/lv/enes/orang/evaluator/Nothing.java b/evaluator/src/main/java/lv/enes/orang/evaluator/EmptyTuple.java
index c971649..f8e043b 100644
--- a/evaluator/src/main/java/lv/enes/orang/evaluator/Nothing.java
+++ b/evaluator/src/main/java/lv/enes/orang/evaluator/EmptyTuple.java
@@ -3,10 +3,10 @@ package lv.enes.orang.evaluator;
3import lombok.EqualsAndHashCode; 3import lombok.EqualsAndHashCode;
4 4
5@EqualsAndHashCode 5@EqualsAndHashCode
6public final class Nothing implements Value { 6public final class EmptyTuple implements Value {
7 public static final Nothing INSTANCE = new Nothing(); 7 public static final EmptyTuple INSTANCE = new EmptyTuple();
8 8
9 private Nothing() { 9 private EmptyTuple() {
10 } 10 }
11 11
12 @Override 12 @Override
diff --git a/evaluator/src/main/java/lv/enes/orang/evaluator/Evaluator.java b/evaluator/src/main/java/lv/enes/orang/evaluator/Evaluator.java
index 6925bac..f0299b4 100644
--- a/evaluator/src/main/java/lv/enes/orang/evaluator/Evaluator.java
+++ b/evaluator/src/main/java/lv/enes/orang/evaluator/Evaluator.java
@@ -2,6 +2,7 @@ package lv.enes.orang.evaluator;
2 2
3import lv.enes.orang.ast.*; 3import lv.enes.orang.ast.*;
4import lv.enes.orang.core.OrangRuntimeException; 4import lv.enes.orang.core.OrangRuntimeException;
5import lv.enes.orang.utils.NonEmptyList;
5 6
6import java.util.ArrayList; 7import java.util.ArrayList;
7import java.util.Collections; 8import java.util.Collections;
@@ -71,6 +72,11 @@ public record Evaluator(Map<String, Value> scope, Value lastResult) implements E
71 } 72 }
72 73
73 @Override 74 @Override
75 public Value visitEmptyTupleExpression() {
76 return EmptyTuple.INSTANCE;
77 }
78
79 @Override
74 public Evaluator visitExpression(ExpressionStatement expr) throws OrangRuntimeException { 80 public Evaluator visitExpression(ExpressionStatement expr) throws OrangRuntimeException {
75 return new Evaluator(this.scope(), visit(expr.expr())); 81 return new Evaluator(this.scope(), visit(expr.expr()));
76 } 82 }
@@ -122,6 +128,11 @@ public record Evaluator(Map<String, Value> scope, Value lastResult) implements E
122 } 128 }
123 129
124 @Override 130 @Override
131 public Value visitStringLiteral(StringLiteral expr) {
132 return new OrangString(expr.value());
133 }
134
135 @Override
125 public Value visitUnaryExpression(UnaryExpression expr) throws OrangRuntimeException { 136 public Value visitUnaryExpression(UnaryExpression expr) throws OrangRuntimeException {
126 var child = visit(expr.child()); 137 var child = visit(expr.child());
127 return switch (expr.operator()) { 138 return switch (expr.operator()) {
@@ -132,8 +143,12 @@ public record Evaluator(Map<String, Value> scope, Value lastResult) implements E
132 } 143 }
133 144
134 @Override 145 @Override
135 public Value visitStringLiteral(StringLiteral expr) { 146 public Value visitTupleExpression(TupleExpression expr) throws OrangRuntimeException {
136 return new OrangString(expr.value()); 147 var values = new ArrayList<Value>();
148 for (var tailExpr : expr.children()) {
149 values.add(visit(tailExpr));
150 }
151 return new Tuple(new NonEmptyList<>(values));
137 } 152 }
138 153
139 @Override 154 @Override
@@ -144,9 +159,4 @@ public record Evaluator(Map<String, Value> scope, Value lastResult) implements E
144 159
145 throw new OrangRuntimeException(STR."Value named \{expr.name()} is not defined!"); 160 throw new OrangRuntimeException(STR."Value named \{expr.name()} is not defined!");
146 } 161 }
147
148 @Override
149 public Value visitVoidExpression() {
150 return Nothing.INSTANCE;
151 }
152} 162}
diff --git a/evaluator/src/main/java/lv/enes/orang/evaluator/PartialFunction.java b/evaluator/src/main/java/lv/enes/orang/evaluator/PartialFunction.java
index d0125f6..7c0ca20 100644
--- a/evaluator/src/main/java/lv/enes/orang/evaluator/PartialFunction.java
+++ b/evaluator/src/main/java/lv/enes/orang/evaluator/PartialFunction.java
@@ -15,7 +15,7 @@ public record PartialFunction(Map<String, Value> scope, NonEmptyList<ArgSpec> re
15 switch (spec.getType()) { 15 switch (spec.getType()) {
16 case NAMED -> newScope.put(((ArgSpec.Named)spec).name(), param); 16 case NAMED -> newScope.put(((ArgSpec.Named)spec).name(), param);
17 case NOTHING -> { 17 case NOTHING -> {
18 if (!(param instanceof Nothing)) { 18 if (!(param instanceof EmptyTuple)) {
19 throw new OrangRuntimeException(STR."Expected () as a parameter but got \{param.typeName()}"); 19 throw new OrangRuntimeException(STR."Expected () as a parameter but got \{param.typeName()}");
20 } 20 }
21 } 21 }
diff --git a/evaluator/src/main/java/lv/enes/orang/evaluator/Tuple.java b/evaluator/src/main/java/lv/enes/orang/evaluator/Tuple.java
new file mode 100644
index 0000000..d5a1df5
--- /dev/null
+++ b/evaluator/src/main/java/lv/enes/orang/evaluator/Tuple.java
@@ -0,0 +1,25 @@
1package lv.enes.orang.evaluator;
2
3import lv.enes.orang.utils.NonEmptyList;
4
5public record Tuple(NonEmptyList<Value> contents) implements Value {
6 @Override
7 public String typeName() {
8 var sb = new StringBuilder("(");
9 sb.append(contents.getFirst().typeName());
10 for (var i = 1; i < contents.size(); i++) {
11 sb.append(", ").append(contents.get(i).typeName());
12 }
13 return sb.append(")").toString();
14 }
15
16 @Override
17 public String stringify() {
18 var sb = new StringBuilder("(");
19 sb.append(contents.getFirst().stringify());
20 for (var i = 1; i < contents.size(); i++) {
21 sb.append(", ").append(contents.get(i).stringify());
22 }
23 return sb.append(")").toString();
24 }
25}
diff --git a/evaluator/src/main/java/lv/enes/orang/evaluator/Value.java b/evaluator/src/main/java/lv/enes/orang/evaluator/Value.java
index d8c8b9c..2ef5136 100644
--- a/evaluator/src/main/java/lv/enes/orang/evaluator/Value.java
+++ b/evaluator/src/main/java/lv/enes/orang/evaluator/Value.java
@@ -3,7 +3,8 @@ package lv.enes.orang.evaluator;
3import lv.enes.orang.core.OrangRuntimeException; 3import lv.enes.orang.core.OrangRuntimeException;
4 4
5public sealed interface Value 5public sealed interface Value
6 permits Array, BuiltinFunction, Function, Nothing, OrangBoolean, OrangInteger, OrangString, PartialBuiltinFunction, PartialFunction, Undefined { 6 permits Array, BuiltinFunction, EmptyTuple, Function, OrangBoolean, OrangInteger, OrangString,
7 PartialBuiltinFunction, PartialFunction, Tuple, Undefined {
7 String typeName(); 8 String typeName();
8 String stringify(); 9 String stringify();
9 10