aboutsummaryrefslogtreecommitdiff
path: root/src/main/java
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/java')
-rw-r--r--src/main/java/org/zwobble/couscous/backends/python/PrimitiveMethods.java60
-rw-r--r--src/main/java/org/zwobble/couscous/interpreter/values/BooleanInterpreterValue.java22
2 files changed, 53 insertions, 29 deletions
diff --git a/src/main/java/org/zwobble/couscous/backends/python/PrimitiveMethods.java b/src/main/java/org/zwobble/couscous/backends/python/PrimitiveMethods.java
index 5e3795c..db3cd2e 100644
--- a/src/main/java/org/zwobble/couscous/backends/python/PrimitiveMethods.java
+++ b/src/main/java/org/zwobble/couscous/backends/python/PrimitiveMethods.java
@@ -1,22 +1,18 @@
package org.zwobble.couscous.backends.python;
-import java.util.List;
-import java.util.Map;
-import java.util.Optional;
-
-import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableMap;
+import com.google.common.collect.ImmutableMap.Builder;
import org.zwobble.couscous.ast.Operator;
import org.zwobble.couscous.ast.TypeName;
import org.zwobble.couscous.backends.python.ast.PythonBinaryOperation;
-import org.zwobble.couscous.backends.python.ast.PythonCallNode;
import org.zwobble.couscous.backends.python.ast.PythonExpressionNode;
import org.zwobble.couscous.backends.python.ast.PythonNotNode;
import org.zwobble.couscous.values.*;
-import com.google.common.collect.ImmutableMap;
-import com.google.common.collect.ImmutableMap.Builder;
+import java.util.List;
+import java.util.Map;
+import java.util.Optional;
-import static java.util.Arrays.asList;
import static org.zwobble.couscous.backends.python.ast.PythonAttributeAccessNode.pythonAttributeAccess;
import static org.zwobble.couscous.backends.python.ast.PythonBinaryOperation.pythonIs;
import static org.zwobble.couscous.backends.python.ast.PythonCallNode.pythonCall;
@@ -47,13 +43,19 @@ public class PrimitiveMethods {
.build();
- private static final Map<String, PrimitiveMethodGenerator> BOOLEAN_METHODS =
- ImmutableMap.<String, PrimitiveMethodGenerator>builder()
-
- .put("negate", (receiver, arguments) ->
- PythonNotNode.pythonNot(receiver))
-
- .build();
+ private static final Map<String, PrimitiveMethodGenerator> BOOLEAN_METHODS;
+
+ static {
+ ImmutableMap.Builder<String, PrimitiveMethodGenerator> methods = ImmutableMap.builder();
+
+ methods.put("negate", (receiver, arguments) ->
+ PythonNotNode.pythonNot(receiver));
+
+ addOperation(methods, Operator.BOOLEAN_AND, "and");
+ addOperation(methods, Operator.BOOLEAN_OR, "or");
+
+ BOOLEAN_METHODS = methods.build();
+ }
private static final Map<String, PrimitiveMethodGenerator> INT_METHODS;
@@ -63,9 +65,9 @@ public class PrimitiveMethods {
methods.put("toString", (receiver, arguments) ->
pythonCall(pythonVariableReference("str"), list(receiver)));
- addOperation(methods, Operator.ADD.getMethodName(), "+");
- addOperation(methods, Operator.SUBTRACT.getMethodName(), "-");
- addOperation(methods, Operator.MULTIPLY.getMethodName(), "*");
+ addOperation(methods, Operator.ADD, "+");
+ addOperation(methods, Operator.SUBTRACT, "-");
+ addOperation(methods, Operator.MULTIPLY, "*");
methods.put(Operator.DIVIDE.getMethodName(), (receiver, arguments) ->
pythonCall(
@@ -76,12 +78,12 @@ public class PrimitiveMethods {
internalReference("_mod_round_to_zero"),
list(receiver, arguments.get(0))));
- addOperation(methods, Operator.EQUALS.getMethodName(), "==");
- addOperation(methods, Operator.NOT_EQUALS.getMethodName(), "!=");
- addOperation(methods, Operator.GREATER_THAN.getMethodName(), ">");
- addOperation(methods, Operator.GREATER_THAN_OR_EQUAL.getMethodName(), ">=");
- addOperation(methods, Operator.LESS_THAN.getMethodName(), "<");
- addOperation(methods, Operator.LESS_THAN_OR_EQUAL.getMethodName(), "<=");
+ addOperation(methods, Operator.EQUALS, "==");
+ addOperation(methods, Operator.NOT_EQUALS, "!=");
+ addOperation(methods, Operator.GREATER_THAN, ">");
+ addOperation(methods, Operator.GREATER_THAN_OR_EQUAL, ">=");
+ addOperation(methods, Operator.LESS_THAN, "<");
+ addOperation(methods, Operator.LESS_THAN_OR_EQUAL, "<=");
INT_METHODS = methods.build();
}
@@ -89,6 +91,14 @@ public class PrimitiveMethods {
private static PythonExpressionNode internalReference(String name) {
return pythonAttributeAccess(pythonVariableReference("_couscous"), name);
}
+
+ private static void addOperation(
+ Builder<String, PrimitiveMethodGenerator> methods,
+ Operator operator,
+ String operatorSymbol)
+ {
+ addOperation(methods, operator.getMethodName(), operatorSymbol);
+ }
private static void addOperation(
Builder<String, PrimitiveMethodGenerator> methods,
diff --git a/src/main/java/org/zwobble/couscous/interpreter/values/BooleanInterpreterValue.java b/src/main/java/org/zwobble/couscous/interpreter/values/BooleanInterpreterValue.java
index c94b21d..032caff 100644
--- a/src/main/java/org/zwobble/couscous/interpreter/values/BooleanInterpreterValue.java
+++ b/src/main/java/org/zwobble/couscous/interpreter/values/BooleanInterpreterValue.java
@@ -1,11 +1,15 @@
package org.zwobble.couscous.interpreter.values;
-import java.util.Collections;
-import java.util.Optional;
+import org.zwobble.couscous.ast.Operator;
import org.zwobble.couscous.interpreter.NoSuchField;
+import org.zwobble.couscous.values.BooleanValue;
import org.zwobble.couscous.values.PrimitiveValue;
import org.zwobble.couscous.values.PrimitiveValues;
+import java.util.Optional;
+
+import static org.zwobble.couscous.util.ExtraLists.list;
+
public final class BooleanInterpreterValue implements InterpreterValue {
public static final BooleanInterpreterValue TRUE = new BooleanInterpreterValue(true);
public static final BooleanInterpreterValue FALSE = new BooleanInterpreterValue(false);
@@ -16,9 +20,19 @@ public final class BooleanInterpreterValue implements InterpreterValue {
private static final ConcreteType TYPE = ConcreteType.builder(BooleanInterpreterValue.class, "boolean")
- .method("negate", Collections.emptyList(), (environment, arguments) ->
+ .method("negate", list(), (environment, arguments) ->
of(!arguments.getReceiver().getValue()))
-
+
+ .method(Operator.BOOLEAN_AND.getMethodName(), list(BooleanValue.REF), (environment, arguments) -> {
+ BooleanInterpreterValue right = (BooleanInterpreterValue)arguments.get(0);
+ return of(arguments.getReceiver().getValue() && right.getValue());
+ })
+
+ .method(Operator.BOOLEAN_OR.getMethodName(), list(BooleanValue.REF), (environment, arguments) -> {
+ BooleanInterpreterValue right = (BooleanInterpreterValue)arguments.get(0);
+ return of(arguments.getReceiver().getValue() || right.getValue());
+ })
+
.build();
private final boolean value;