From ea9515d7e948c21aea648a245371e3cb04dbdaea Mon Sep 17 00:00:00 2001 From: Michael Williamson Date: Sun, 10 Jan 2016 15:34:04 +0000 Subject: Add support for boolean and/or --- .../couscous/backends/python/PrimitiveMethods.java | 60 +++++++++++++--------- .../values/BooleanInterpreterValue.java | 22 ++++++-- 2 files changed, 53 insertions(+), 29 deletions(-) (limited to 'src/main/java/org') 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 BOOLEAN_METHODS = - ImmutableMap.builder() - - .put("negate", (receiver, arguments) -> - PythonNotNode.pythonNot(receiver)) - - .build(); + private static final Map BOOLEAN_METHODS; + + static { + ImmutableMap.Builder 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 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 methods, + Operator operator, + String operatorSymbol) + { + addOperation(methods, operator.getMethodName(), operatorSymbol); + } private static void addOperation( Builder 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; -- cgit v1.2.3