| summaryrefslogtreecommitdiff | 
diff options
| author | Nathanael Sensfelder <SpamShield0@MultiAgentSystems.org> | 2020-07-05 20:44:01 +0200 | 
|---|---|---|
| committer | Nathanael Sensfelder <SpamShield0@MultiAgentSystems.org> | 2020-07-05 20:44:01 +0200 | 
| commit | 7b053964589d4eebb7fc4d600c8762501ec36f21 (patch) | |
| tree | 5d5598b69523ad60c1c8414bdf03896b540abe4e | |
| parent | a433b570a340d5c0bf70e6452f68f60d2b241032 (diff) | |
Realized enums are only for corner cases...
| -rw-r--r-- | src/core/src/tonkadur/fate/v1/lang/Operator.java | 116 | 
1 files changed, 88 insertions, 28 deletions
| diff --git a/src/core/src/tonkadur/fate/v1/lang/Operator.java b/src/core/src/tonkadur/fate/v1/lang/Operator.java index 84681d7..1541fb9 100644 --- a/src/core/src/tonkadur/fate/v1/lang/Operator.java +++ b/src/core/src/tonkadur/fate/v1/lang/Operator.java @@ -3,35 +3,95 @@ package tonkadur.fate.v1.lang;  import java.util.Collections;  import java.util.Set; -public enum Operator +/* + * Yes, it *could* have been an enum. In fact, it used to be one. Except that + * unless you want to ensure coverage of all cases in a switch, Java enums are + * clearly inferior to classes in everyway. Having this be a class will, at + * the very least, let you extend it to add new operators in extensions. + */ +public class Operator  { -   PLUS("+", 2, 0, Type.NUMBER_TYPES, null), -   MINUS("-", 2, 0, Type.NUMBER_TYPES, null), -   TIMES("*", 2, 0, Type.NUMBER_TYPES, null), -   DIVIDE("/", 2, 2, Type.NUMBER_TYPES, null), -   POWER("^", 2, 2, Type.NUMBER_TYPES, null), -   RANDOM("rand", 2, 2, Collections.singleton(Type.INT), null), - -   AND("and", 2, 0, Collections.singleton(Type.BOOLEAN), null), -   OR("or", 2, 0, Collections.singleton(Type.BOOLEAN), null), -   NOT("not", 1, 1, Collections.singleton(Type.BOOLEAN), null), -   IMPLIES("implies", 2, 2, Collections.singleton(Type.BOOLEAN), null), -   ONE_IN("one_in", 1, 0, Collections.singleton(Type.BOOLEAN), null), - -   EQUALS("equals", 2, 0, Type.COLLECTION_COMPATIBLE_TYPES, Type.BOOLEAN), - -   LOWER_THAN("<", 2, 2, Type.NUMBER_TYPES, Type.BOOLEAN), -   LOWER_EQUAL_THAN("=<", 2, 2, Type.NUMBER_TYPES, Type.BOOLEAN), -   GREATER_EQUAL_THAN(">=", 2, 2, Type.NUMBER_TYPES, Type.BOOLEAN), -   GREATER_THAN(">", 2, 2, Type.NUMBER_TYPES, Type.BOOLEAN); - -   final private String name; -   final private int min_arity; -   final private int max_arity; -   final private Set<Type> valid_input_types; -   final private Type output_type_transform; - -   private Operator +   public static final Operator PLUS; +   public static final Operator MINUS; +   public static final Operator TIMES; +   public static final Operator DIVIDE; +   public static final Operator POWER; +   public static final Operator RANDOM; + +   public static final Operator AND; +   public static final Operator OR; +   public static final Operator NOT; +   public static final Operator IMPLIES; +   public static final Operator ONE_IN; + +   public static final Operator EQUALS; + +   public static final Operator LOWER_THAN; +   public static final Operator LOWER_EQUAL_THAN; +   public static final Operator GREATER_EQUAL_THAN; +   public static final Operator GREATER_THAN; + + +   static +   { +      PLUS = new Operator("+", 2, 0, Type.NUMBER_TYPES, null); +      MINUS = new Operator("-", 2, 0, Type.NUMBER_TYPES, null); +      TIMES = new Operator("*", 2, 0, Type.NUMBER_TYPES, null); +      DIVIDE = new Operator("/", 2, 2, Type.NUMBER_TYPES, null); +      POWER = new Operator("^", 2, 2, Type.NUMBER_TYPES, null); +      RANDOM = +         new Operator("rand", 2, 2, Collections.singleton(Type.INT), null); + +      AND = +         new Operator("and", 2, 0, Collections.singleton(Type.BOOLEAN), null); +      OR = +         new Operator("or", 2, 0, Collections.singleton(Type.BOOLEAN), null); +      NOT = +         new Operator("not", 1, 1, Collections.singleton(Type.BOOLEAN), null); +      IMPLIES = +         new Operator +         ( +            "implies", +            2, +            2, +            Collections.singleton(Type.BOOLEAN), +            null +         ); +      ONE_IN = +         new Operator +         ( +            "one_in", +            1, +            0, +            Collections.singleton(Type.BOOLEAN), +            null +         ); + +      EQUALS = +         new Operator +         ( +            "equals", +            2, +            0, +            Type.COLLECTION_COMPATIBLE_TYPES, +            Type.BOOLEAN +         ); + +      LOWER_THAN = new Operator("<", 2, 2, Type.NUMBER_TYPES, Type.BOOLEAN); +      LOWER_EQUAL_THAN = +         new Operator("=<", 2, 2, Type.NUMBER_TYPES, Type.BOOLEAN); +      GREATER_EQUAL_THAN = +         new Operator(">=", 2, 2, Type.NUMBER_TYPES, Type.BOOLEAN); +      GREATER_THAN = new Operator(">", 2, 2, Type.NUMBER_TYPES, Type.BOOLEAN); +   } + +   final protected String name; +   final protected int min_arity; +   final protected int max_arity; +   final protected Set<Type> valid_input_types; +   final protected Type output_type_transform; + +   protected Operator     (        final String name,        final int min_arity, | 


