diff options
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.java | 24 | ||||
| -rw-r--r-- | evaluator/src/main/java/lv/enes/orang/evaluator/PartialFunction.java | 2 | ||||
| -rw-r--r-- | evaluator/src/main/java/lv/enes/orang/evaluator/Tuple.java | 25 | ||||
| -rw-r--r-- | evaluator/src/main/java/lv/enes/orang/evaluator/Value.java | 3 |
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; | |||
| 3 | import lombok.EqualsAndHashCode; | 3 | import lombok.EqualsAndHashCode; |
| 4 | 4 | ||
| 5 | @EqualsAndHashCode | 5 | @EqualsAndHashCode |
| 6 | public final class Nothing implements Value { | 6 | public 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 | ||
| 3 | import lv.enes.orang.ast.*; | 3 | import lv.enes.orang.ast.*; |
| 4 | import lv.enes.orang.core.OrangRuntimeException; | 4 | import lv.enes.orang.core.OrangRuntimeException; |
| 5 | import lv.enes.orang.utils.NonEmptyList; | ||
| 5 | 6 | ||
| 6 | import java.util.ArrayList; | 7 | import java.util.ArrayList; |
| 7 | import java.util.Collections; | 8 | import 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 @@ | |||
| 1 | package lv.enes.orang.evaluator; | ||
| 2 | |||
| 3 | import lv.enes.orang.utils.NonEmptyList; | ||
| 4 | |||
| 5 | public 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; | |||
| 3 | import lv.enes.orang.core.OrangRuntimeException; | 3 | import lv.enes.orang.core.OrangRuntimeException; |
| 4 | 4 | ||
| 5 | public sealed interface Value | 5 | public 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 | ||