| summaryrefslogtreecommitdiff | 
diff options
| author | Nathanael Sensfelder <SpamShield0@MultiAgentSystems.org> | 2020-09-19 13:59:20 +0200 | 
|---|---|---|
| committer | Nathanael Sensfelder <SpamShield0@MultiAgentSystems.org> | 2020-09-19 13:59:20 +0200 | 
| commit | 63b3c43af5d402530a8c10c1f71aa0e7ca3aa06f (patch) | |
| tree | c0703ae0bc72aac35dc92684588cac200fa5d698 /src | |
| parent | 190cf9e6c79375ab1ae9f36b5d13f1fd07c082e5 (diff) | |
...
Diffstat (limited to 'src')
23 files changed, 1219 insertions, 128 deletions
| diff --git a/src/core/src/tonkadur/fate/v1/lang/computation/FilterComputation.java b/src/core/src/tonkadur/fate/v1/lang/computation/FilterComputation.java index 9fdb63f..821c231 100644 --- a/src/core/src/tonkadur/fate/v1/lang/computation/FilterComputation.java +++ b/src/core/src/tonkadur/fate/v1/lang/computation/FilterComputation.java @@ -1,6 +1,8 @@  package tonkadur.fate.v1.lang.computation;  import java.util.Collections; +import java.util.List; +import java.util.ArrayList;  import tonkadur.parser.Origin;  import tonkadur.parser.ParsingError; @@ -18,6 +20,7 @@ public class FilterComputation extends Computation     /***************************************************************************/     /**** MEMBERS **************************************************************/     /***************************************************************************/ +   protected final List<Computation> extra_params;     protected final Computation lambda_function;     protected final Computation collection; @@ -29,13 +32,15 @@ public class FilterComputation extends Computation     (        final Origin origin,        final Computation lambda_function, -      final Computation collection +      final Computation collection, +      final List<Computation> extra_params     )     {        super(origin, collection.get_type());        this.lambda_function = lambda_function;        this.collection = collection; +      this.extra_params = extra_params;     }     /***************************************************************************/ @@ -46,22 +51,42 @@ public class FilterComputation extends Computation     (        final Origin origin,        final Computation lambda_function, -      final Computation collection +      final Computation collection, +      final List<Computation> extra_params     )     throws ParsingError     { +      final List<Type> target_signature; + +      target_signature = new ArrayList<Type>(); +        RecurrentChecks.assert_is_a_collection(collection); + +      target_signature.add +      ( +         ((CollectionType) collection.get_type()).get_content_type() +      ); + +      for (final Computation c: extra_params) +      { +         target_signature.add(c.get_type()); +      } +        RecurrentChecks.assert_lambda_matches_types        (           lambda_function,           Type.BOOL, -         Collections.singletonList -         ( -            ((CollectionType) collection.get_type()).get_content_type() -         ) +         target_signature        ); -      return new FilterComputation(origin, lambda_function, collection); +      return +         new FilterComputation +         ( +            origin, +            lambda_function, +            collection, +            extra_params +         );     }     /**** Accessors ************************************************************/ @@ -82,6 +107,11 @@ public class FilterComputation extends Computation        return collection;     } +   public List<Computation> get_extra_parameters () +   { +      return extra_params; +   } +     /**** Misc. ****************************************************************/     @Override     public String toString () @@ -92,6 +122,13 @@ public class FilterComputation extends Computation        sb.append(lambda_function.toString());        sb.append(" ");        sb.append(collection.toString()); + +      for (final Computation c: extra_params) +      { +         sb.append(" "); +         sb.append(c.toString()); +      } +        sb.append(")");        return sb.toString(); diff --git a/src/core/src/tonkadur/fate/v1/lang/computation/Fold.java b/src/core/src/tonkadur/fate/v1/lang/computation/Fold.java index 2be97d1..1e9041b 100644 --- a/src/core/src/tonkadur/fate/v1/lang/computation/Fold.java +++ b/src/core/src/tonkadur/fate/v1/lang/computation/Fold.java @@ -20,6 +20,7 @@ public class Fold extends Computation     /***************************************************************************/     /**** MEMBERS **************************************************************/     /***************************************************************************/ +   protected final List<Computation> extra_params;     protected final Computation lambda_function;     protected final Computation initial_value;     protected final Computation collection; @@ -36,6 +37,7 @@ public class Fold extends Computation        final Computation initial_value,        final Computation collection,        final boolean is_foldl, +      final List<Computation> extra_params,        final Type act_as     )     { @@ -45,6 +47,7 @@ public class Fold extends Computation        this.initial_value = initial_value;        this.collection = collection;        this.is_foldl = is_foldl; +      this.extra_params = extra_params;     }     /***************************************************************************/ @@ -57,7 +60,8 @@ public class Fold extends Computation        final Computation lambda_function,        final Computation initial_value,        final Computation collection, -      final boolean is_foldl +      final boolean is_foldl, +      final List<Computation> extra_params     )     throws ParsingError     { @@ -73,6 +77,11 @@ public class Fold extends Computation           ((CollectionType) collection.get_type()).get_content_type()        ); +      for (final Computation c: extra_params) +      { +         types_in.add(c.get_type()); +      } +        RecurrentChecks.assert_lambda_matches_types        (           lambda_function, @@ -88,6 +97,7 @@ public class Fold extends Computation              initial_value,              collection,              is_foldl, +            extra_params,              initial_value.get_type()           );     } @@ -120,6 +130,11 @@ public class Fold extends Computation        return is_foldl;     } +   public List<Computation> get_extra_parameters () +   { +      return extra_params; +   } +     /**** Misc. ****************************************************************/     @Override     public String toString () @@ -141,6 +156,13 @@ public class Fold extends Computation        sb.append(initial_value.toString());        sb.append(" ");        sb.append(collection.toString()); + +      for (final Computation c: extra_params) +      { +         sb.append(" "); +         sb.append(c.toString()); +      } +        sb.append(")");        return sb.toString(); diff --git a/src/core/src/tonkadur/fate/v1/lang/computation/IndexedMapComputation.java b/src/core/src/tonkadur/fate/v1/lang/computation/IndexedMapComputation.java index 7190582..f85616a 100644 --- a/src/core/src/tonkadur/fate/v1/lang/computation/IndexedMapComputation.java +++ b/src/core/src/tonkadur/fate/v1/lang/computation/IndexedMapComputation.java @@ -20,6 +20,7 @@ public class IndexedMapComputation extends Computation     /***************************************************************************/     /**** MEMBERS **************************************************************/     /***************************************************************************/ +   protected final List<Computation> extra_params;     protected final Computation lambda_function;     protected final Computation collection; @@ -32,6 +33,7 @@ public class IndexedMapComputation extends Computation        final Origin origin,        final Computation lambda_function,        final Computation collection, +      final List<Computation> extra_params,        final Type output_type     )     { @@ -39,6 +41,7 @@ public class IndexedMapComputation extends Computation        this.lambda_function = lambda_function;        this.collection = collection; +      this.extra_params = extra_params;     }     /***************************************************************************/ @@ -49,7 +52,8 @@ public class IndexedMapComputation extends Computation     (        final Origin origin,        final Computation lambda_function, -      final Computation collection +      final Computation collection, +      final List<Computation> extra_params     )     throws Throwable     { @@ -65,6 +69,11 @@ public class IndexedMapComputation extends Computation           ((CollectionType) collection.get_type()).get_content_type()        ); +      for (final Computation c: extra_params) +      { +         in_types.add(c.get_type()); +      } +        RecurrentChecks.assert_lambda_matches_types(lambda_function, in_types);        return @@ -73,6 +82,7 @@ public class IndexedMapComputation extends Computation              origin,              lambda_function,              collection, +            extra_params,              CollectionType.build              (                 origin, @@ -101,6 +111,11 @@ public class IndexedMapComputation extends Computation        return collection;     } +   public List<Computation> get_extra_parameters () +   { +      return extra_params; +   } +     /**** Misc. ****************************************************************/     @Override     public String toString () @@ -111,6 +126,13 @@ public class IndexedMapComputation extends Computation        sb.append(lambda_function.toString());        sb.append(" ");        sb.append(collection.toString()); + +      for (final Computation c: extra_params) +      { +         sb.append(" "); +         sb.append(c.toString()); +      } +        sb.append(")");        return sb.toString(); diff --git a/src/core/src/tonkadur/fate/v1/lang/computation/MapComputation.java b/src/core/src/tonkadur/fate/v1/lang/computation/MapComputation.java index 394dd9a..86bd6e4 100644 --- a/src/core/src/tonkadur/fate/v1/lang/computation/MapComputation.java +++ b/src/core/src/tonkadur/fate/v1/lang/computation/MapComputation.java @@ -1,6 +1,8 @@  package tonkadur.fate.v1.lang.computation;  import java.util.Collections; +import java.util.List; +import java.util.ArrayList;  import tonkadur.parser.Origin;  import tonkadur.parser.ParsingError; @@ -19,6 +21,7 @@ public class MapComputation extends Computation     /***************************************************************************/     /**** MEMBERS **************************************************************/     /***************************************************************************/ +   protected final List<Computation> extra_params;     protected final Computation lambda_function;     protected final Computation collection; @@ -31,12 +34,15 @@ public class MapComputation extends Computation        final Origin origin,        final Computation lambda_function,        final Computation collection, +      final List<Computation> extra_params,        final Type output_type     )     {        super(origin, output_type); +        this.lambda_function = lambda_function;        this.collection = collection; +      this.extra_params = extra_params;     }     /***************************************************************************/ @@ -47,18 +53,31 @@ public class MapComputation extends Computation     (        final Origin origin,        final Computation lambda_function, -      final Computation collection +      final Computation collection, +      final List<Computation> extra_params     )     throws ParsingError     { +      final List<Type> target_signature; + +      target_signature = new ArrayList<Type>(); +        RecurrentChecks.assert_is_a_collection(collection); + +      target_signature.add +      ( +         ((CollectionType) collection.get_type()).get_content_type() +      ); + +      for (final Computation c: extra_params) +      { +         target_signature.add(c.get_type()); +      } +        RecurrentChecks.assert_lambda_matches_types        (           lambda_function, -         Collections.singletonList -         ( -            ((CollectionType) collection.get_type()).get_content_type() -         ) +         target_signature        );        return @@ -67,6 +86,7 @@ public class MapComputation extends Computation              origin,              lambda_function,              collection, +            extra_params,              CollectionType.build              (                 origin, @@ -95,6 +115,11 @@ public class MapComputation extends Computation        return collection;     } +   public List<Computation> get_extra_parameters () +   { +      return extra_params; +   } +     /**** Misc. ****************************************************************/     @Override     public String toString () @@ -105,6 +130,13 @@ public class MapComputation extends Computation        sb.append(lambda_function.toString());        sb.append(" ");        sb.append(collection.toString()); + +      for (final Computation c: extra_params) +      { +         sb.append(" "); +         sb.append(c.toString()); +      } +        sb.append(")");        return sb.toString(); diff --git a/src/core/src/tonkadur/fate/v1/lang/computation/MergeComputation.java b/src/core/src/tonkadur/fate/v1/lang/computation/MergeComputation.java index e961729..4df3d3b 100644 --- a/src/core/src/tonkadur/fate/v1/lang/computation/MergeComputation.java +++ b/src/core/src/tonkadur/fate/v1/lang/computation/MergeComputation.java @@ -22,6 +22,7 @@ public class MergeComputation extends Computation     /***************************************************************************/     /**** MEMBERS **************************************************************/     /***************************************************************************/ +   protected final List<Computation> extra_params;     protected final Computation lambda_function;     protected final Computation collection_in_a;     protected final Computation default_a; @@ -42,6 +43,7 @@ public class MergeComputation extends Computation        final Computation collection_in_b,        final Computation default_b,        final boolean to_set, +      final List<Computation> extra_params,        final Type output_type     )     { @@ -53,6 +55,7 @@ public class MergeComputation extends Computation        this.collection_in_b = collection_in_b;        this.default_b = default_b;        this.to_set = to_set; +      this.extra_params = extra_params;     }     /***************************************************************************/ @@ -67,7 +70,8 @@ public class MergeComputation extends Computation        final Computation default_a,        final Computation collection_in_b,        final Computation default_b, -      final boolean to_set +      final boolean to_set, +      final List<Computation> extra_params     )     throws Throwable     { @@ -103,6 +107,11 @@ public class MergeComputation extends Computation           ((CollectionType) collection_in_b.get_type()).get_content_type()        ); +      for (final Computation c: extra_params) +      { +         types_in.add(c.get_type()); +      } +        RecurrentChecks.assert_lambda_matches_types(lambda_function, types_in);        return @@ -115,6 +124,7 @@ public class MergeComputation extends Computation              collection_in_b,              default_b,              to_set, +            extra_params,              CollectionType.build              (                 origin, @@ -158,6 +168,11 @@ public class MergeComputation extends Computation        return default_b;     } +   public List<Computation> get_extra_parameters () +   { +      return extra_params; +   } +     public boolean to_set ()     {        return to_set; @@ -205,6 +220,12 @@ public class MergeComputation extends Computation           sb.append(default_b.toString());        } +      for (final Computation c: extra_params) +      { +         sb.append(" "); +         sb.append(c.toString()); +      } +        sb.append(")");        return sb.toString(); diff --git a/src/core/src/tonkadur/fate/v1/lang/computation/PartitionComputation.java b/src/core/src/tonkadur/fate/v1/lang/computation/PartitionComputation.java index 75bc3d6..b240915 100644 --- a/src/core/src/tonkadur/fate/v1/lang/computation/PartitionComputation.java +++ b/src/core/src/tonkadur/fate/v1/lang/computation/PartitionComputation.java @@ -1,6 +1,8 @@  package tonkadur.fate.v1.lang.computation;  import java.util.Collections; +import java.util.List; +import java.util.ArrayList;  import tonkadur.parser.Origin;  import tonkadur.parser.ParsingError; @@ -19,6 +21,7 @@ public class PartitionComputation extends Computation     /***************************************************************************/     /**** MEMBERS **************************************************************/     /***************************************************************************/ +   protected final List<Computation> extra_params;     protected final Computation lambda_function;     protected final Computation collection; @@ -31,6 +34,7 @@ public class PartitionComputation extends Computation        final Origin origin,        final Computation lambda_function,        final Computation collection, +      final List<Computation> extra_params,        final Type output_type     )     { @@ -38,6 +42,7 @@ public class PartitionComputation extends Computation        this.lambda_function = lambda_function;        this.collection = collection; +      this.extra_params = extra_params;     }     /***************************************************************************/ @@ -48,22 +53,33 @@ public class PartitionComputation extends Computation     (        final Origin origin,        final Computation lambda_function, -      final Computation collection +      final Computation collection, +      final List<Computation> extra_params     )     throws Throwable     {        final Type type; +      final List<Type> target_signature; + +      target_signature = new ArrayList<Type>();        RecurrentChecks.assert_is_a_collection(collection); +      target_signature.add +      ( +         ((CollectionType) collection.get_type()).get_content_type() +      ); + +      for (final Computation c: extra_params) +      { +         target_signature.add(c.get_type()); +      } +        RecurrentChecks.assert_lambda_matches_types        (           lambda_function,           Type.BOOL, -         Collections.singletonList -         ( -            ((CollectionType) collection.get_type()).get_content_type() -         ) +         target_signature        );        type = @@ -81,6 +97,7 @@ public class PartitionComputation extends Computation              origin,              lambda_function,              collection, +            extra_params,              type           );     } @@ -103,6 +120,11 @@ public class PartitionComputation extends Computation        return collection;     } +   public List<Computation> get_extra_parameters () +   { +      return extra_params; +   } +     /**** Misc. ****************************************************************/     @Override     public String toString () @@ -113,6 +135,13 @@ public class PartitionComputation extends Computation        sb.append(lambda_function.toString());        sb.append(" ");        sb.append(collection.toString()); + +      for (final Computation c: extra_params) +      { +         sb.append(" "); +         sb.append(c.toString()); +      } +        sb.append(")");        return sb.toString(); diff --git a/src/core/src/tonkadur/fate/v1/lang/computation/SortComputation.java b/src/core/src/tonkadur/fate/v1/lang/computation/SortComputation.java index 7127920..ebb9279 100644 --- a/src/core/src/tonkadur/fate/v1/lang/computation/SortComputation.java +++ b/src/core/src/tonkadur/fate/v1/lang/computation/SortComputation.java @@ -21,6 +21,7 @@ public class SortComputation extends Computation     /***************************************************************************/     /**** MEMBERS **************************************************************/     /***************************************************************************/ +   protected final List<Computation> extra_params;     protected final Computation lambda_function;     protected final Computation collection; @@ -32,13 +33,15 @@ public class SortComputation extends Computation     (        final Origin origin,        final Computation lambda_function, -      final Computation collection +      final Computation collection, +      final List<Computation> extra_params     )     {        super(origin, collection.get_type());        this.lambda_function = lambda_function;        this.collection = collection; +      this.extra_params = extra_params;     }     /***************************************************************************/ @@ -49,7 +52,8 @@ public class SortComputation extends Computation     (        final Origin origin,        final Computation lambda_function, -      final Computation collection +      final Computation collection, +      final List<Computation> extra_params     )     throws ParsingError     { @@ -62,6 +66,11 @@ public class SortComputation extends Computation        types_in.add(((CollectionType) collection.get_type()).get_content_type());        types_in.add(types_in.get(0)); +      for (final Computation c: extra_params) +      { +         types_in.add(c.get_type()); +      } +        RecurrentChecks.assert_lambda_matches_types        (           lambda_function, @@ -69,7 +78,8 @@ public class SortComputation extends Computation           types_in        ); -      return new SortComputation(origin, lambda_function, collection); +      return +         new SortComputation(origin, lambda_function, collection, extra_params);     }     /**** Accessors ************************************************************/ @@ -90,6 +100,11 @@ public class SortComputation extends Computation        return collection;     } +   public List<Computation> get_extra_parameters () +   { +      return extra_params; +   } +     /**** Misc. ****************************************************************/     @Override     public String toString () @@ -100,6 +115,13 @@ public class SortComputation extends Computation        sb.append(lambda_function.toString());        sb.append(" ");        sb.append(collection.toString()); + +      for (final Computation c: extra_params) +      { +         sb.append(" "); +         sb.append(c.toString()); +      } +        sb.append(")");        return sb.toString(); diff --git a/src/core/src/tonkadur/fate/v1/lang/instruction/Filter.java b/src/core/src/tonkadur/fate/v1/lang/instruction/Filter.java index d81997c..d91f297 100644 --- a/src/core/src/tonkadur/fate/v1/lang/instruction/Filter.java +++ b/src/core/src/tonkadur/fate/v1/lang/instruction/Filter.java @@ -2,6 +2,7 @@ package tonkadur.fate.v1.lang.instruction;  import java.util.Collections;  import java.util.List; +import java.util.ArrayList;  import tonkadur.parser.Origin;  import tonkadur.parser.ParsingError; @@ -21,6 +22,7 @@ public class Filter extends Instruction     /***************************************************************************/     /**** MEMBERS **************************************************************/     /***************************************************************************/ +   protected final List<Computation> extra_params;     protected final Computation lambda_function;     protected final Reference collection; @@ -32,13 +34,15 @@ public class Filter extends Instruction     (        final Origin origin,        final Computation lambda_function, -      final Reference collection +      final Reference collection, +      final List<Computation> extra_params     )     {        super(origin);        this.lambda_function = lambda_function;        this.collection = collection; +      this.extra_params = extra_params;     }     /***************************************************************************/ @@ -49,23 +53,34 @@ public class Filter extends Instruction     (        final Origin origin,        final Computation lambda_function, -      final Reference collection +      final Reference collection, +      final List<Computation> extra_params     )     throws ParsingError     { +      final List<Type> target_signature; + +      target_signature = new ArrayList<Type>();        RecurrentChecks.assert_is_a_collection(collection); + +      target_signature.add +      ( +         ((CollectionType) collection.get_type()).get_content_type() +      ); + +      for (final Computation c: extra_params) +      { +         target_signature.add(c.get_type()); +      }        RecurrentChecks.assert_lambda_matches_types        (           lambda_function,           Type.BOOL, -         Collections.singletonList -         ( -            ((CollectionType) collection.get_type()).get_content_type() -         ) +         target_signature        ); -      return new Filter(origin, lambda_function, collection); +      return new Filter(origin, lambda_function, collection, extra_params);     }     /**** Accessors ************************************************************/ @@ -86,6 +101,11 @@ public class Filter extends Instruction        return collection;     } +   public List<Computation> get_extra_parameters () +   { +      return extra_params; +   } +     /**** Misc. ****************************************************************/     @Override     public String toString () @@ -96,6 +116,13 @@ public class Filter extends Instruction        sb.append(lambda_function.toString());        sb.append(" ");        sb.append(collection.toString()); + +      for (final Computation c: extra_params) +      { +         sb.append(" "); +         sb.append(c.toString()); +      } +        sb.append(")");        return sb.toString(); diff --git a/src/core/src/tonkadur/fate/v1/lang/instruction/IfInstruction.java b/src/core/src/tonkadur/fate/v1/lang/instruction/IfInstruction.java index a8751d1..0f29115 100644 --- a/src/core/src/tonkadur/fate/v1/lang/instruction/IfInstruction.java +++ b/src/core/src/tonkadur/fate/v1/lang/instruction/IfInstruction.java @@ -1,5 +1,7 @@  package tonkadur.fate.v1.lang.instruction; +import java.util.List; +  import tonkadur.parser.Origin;  import tonkadur.parser.ParsingError; @@ -16,7 +18,7 @@ public class IfInstruction extends Instruction     /**** MEMBERS **************************************************************/     /***************************************************************************/     protected final Computation condition; -   protected final Instruction if_true; +   protected final List<Instruction> if_true;     /***************************************************************************/     /**** PROTECTED ************************************************************/ @@ -26,7 +28,7 @@ public class IfInstruction extends Instruction     (        final Origin origin,        final Computation condition, -      final Instruction if_true +      final List<Instruction> if_true     )     {        super(origin); @@ -43,7 +45,7 @@ public class IfInstruction extends Instruction     (        final Origin origin,        final Computation condition, -      final Instruction if_true +      final List<Instruction> if_true     )     throws ParsingError     { @@ -65,7 +67,7 @@ public class IfInstruction extends Instruction        return condition;     } -   public Instruction get_if_true () +   public List<Instruction> get_if_true ()     {        return if_true;     } @@ -79,8 +81,12 @@ public class IfInstruction extends Instruction        sb.append("(IfInstruction");        sb.append(System.lineSeparator());        sb.append(condition.toString()); -      sb.append(System.lineSeparator()); -      sb.append(if_true.toString()); + +      for (final Instruction instr: if_true) +      { +         sb.append(System.lineSeparator()); +         sb.append(instr.toString()); +      }        sb.append(")"); diff --git a/src/core/src/tonkadur/fate/v1/lang/instruction/IndexedMap.java b/src/core/src/tonkadur/fate/v1/lang/instruction/IndexedMap.java index 094561b..e603332 100644 --- a/src/core/src/tonkadur/fate/v1/lang/instruction/IndexedMap.java +++ b/src/core/src/tonkadur/fate/v1/lang/instruction/IndexedMap.java @@ -20,6 +20,7 @@ public class IndexedMap extends Instruction     /***************************************************************************/     /**** MEMBERS **************************************************************/     /***************************************************************************/ +   protected final List<Computation> extra_params;     protected final Computation lambda_function;     protected final Reference collection; @@ -31,13 +32,15 @@ public class IndexedMap extends Instruction     (        final Origin origin,        final Computation lambda_function, -      final Reference collection +      final Reference collection, +      final List<Computation> extra_params     )     {        super(origin);        this.lambda_function = lambda_function;        this.collection = collection; +      this.extra_params = extra_params;     }     /***************************************************************************/ @@ -48,7 +51,8 @@ public class IndexedMap extends Instruction     (        final Origin origin,        final Computation lambda_function, -      final Reference collection +      final Reference collection, +      final List<Computation> extra_params     )     throws Throwable     { @@ -64,6 +68,11 @@ public class IndexedMap extends Instruction           ((CollectionType) collection.get_type()).get_content_type()        ); +      for (final Computation c: extra_params) +      { +         in_types.add(c.get_type()); +      } +        RecurrentChecks.assert_lambda_matches_types        (           lambda_function, @@ -71,7 +80,7 @@ public class IndexedMap extends Instruction           in_types        ); -      return new IndexedMap(origin, lambda_function, collection); +      return new IndexedMap(origin, lambda_function, collection, extra_params);     }     /**** Accessors ************************************************************/ @@ -92,6 +101,11 @@ public class IndexedMap extends Instruction        return collection;     } +   public List<Computation> get_extra_parameters () +   { +      return extra_params; +   } +     /**** Misc. ****************************************************************/     @Override     public String toString () @@ -102,6 +116,13 @@ public class IndexedMap extends Instruction        sb.append(lambda_function.toString());        sb.append(" ");        sb.append(collection.toString()); + +      for (final Computation c: extra_params) +      { +         sb.append(" "); +         sb.append(c.toString()); +      } +        sb.append(")");        return sb.toString(); diff --git a/src/core/src/tonkadur/fate/v1/lang/instruction/Map.java b/src/core/src/tonkadur/fate/v1/lang/instruction/Map.java index 0cc941f..1bcb1e4 100644 --- a/src/core/src/tonkadur/fate/v1/lang/instruction/Map.java +++ b/src/core/src/tonkadur/fate/v1/lang/instruction/Map.java @@ -2,6 +2,7 @@ package tonkadur.fate.v1.lang.instruction;  import java.util.Collections;  import java.util.List; +import java.util.ArrayList;  import tonkadur.parser.Origin;  import tonkadur.parser.ParsingError; @@ -20,6 +21,7 @@ public class Map extends Instruction     /***************************************************************************/     /**** MEMBERS **************************************************************/     /***************************************************************************/ +   protected final List<Computation> extra_params;     protected final Computation lambda_function;     protected final Reference collection; @@ -31,13 +33,15 @@ public class Map extends Instruction     (        final Origin origin,        final Computation lambda_function, -      final Reference collection +      final Reference collection, +      final List<Computation> extra_params     )     {        super(origin);        this.lambda_function = lambda_function;        this.collection = collection; +      this.extra_params = extra_params;     }     /***************************************************************************/ @@ -48,22 +52,35 @@ public class Map extends Instruction     (        final Origin origin,        final Computation lambda_function, -      final Reference collection +      final Reference collection, +      final List<Computation> extra_params     )     throws ParsingError     { +      final List<Type> target_signature; + +      target_signature = new ArrayList<Type>(); +        RecurrentChecks.assert_is_a_collection(collection); + +      target_signature.add +      ( +         ((CollectionType) collection.get_type()).get_content_type() +      ); + +      for (final Computation c: extra_params) +      { +         target_signature.add(c.get_type()); +      } +        RecurrentChecks.assert_lambda_matches_types        (           lambda_function,           ((CollectionType) collection.get_type()).get_content_type(), -         Collections.singletonList -         ( -            ((CollectionType) collection.get_type()).get_content_type() -         ) +         target_signature        ); -      return new Map(origin, lambda_function, collection); +      return new Map(origin, lambda_function, collection, extra_params);     }     /**** Accessors ************************************************************/ @@ -84,6 +101,11 @@ public class Map extends Instruction        return collection;     } +   public List<Computation> get_extra_parameters () +   { +      return extra_params; +   } +     /**** Misc. ****************************************************************/     @Override     public String toString () @@ -94,6 +116,13 @@ public class Map extends Instruction        sb.append(lambda_function.toString());        sb.append(" ");        sb.append(collection.toString()); + +      for (final Computation c: extra_params) +      { +         sb.append(" "); +         sb.append(c.toString()); +      } +        sb.append(")");        return sb.toString(); diff --git a/src/core/src/tonkadur/fate/v1/lang/instruction/Merge.java b/src/core/src/tonkadur/fate/v1/lang/instruction/Merge.java index b5821ed..f2396a9 100644 --- a/src/core/src/tonkadur/fate/v1/lang/instruction/Merge.java +++ b/src/core/src/tonkadur/fate/v1/lang/instruction/Merge.java @@ -20,6 +20,7 @@ public class Merge extends Instruction     /***************************************************************************/     /**** MEMBERS **************************************************************/     /***************************************************************************/ +   protected final List<Computation> extra_params;     protected final Computation lambda_function;     protected final Reference collection;     protected final Computation default_a; @@ -37,7 +38,8 @@ public class Merge extends Instruction        final Reference collection,        final Computation default_a,        final Computation collection_in_b, -      final Computation default_b +      final Computation default_b, +      final List<Computation> extra_params     )     {        super(origin); @@ -47,6 +49,7 @@ public class Merge extends Instruction        this.default_a = default_a;        this.collection_in_b = collection_in_b;        this.default_b = default_b; +      this.extra_params = extra_params;     }     /***************************************************************************/ @@ -60,7 +63,8 @@ public class Merge extends Instruction        final Reference collection,        final Computation default_a,        final Computation collection_in_b, -      final Computation default_b +      final Computation default_b, +      final List<Computation> extra_params     )     throws Throwable     { @@ -96,6 +100,11 @@ public class Merge extends Instruction           ((CollectionType) collection_in_b.get_type()).get_content_type()        ); +      for (final Computation c: extra_params) +      { +         types_in.add(c.get_type()); +      } +        RecurrentChecks.assert_lambda_matches_types        (           lambda_function, @@ -111,7 +120,8 @@ public class Merge extends Instruction              collection,              default_a,              collection_in_b, -            default_b +            default_b, +            extra_params           );     } @@ -148,6 +158,11 @@ public class Merge extends Instruction        return collection;     } +   public List<Computation> get_extra_parameters () +   { +      return extra_params; +   } +     /**** Misc. ****************************************************************/     @Override     public String toString () @@ -182,6 +197,12 @@ public class Merge extends Instruction           sb.append(default_b.toString());        } +      for (final Computation c: extra_params) +      { +         sb.append(" "); +         sb.append(c.toString()); +      } +        sb.append(")");        return sb.toString(); diff --git a/src/core/src/tonkadur/fate/v1/lang/instruction/Partition.java b/src/core/src/tonkadur/fate/v1/lang/instruction/Partition.java index c075c9b..33cb152 100644 --- a/src/core/src/tonkadur/fate/v1/lang/instruction/Partition.java +++ b/src/core/src/tonkadur/fate/v1/lang/instruction/Partition.java @@ -1,6 +1,8 @@  package tonkadur.fate.v1.lang.instruction;  import java.util.Collections; +import java.util.List; +import java.util.ArrayList;  import tonkadur.parser.Origin;  import tonkadur.parser.ParsingError; @@ -19,6 +21,7 @@ public class Partition extends Instruction     /***************************************************************************/     /**** MEMBERS **************************************************************/     /***************************************************************************/ +   protected final List<Computation> extra_params;     protected final Computation lambda_function;     protected final Reference collection_in;     protected final Reference collection_out; @@ -32,7 +35,8 @@ public class Partition extends Instruction        final Origin origin,        final Computation lambda_function,        final Reference collection_in, -      final Reference collection_out +      final Reference collection_out, +      final List<Computation> extra_params     )     {        super(origin); @@ -40,6 +44,7 @@ public class Partition extends Instruction        this.lambda_function = lambda_function;        this.collection_in = collection_in;        this.collection_out = collection_out; +      this.extra_params = extra_params;     }     /***************************************************************************/ @@ -51,10 +56,15 @@ public class Partition extends Instruction        final Origin origin,        final Computation lambda_function,        final Reference collection_in, -      final Reference collection_out +      final Reference collection_out, +      final List<Computation> extra_params     )     throws ParsingError     { +      final List<Type> target_signature; + +      target_signature = new ArrayList<Type>(); +        RecurrentChecks.assert_is_a_collection(collection_in);        RecurrentChecks.assert_is_a_collection(collection_out);        RecurrentChecks.assert_can_be_used_as @@ -63,14 +73,21 @@ public class Partition extends Instruction           collection_out.get_type()        ); +      target_signature.add +      ( +         ((CollectionType) collection_in.get_type()).get_content_type() +      ); + +      for (final Computation c: extra_params) +      { +         target_signature.add(c.get_type()); +      } +        RecurrentChecks.assert_lambda_matches_types        (           lambda_function,           Type.BOOL, -         Collections.singletonList -         ( -            ((CollectionType) collection_in.get_type()).get_content_type() -         ) +         target_signature        );        return @@ -79,7 +96,8 @@ public class Partition extends Instruction              origin,              lambda_function,              collection_in, -            collection_out +            collection_out, +            extra_params           );     } @@ -106,6 +124,11 @@ public class Partition extends Instruction        return collection_out;     } +   public List<Computation> get_extra_parameters () +   { +      return extra_params; +   } +     /**** Misc. ****************************************************************/     @Override     public String toString () @@ -118,6 +141,13 @@ public class Partition extends Instruction        sb.append(collection_in.toString());        sb.append(" ");        sb.append(collection_out.toString()); + +      for (final Computation c: extra_params) +      { +         sb.append(" "); +         sb.append(c.toString()); +      } +        sb.append(")");        return sb.toString(); diff --git a/src/core/src/tonkadur/fate/v1/lang/instruction/Sort.java b/src/core/src/tonkadur/fate/v1/lang/instruction/Sort.java index 083b1a1..f19a4fc 100644 --- a/src/core/src/tonkadur/fate/v1/lang/instruction/Sort.java +++ b/src/core/src/tonkadur/fate/v1/lang/instruction/Sort.java @@ -20,6 +20,7 @@ public class Sort extends Instruction     /***************************************************************************/     /**** MEMBERS **************************************************************/     /***************************************************************************/ +   protected final List<Computation> extra_params;     protected final Computation lambda_function;     protected final Reference collection; @@ -31,13 +32,15 @@ public class Sort extends Instruction     (        final Origin origin,        final Computation lambda_function, -      final Reference collection +      final Reference collection, +      final List<Computation> extra_params     )     {        super(origin);        this.lambda_function = lambda_function;        this.collection = collection; +      this.extra_params = extra_params;     }     /***************************************************************************/ @@ -48,7 +51,8 @@ public class Sort extends Instruction     (        final Origin origin,        final Computation lambda_function, -      final Reference collection +      final Reference collection, +      final List<Computation> extra_params     )     throws Throwable     { @@ -61,6 +65,11 @@ public class Sort extends Instruction        types_in.add(((CollectionType) collection.get_type()).get_content_type());        types_in.add(types_in.get(0)); +      for (final Computation c: extra_params) +      { +         types_in.add(c.get_type()); +      } +        RecurrentChecks.assert_lambda_matches_types        (           lambda_function, @@ -68,7 +77,7 @@ public class Sort extends Instruction           types_in        ); -      return new Sort(origin, lambda_function, collection); +      return new Sort(origin, lambda_function, collection, extra_params);     }     /**** Accessors ************************************************************/ @@ -89,6 +98,11 @@ public class Sort extends Instruction        return collection;     } +   public List<Computation> get_extra_parameters () +   { +      return extra_params; +   } +     /**** Misc. ****************************************************************/     @Override     public String toString () @@ -99,6 +113,13 @@ public class Sort extends Instruction        sb.append(lambda_function.toString());        sb.append(" ");        sb.append(collection.toString()); + +      for (final Computation c: extra_params) +      { +         sb.append(" "); +         sb.append(c.toString()); +      } +        sb.append(")");        return sb.toString(); diff --git a/src/core/src/tonkadur/fate/v1/lang/meta/VariableFromWord.java b/src/core/src/tonkadur/fate/v1/lang/meta/VariableFromWord.java new file mode 100644 index 0000000..554ae86 --- /dev/null +++ b/src/core/src/tonkadur/fate/v1/lang/meta/VariableFromWord.java @@ -0,0 +1,66 @@ +package tonkadur.fate.v1.lang.meta; + +import java.util.Map; +import java.util.Deque; +import java.util.Arrays; +import java.util.List; +import java.util.ArrayList; + +import tonkadur.parser.Origin; +import tonkadur.parser.ParsingError; + +import tonkadur.fate.v1.lang.computation.VariableReference; +import tonkadur.fate.v1.lang.computation.FieldReference; + +import tonkadur.fate.v1.lang.Variable; +import tonkadur.fate.v1.lang.World; + +public class VariableFromWord +{ +   /* Utility Class */ +   private VariableFromWord () { } + +   public static Reference generate +   ( +      final World WORLD, +      final Deque<Map<String, Variable>> LOCAL_VARIABLES, +      final Origin origin, +      final String word +   ) +   throws ParsingError +   { +      final String[] subrefs; +      Reference result; +      Variable target_var; + +      subrefs = word.split("\\."); + +      target_var = LOCAL_VARIABLES.peekFirst().get(subrefs[0]); + +      if (target_var == null) +      { +         target_var = WORLD.variables().get(origin, subrefs[0]); +      } + +      result = new VariableReference(origin, target_var); + +      if (subrefs.length > 1) +      { +         final List<String> subrefs_list; + +         subrefs_list = new ArrayList(Arrays.asList(subrefs)); + +         subrefs_list.remove(0); + +         result = +            FieldReference.build +            ( +               origin, +               result, +               subrefs_list +            ); +      } + +      return result; +   } +} diff --git a/src/core/src/tonkadur/fate/v1/parser/FateParser.g4 b/src/core/src/tonkadur/fate/v1/parser/FateParser.g4 index 9f716b6..f4a3d12 100644 --- a/src/core/src/tonkadur/fate/v1/parser/FateParser.g4 +++ b/src/core/src/tonkadur/fate/v1/parser/FateParser.g4 @@ -820,7 +820,24 @@ returns [Instruction result]                 ($IMP_MAP_KW.getCharPositionInLine())              ),              ($non_text_value.result), -            ($value_reference.result) +            ($value_reference.result), +            new ArrayList() +         ); +   } + +   | IMP_MAP_KW non_text_value WS+ value_reference WS+ value_list WS* R_PAREN +   { +      $result = +         tonkadur.fate.v1.lang.instruction.Map.build +         ( +            CONTEXT.get_origin_at +            ( +               ($IMP_MAP_KW.getLine()), +               ($IMP_MAP_KW.getCharPositionInLine()) +            ), +            ($non_text_value.result), +            ($value_reference.result), +            ($value_list.result)           );     } @@ -835,7 +852,28 @@ returns [Instruction result]                 ($IMP_INDEXED_MAP_KW.getCharPositionInLine())              ),              ($non_text_value.result), -            ($value_reference.result) +            ($value_reference.result), +            new ArrayList() +         ); +   } + +   | IMP_INDEXED_MAP_KW +         non_text_value WS+ +         value_reference WS+ +         value_list WS* +      R_PAREN +   { +      $result = +         IndexedMap.build +         ( +            CONTEXT.get_origin_at +            ( +               ($IMP_INDEXED_MAP_KW.getLine()), +               ($IMP_INDEXED_MAP_KW.getCharPositionInLine()) +            ), +            ($non_text_value.result), +            ($value_reference.result), +            ($value_list.result)           );     } @@ -857,7 +895,32 @@ returns [Instruction result]              ($value_reference.result),              null,              ($inv1.result), -            null +            null, +            new ArrayList() +         ); +   } + +   | IMP_MERGE_KW +         fun=non_text_value WS+ +         value_reference WS+ +         inv1=non_text_value WS+ +         value_list WS* +      R_PAREN +   { +      $result = +         Merge.build +         ( +            CONTEXT.get_origin_at +            ( +               ($IMP_MERGE_KW.getLine()), +               ($IMP_MERGE_KW.getCharPositionInLine()) +            ), +            ($fun.result), +            ($value_reference.result), +            null, +            ($inv1.result), +            null, +            ($value_list.result)           );     } @@ -881,7 +944,34 @@ returns [Instruction result]              ($value_reference.result),              ($def0.result),              ($inv1.result), -            ($def1.result) +            ($def1.result), +            new ArrayList() +         ); +   } + +   | IMP_MERGE_KW +      fun=non_text_value WS+ +      def0=value WS+ +      value_reference WS+ +      def1=value WS+ +      inv1=non_text_value WS+ +      value_list WS* +      R_PAREN +   { +      $result = +         Merge.build +         ( +            CONTEXT.get_origin_at +            ( +               ($IMP_MERGE_KW.getLine()), +               ($IMP_MERGE_KW.getCharPositionInLine()) +            ), +            ($fun.result), +            ($value_reference.result), +            ($def0.result), +            ($inv1.result), +            ($def1.result), +            ($value_list.result)           );     } @@ -916,7 +1006,24 @@ returns [Instruction result]                 ($IMP_FILTER_KW.getCharPositionInLine())              ),              ($non_text_value.result), -            ($value_reference.result) +            ($value_reference.result), +            new ArrayList() +         ); +   } + +   | IMP_FILTER_KW non_text_value WS+ value_reference WS+ value_list WS* R_PAREN +   { +      $result = +         Filter.build +         ( +            CONTEXT.get_origin_at +            ( +               ($IMP_FILTER_KW.getLine()), +               ($IMP_FILTER_KW.getCharPositionInLine()) +            ), +            ($non_text_value.result), +            ($value_reference.result), +            ($value_list.result)           );     } @@ -936,7 +1043,30 @@ returns [Instruction result]              ),              ($non_text_value.result),              ($iftrue.result), -            ($iffalse.result) +            ($iffalse.result), +            new ArrayList() +         ); +   } + +   | IMP_PARTITION_KW +      non_text_value WS+ +      iftrue=value_reference WS+ +      iffalse=value_reference WS+ +      value_list WS* +      R_PAREN +   { +      $result = +        Partition.build +         ( +            CONTEXT.get_origin_at +            ( +               ($IMP_PARTITION_KW.getLine()), +               ($IMP_PARTITION_KW.getCharPositionInLine()) +            ), +            ($non_text_value.result), +            ($iftrue.result), +            ($iffalse.result), +            ($value_list.result)           );     } @@ -951,7 +1081,24 @@ returns [Instruction result]                 ($IMP_SORT_KW.getCharPositionInLine())              ),              ($non_text_value.result), -            ($value_reference.result) +            ($value_reference.result), +            new ArrayList() +         ); +   } + +   | IMP_SORT_KW non_text_value WS+ value_reference WS+ value_list WS* R_PAREN +   { +      $result = +        Sort.build +         ( +            CONTEXT.get_origin_at +            ( +               ($IMP_SORT_KW.getLine()), +               ($IMP_SORT_KW.getCharPositionInLine()) +            ), +            ($non_text_value.result), +            ($value_reference.result), +            ($value_list.result)           );     } @@ -1397,7 +1544,7 @@ returns [Instruction result]        {           HIERARCHICAL_VARIABLES.push(new ArrayList());        } -      general_fate_instr +      general_fate_sequence        {           for (final String s: HIERARCHICAL_VARIABLES.pop())           { @@ -1415,7 +1562,7 @@ returns [Instruction result]                 ($IF_KW.getCharPositionInLine())              ),              ($non_text_value.result), -            ($general_fate_instr.result) +            ($general_fate_sequence.result)           );     } @@ -1713,7 +1860,10 @@ returns [Instruction result]           );     } -   | IF_KW non_text_value WS+ player_choice WS* R_PAREN +   | IF_KW +         non_text_value WS+ +         player_choice_list WS* +      R_PAREN     {        $result =           IfInstruction.build @@ -1724,7 +1874,7 @@ returns [Instruction result]                 ($IF_KW.getCharPositionInLine())              ),              ($non_text_value.result), -            ($player_choice.result) +            ($player_choice_list.result)           );     } @@ -3259,7 +3409,31 @@ returns [Computation result]              ($fun.result),              ($init.result),              ($inr.result), -            true +            true, +            new ArrayList() +         ); +   } + +   | FOLDL_KW +         fun=non_text_value WS+ +         init=value WS+ +         inr=value_reference WS+ +         value_list WS* +      R_PAREN +   { +      $result = +         Fold.build +         ( +            CONTEXT.get_origin_at +            ( +               ($FOLDL_KW.getLine()), +               ($FOLDL_KW.getCharPositionInLine()) +            ), +            ($fun.result), +            ($init.result), +            ($inr.result), +            true, +            ($value_list.result)           );     } @@ -3280,7 +3454,31 @@ returns [Computation result]              ($fun.result),              ($init.result),              ($inr.result), -            false +            false, +            new ArrayList() +         ); +   } + +   | FOLDR_KW +         fun=non_text_value WS+ +         init=value WS+ +         inr=value_reference WS+ +         value_list WS* +      R_PAREN +   { +      $result = +         Fold.build +         ( +            CONTEXT.get_origin_at +            ( +               ($FOLDR_KW.getLine()), +               ($FOLDR_KW.getCharPositionInLine()) +            ), +            ($fun.result), +            ($init.result), +            ($inr.result), +            false, +            ($value_list.result)           );     } @@ -3723,7 +3921,24 @@ returns [Computation result]                 ($MAP_KW.getCharPositionInLine())              ),              ($fun.result), -            ($inv.result) +            ($inv.result), +            new ArrayList() +         ); +   } + +   | MAP_KW fun=non_text_value WS+ inv=non_text_value WS+ value_list WS* R_PAREN +   { +      $result = +         tonkadur.fate.v1.lang.computation.MapComputation.build +         ( +            CONTEXT.get_origin_at +            ( +               ($MAP_KW.getLine()), +               ($MAP_KW.getCharPositionInLine()) +            ), +            ($fun.result), +            ($inv.result), +            ($value_list.result)           );     } @@ -3738,7 +3953,28 @@ returns [Computation result]                 ($INDEXED_MAP_KW.getCharPositionInLine())              ),              ($fun.result), -            ($inv.result) +            ($inv.result), +            new ArrayList() +         ); +   } + +   | INDEXED_MAP_KW +         fun=non_text_value WS+ +         inv=non_text_value WS+ +         value_list WS* +      R_PAREN +   { +      $result = +         IndexedMapComputation.build +         ( +            CONTEXT.get_origin_at +            ( +               ($INDEXED_MAP_KW.getLine()), +               ($INDEXED_MAP_KW.getCharPositionInLine()) +            ), +            ($fun.result), +            ($inv.result), +            ($value_list.result)           );     } @@ -3761,7 +3997,33 @@ returns [Computation result]              null,              ($inv1.result),              null, -            false +            false, +            new ArrayList() +         ); +   } + +   | MERGE_TO_LIST_KW +         fun=non_text_value WS+ +         inv0=non_text_value WS+ +         inv1=non_text_value WS+ +         value_list WS* +      R_PAREN +   { +      $result = +         MergeComputation.build +         ( +            CONTEXT.get_origin_at +            ( +               ($MERGE_TO_LIST_KW.getLine()), +               ($MERGE_TO_LIST_KW.getCharPositionInLine()) +            ), +            ($fun.result), +            ($inv0.result), +            null, +            ($inv1.result), +            null, +            false, +            ($value_list.result)           );     } @@ -3786,7 +4048,35 @@ returns [Computation result]              ($def0.result),              ($inv1.result),              ($def1.result), -            false +            false, +            new ArrayList() +         ); +   } + +   | MERGE_TO_LIST_KW +         fun=non_text_value WS+ +         def0=value WS+ +         inv0=non_text_value WS+ +         def1=value WS+ +         inv1=non_text_value WS+ +         value_list WS* +      R_PAREN +   { +      $result = +         MergeComputation.build +         ( +            CONTEXT.get_origin_at +            ( +               ($MERGE_TO_LIST_KW.getLine()), +               ($MERGE_TO_LIST_KW.getCharPositionInLine()) +            ), +            ($fun.result), +            ($inv0.result), +            ($def0.result), +            ($inv1.result), +            ($def1.result), +            false, +            ($value_list.result)           );     } @@ -3809,7 +4099,33 @@ returns [Computation result]              null,              ($inv1.result),              null, -            true +            true, +            new ArrayList() +         ); +   } + +   | MERGE_TO_SET_KW +         fun=non_text_value WS+ +         inv0=non_text_value WS+ +         inv1=non_text_value WS+ +         value_list WS* +      R_PAREN +   { +      $result = +         MergeComputation.build +         ( +            CONTEXT.get_origin_at +            ( +               ($MERGE_TO_SET_KW.getLine()), +               ($MERGE_TO_SET_KW.getCharPositionInLine()) +            ), +            ($fun.result), +            ($inv0.result), +            null, +            ($inv1.result), +            null, +            true, +            ($value_list.result)           );     } @@ -3834,7 +4150,35 @@ returns [Computation result]              ($def0.result),              ($inv1.result),              ($def1.result), -            true +            true, +            new ArrayList() +         ); +   } + +   | MERGE_TO_SET_KW +         fun=non_text_value WS+ +         def0=value WS+ +         inv0=non_text_value WS+ +         def1=value WS+ +         inv1=non_text_value WS+ +         value_list WS* +      R_PAREN +   { +      $result = +         MergeComputation.build +         ( +            CONTEXT.get_origin_at +            ( +               ($MERGE_TO_SET_KW.getLine()), +               ($MERGE_TO_SET_KW.getCharPositionInLine()) +            ), +            ($fun.result), +            ($inv0.result), +            ($def0.result), +            ($inv1.result), +            ($def1.result), +            true, +            ($value_list.result)           );     } @@ -3869,7 +4213,28 @@ returns [Computation result]                 ($FILTER_KW.getCharPositionInLine())              ),              ($fun.result), -            ($coll.result) +            ($coll.result), +            new ArrayList() +         ); +   } + +   | FILTER_KW +         fun=non_text_value WS+ +         coll=non_text_value WS+ +         value_list WS* +      R_PAREN +   { +      $result = +         FilterComputation.build +         ( +            CONTEXT.get_origin_at +            ( +               ($FILTER_KW.getLine()), +               ($FILTER_KW.getCharPositionInLine()) +            ), +            ($fun.result), +            ($coll.result), +            ($value_list.result)           );     } @@ -3884,7 +4249,28 @@ returns [Computation result]                 ($PARTITION_KW.getCharPositionInLine())              ),              ($fun.result), -            ($coll.result) +            ($coll.result), +            new ArrayList() +         ); +   } + +   | PARTITION_KW +         fun=non_text_value WS+ +         coll=non_text_value WS+ +         value_list WS* +      R_PAREN +   { +      $result = +        PartitionComputation.build +         ( +            CONTEXT.get_origin_at +            ( +               ($PARTITION_KW.getLine()), +               ($PARTITION_KW.getCharPositionInLine()) +            ), +            ($fun.result), +            ($coll.result), +            ($value_list.result)           );     } @@ -3899,7 +4285,28 @@ returns [Computation result]                 ($SORT_KW.getCharPositionInLine())              ),              ($fun.result), -            ($coll.result) +            ($coll.result), +            new ArrayList() +         ); +   } + +   | SORT_KW +         fun=non_text_value WS+ +         coll=non_text_value WS+ +         value_list WS* +      R_PAREN +   { +      $result = +        SortComputation.build +         ( +            CONTEXT.get_origin_at +            ( +               ($SORT_KW.getLine()), +               ($SORT_KW.getCharPositionInLine()) +            ), +            ($fun.result), +            ($coll.result), +            ($value_list.result)           );     } diff --git a/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/ComputationCompiler.java b/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/ComputationCompiler.java index 161acba..487554e 100644 --- a/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/ComputationCompiler.java +++ b/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/ComputationCompiler.java @@ -2219,6 +2219,7 @@ implements tonkadur.fate.v1.lang.meta.ComputationVisitor     )     throws Throwable     { +      final List<Computation> params;        final ComputationCompiler lambda_cc, in_collection_cc, default_cc;        final Register result; @@ -2227,6 +2228,28 @@ implements tonkadur.fate.v1.lang.meta.ComputationVisitor        result_as_address = result.get_address();        result_as_computation = result.get_value(); +      params = new ArrayList<Computation>(); + +      for +      ( +         final tonkadur.fate.v1.lang.meta.Computation p: +            n.get_extra_parameters() +      ) +      { +         final ComputationCompiler param_cc; + +         param_cc = new ComputationCompiler(compiler); + +         p.get_visited_by(param_cc); + +         /* Let's not re-compute the parameters on every iteration. */ +         param_cc.generate_address(); + +         assimilate(param_cc); + +         params.add(param_cc.get_computation()); +      } +        default_cc = new ComputationCompiler(compiler);        n.get_initial_value().get_visited_by(default_cc); @@ -2264,7 +2287,8 @@ implements tonkadur.fate.v1.lang.meta.ComputationVisitor              lambda_cc.get_computation(),              result_as_address,              in_collection_cc.get_address(), -            n.is_foldl() +            n.is_foldl(), +            params           )        );     } @@ -2276,6 +2300,7 @@ implements tonkadur.fate.v1.lang.meta.ComputationVisitor     )     throws Throwable     { +      final List<Computation> params;        final ComputationCompiler lambda_cc, in_collection_cc;        final Register result; @@ -2284,6 +2309,28 @@ implements tonkadur.fate.v1.lang.meta.ComputationVisitor        result_as_address = result.get_address();        result_as_computation = result.get_value(); +      params = new ArrayList<Computation>(); + +      for +      ( +         final tonkadur.fate.v1.lang.meta.Computation p: +            n.get_extra_parameters() +      ) +      { +         final ComputationCompiler param_cc; + +         param_cc = new ComputationCompiler(compiler); + +         p.get_visited_by(param_cc); + +         /* Let's not re-compute the parameters on every iteration. */ +         param_cc.generate_address(); + +         assimilate(param_cc); + +         params.add(param_cc.get_computation()); +      } +        lambda_cc = new ComputationCompiler(compiler);        n.get_lambda_function().get_visited_by(lambda_cc); @@ -2308,7 +2355,8 @@ implements tonkadur.fate.v1.lang.meta.ComputationVisitor              (                 (tonkadur.fate.v1.lang.type.CollectionType)                 n.get_collection().get_type() -            ).is_set() +            ).is_set(), +            params           )        );     } @@ -2673,6 +2721,7 @@ implements tonkadur.fate.v1.lang.meta.ComputationVisitor     )     throws Throwable     { +      final List<Computation> params;        final ComputationCompiler lambda_cc;        final ComputationCompiler in_collection_a_cc, in_collection_b_cc;        final Register result; @@ -2682,6 +2731,28 @@ implements tonkadur.fate.v1.lang.meta.ComputationVisitor        result_as_address = result.get_address();        result_as_computation = result.get_value(); +      params = new ArrayList<Computation>(); + +      for +      ( +         final tonkadur.fate.v1.lang.meta.Computation p: +            n.get_extra_parameters() +      ) +      { +         final ComputationCompiler param_cc; + +         param_cc = new ComputationCompiler(compiler); + +         p.get_visited_by(param_cc); + +         /* Let's not re-compute the parameters on every iteration. */ +         param_cc.generate_address(); + +         assimilate(param_cc); + +         params.add(param_cc.get_computation()); +      } +        lambda_cc = new ComputationCompiler(compiler);        n.get_lambda_function().get_visited_by(lambda_cc); @@ -2710,7 +2781,8 @@ implements tonkadur.fate.v1.lang.meta.ComputationVisitor              in_collection_a_cc.get_address(),              in_collection_b_cc.get_address(),              result_as_address, -            n.to_set() +            n.to_set(), +            params           )        );     } @@ -2752,6 +2824,7 @@ implements tonkadur.fate.v1.lang.meta.ComputationVisitor     )     throws Throwable     { +      final List<Computation> params;        final ComputationCompiler lambda_cc, in_collection_cc;        final Register result; @@ -2760,6 +2833,28 @@ implements tonkadur.fate.v1.lang.meta.ComputationVisitor        result_as_address = result.get_address();        result_as_computation = result.get_value(); +      params = new ArrayList<Computation>(); + +      for +      ( +         final tonkadur.fate.v1.lang.meta.Computation p: +            n.get_extra_parameters() +      ) +      { +         final ComputationCompiler param_cc; + +         param_cc = new ComputationCompiler(compiler); + +         p.get_visited_by(param_cc); + +         /* Let's not re-compute the parameters on every iteration. */ +         param_cc.generate_address(); + +         assimilate(param_cc); + +         params.add(param_cc.get_computation()); +      } +        lambda_cc = new ComputationCompiler(compiler);        n.get_lambda_function().get_visited_by(lambda_cc); @@ -2784,7 +2879,8 @@ implements tonkadur.fate.v1.lang.meta.ComputationVisitor              compiler.registers(),              compiler.assembler(),              lambda_cc.get_computation(), -            result_as_address +            result_as_address, +            params           )        );     } @@ -2796,6 +2892,7 @@ implements tonkadur.fate.v1.lang.meta.ComputationVisitor     )     throws Throwable     { +      final List<Computation> params;        final ComputationCompiler lambda_cc, in_collection_cc;        final Register result; @@ -2804,6 +2901,28 @@ implements tonkadur.fate.v1.lang.meta.ComputationVisitor        result_as_address = result.get_address();        result_as_computation = result.get_value(); +      params = new ArrayList<Computation>(); + +      for +      ( +         final tonkadur.fate.v1.lang.meta.Computation p: +            n.get_extra_parameters() +      ) +      { +         final ComputationCompiler param_cc; + +         param_cc = new ComputationCompiler(compiler); + +         p.get_visited_by(param_cc); + +         /* Let's not re-compute the parameters on every iteration. */ +         param_cc.generate_address(); + +         assimilate(param_cc); + +         params.add(param_cc.get_computation()); +      } +        lambda_cc = new ComputationCompiler(compiler);        n.get_lambda_function().get_visited_by(lambda_cc); @@ -2828,7 +2947,8 @@ implements tonkadur.fate.v1.lang.meta.ComputationVisitor              (                 (tonkadur.fate.v1.lang.type.CollectionType)                 n.get_collection().get_type() -            ).is_set() +            ).is_set(), +            params           )        );     } diff --git a/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/InstructionCompiler.java b/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/InstructionCompiler.java index aeee56e..a0a5810 100644 --- a/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/InstructionCompiler.java +++ b/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/InstructionCompiler.java @@ -532,10 +532,40 @@ implements tonkadur.fate.v1.lang.meta.InstructionVisitor     )     throws Throwable     { +      final List<Computation> params; +      final List<ComputationCompiler> param_cc_list;        /* This is one dangerous operation to do in-place, so we don't. */        final Register holder;        final ComputationCompiler lambda_cc, collection_cc; +      params = new ArrayList<Computation>(); +      param_cc_list = new ArrayList<ComputationCompiler>(); + +      for +      ( +         final tonkadur.fate.v1.lang.meta.Computation p: +            n.get_extra_parameters() +      ) +      { +         final ComputationCompiler param_cc; + +         param_cc = new ComputationCompiler(compiler); + +         p.get_visited_by(param_cc); + +         /* Let's not re-compute the parameters on every iteration. */ +         param_cc.generate_address(); + +         if (param_cc.has_init()) +         { +            result.add(param_cc.get_init()); +         } + +         param_cc_list.add(param_cc); + +         params.add(param_cc.get_computation()); +      } +        lambda_cc = new ComputationCompiler(compiler);        n.get_lambda_function().get_visited_by(lambda_cc); @@ -578,13 +608,19 @@ implements tonkadur.fate.v1.lang.meta.InstructionVisitor              (                 (tonkadur.fate.v1.lang.type.CollectionType)                 n.get_collection().get_type() -            ).is_set() +            ).is_set(), +            params           )        );        lambda_cc.release_registers(result);        collection_cc.release_registers(result);        compiler.registers().release(holder, result); + +      for (final ComputationCompiler cc: param_cc_list) +      { +         cc.release_registers(result); +      }     }     @Override @@ -607,8 +643,13 @@ implements tonkadur.fate.v1.lang.meta.InstructionVisitor        /* This is one dangerous operation to do in-place, so we don't. */        final Register holder;        final ComputationCompiler lambda_cc; +      final List<Computation> params; +      final List<ComputationCompiler> param_cc_list;        final ComputationCompiler collection_cc, in_collection_b_cc; +      params = new ArrayList<Computation>(); +      param_cc_list = new ArrayList<ComputationCompiler>(); +        lambda_cc = new ComputationCompiler(compiler);        n.get_lambda_function().get_visited_by(lambda_cc); @@ -648,6 +689,31 @@ implements tonkadur.fate.v1.lang.meta.InstructionVisitor           result.add(in_collection_b_cc.get_init());        } +      for +      ( +         final tonkadur.fate.v1.lang.meta.Computation p: +            n.get_extra_parameters() +      ) +      { +         final ComputationCompiler param_cc; + +         param_cc = new ComputationCompiler(compiler); + +         p.get_visited_by(param_cc); + +         /* Let's not re-compute the parameters on every iteration. */ +         param_cc.generate_address(); + +         if (param_cc.has_init()) +         { +            result.add(param_cc.get_init()); +         } + +         param_cc_list.add(param_cc); + +         params.add(param_cc.get_computation()); +      } +        result.add        (           MergeLambda.generate @@ -661,13 +727,19 @@ implements tonkadur.fate.v1.lang.meta.InstructionVisitor              (                 (tonkadur.fate.v1.lang.type.CollectionType)                 n.get_collection().get_type() -            ).is_set() +            ).is_set(), +            params           )        );        collection_cc.release_registers(result);        in_collection_b_cc.release_registers(result);        compiler.registers().release(holder, result); + +      for (final ComputationCompiler cc: param_cc_list) +      { +         cc.release_registers(result); +      }     }     @Override @@ -717,8 +789,38 @@ implements tonkadur.fate.v1.lang.meta.InstructionVisitor     )     throws Throwable     { +      final List<Computation> params; +      final List<ComputationCompiler> param_cc_list;        final ComputationCompiler lambda_cc, collection_cc; +      params = new ArrayList<Computation>(); +      param_cc_list = new ArrayList<ComputationCompiler>(); + +      for +      ( +         final tonkadur.fate.v1.lang.meta.Computation p: +            n.get_extra_parameters() +      ) +      { +         final ComputationCompiler param_cc; + +         param_cc = new ComputationCompiler(compiler); + +         p.get_visited_by(param_cc); + +         /* Let's not re-compute the parameters on every iteration. */ +         param_cc.generate_address(); + +         if (param_cc.has_init()) +         { +            result.add(param_cc.get_init()); +         } + +         param_cc_list.add(param_cc); + +         params.add(param_cc.get_computation()); +      } +        lambda_cc = new ComputationCompiler(compiler);        n.get_lambda_function().get_visited_by(lambda_cc); @@ -744,12 +846,18 @@ implements tonkadur.fate.v1.lang.meta.InstructionVisitor              compiler.registers(),              compiler.assembler(),              lambda_cc.get_computation(), -            collection_cc.get_address() +            collection_cc.get_address(), +            params           )        );        lambda_cc.release_registers(result);        collection_cc.release_registers(result); + +      for (final ComputationCompiler cc: param_cc_list) +      { +         cc.release_registers(result); +      }     }     @Override @@ -759,10 +867,40 @@ implements tonkadur.fate.v1.lang.meta.InstructionVisitor     )     throws Throwable     { +      final List<Computation> params; +      final List<ComputationCompiler> param_cc_list;        /* This is one dangerous operation to do in-place, so we don't. */        final Register holder;        final ComputationCompiler lambda_cc, collection_cc; +      params = new ArrayList<Computation>(); +      param_cc_list = new ArrayList<ComputationCompiler>(); + +      for +      ( +         final tonkadur.fate.v1.lang.meta.Computation p: +            n.get_extra_parameters() +      ) +      { +         final ComputationCompiler param_cc; + +         param_cc = new ComputationCompiler(compiler); + +         p.get_visited_by(param_cc); + +         /* Let's not re-compute the parameters on every iteration. */ +         param_cc.generate_address(); + +         if (param_cc.has_init()) +         { +            result.add(param_cc.get_init()); +         } + +         param_cc_list.add(param_cc); + +         params.add(param_cc.get_computation()); +      } +        lambda_cc = new ComputationCompiler(compiler);        n.get_lambda_function().get_visited_by(lambda_cc); @@ -805,13 +943,19 @@ implements tonkadur.fate.v1.lang.meta.InstructionVisitor              (                 (tonkadur.fate.v1.lang.type.CollectionType)                 n.get_collection().get_type() -            ).is_set() +            ).is_set(), +            params           )        );        lambda_cc.release_registers(result);        collection_cc.release_registers(result);        compiler.registers().release(holder, result); + +      for (final ComputationCompiler cc: param_cc_list) +      { +         cc.release_registers(result); +      }     }     @Override @@ -1600,19 +1744,30 @@ implements tonkadur.fate.v1.lang.meta.InstructionVisitor         *         * Wyrd (ifelse c0 i0 (nop))         */ +      final List<Instruction> instructions;        final ComputationCompiler cc; -      final InstructionCompiler if_true_ic; +      instructions = new ArrayList<Instruction>();        cc = new ComputationCompiler(compiler); -      if_true_ic = new InstructionCompiler(compiler);        n.get_condition().get_visited_by(cc);        compiler.registers().push_hierarchical_instruction_level(); -      n.get_if_true().get_visited_by(if_true_ic); + +      for (final tonkadur.fate.v1.lang.meta.Instruction instr: n.get_if_true()) +      { +         final InstructionCompiler if_true_ic; + +         if_true_ic = new InstructionCompiler(compiler); + +         instr.get_visited_by(if_true_ic); + +         instructions.add(if_true_ic.get_result()); +      } +        compiler.registers().pop_hierarchical_instruction_level        ( -         if_true_ic.result +         instructions        );        if (cc.has_init()) @@ -1627,7 +1782,7 @@ implements tonkadur.fate.v1.lang.meta.InstructionVisitor              compiler.registers(),              compiler.assembler(),              cc.get_computation(), -            if_true_ic.get_result() +            compiler.assembler().merge(instructions)           )        ); diff --git a/src/core/src/tonkadur/wyrd/v1/compiler/util/FilterLambda.java b/src/core/src/tonkadur/wyrd/v1/compiler/util/FilterLambda.java index 8757fe7..83c947f 100644 --- a/src/core/src/tonkadur/wyrd/v1/compiler/util/FilterLambda.java +++ b/src/core/src/tonkadur/wyrd/v1/compiler/util/FilterLambda.java @@ -35,14 +35,13 @@ public class FilterLambda        final RegisterManager registers,        final InstructionManager assembler,        final Computation lambda, -      final Address collection +      final Address collection, +      final List<Computation> extra_params     )     { -      final List<Computation> params;        final List<Instruction> result, while_body, remove_instructions;        final Register iterator, index_storage, collection_size, storage; -      params = new ArrayList<Computation>();        result = new ArrayList<Instruction>();        while_body = new ArrayList<Instruction>();        remove_instructions = new ArrayList<Instruction>(); @@ -58,8 +57,9 @@ public class FilterLambda           new SetValue(collection_size.get_address(), new Size(collection))        ); -      params.add +      extra_params.add        ( +         0,           new ValueOf           (              new RelativeAddress @@ -108,7 +108,7 @@ public class FilterLambda               * be a set.               */              storage.get_address(), -            params +            extra_params           )        ); diff --git a/src/core/src/tonkadur/wyrd/v1/compiler/util/Fold.java b/src/core/src/tonkadur/wyrd/v1/compiler/util/Fold.java index 1596dff..7e6a225 100644 --- a/src/core/src/tonkadur/wyrd/v1/compiler/util/Fold.java +++ b/src/core/src/tonkadur/wyrd/v1/compiler/util/Fold.java @@ -37,15 +37,14 @@ public class Fold        final Computation lambda,        final Address storage_address,        final Address collection_in, -      final boolean is_foldl +      final boolean is_foldl, +      final List<Computation> extra_params     )     { -      final List<Computation> params;        final List<Instruction> result, while_body;        final Register iterator, collection_in_size;        final Computation start_point, end_point, condition, increment; -      params = new ArrayList<Computation>();        result = new ArrayList<Instruction>();        while_body = new ArrayList<Instruction>(); @@ -64,7 +63,8 @@ public class Fold           end_point = Constant.ZERO;           start_point =              Operation.minus(collection_in_size.get_value(), Constant.ONE); -         condition = Operation.greater_equal_than(iterator.get_value(), end_point); +         condition = +            Operation.greater_equal_than(iterator.get_value(), end_point);           increment = Operation.minus(iterator.get_value(), Constant.ONE);        } @@ -80,9 +80,9 @@ public class Fold        result.add(new SetValue(iterator.get_address(), start_point)); -      params.add(new ValueOf(storage_address)); -      params.add +      extra_params.add        ( +         0,           new ValueOf           (              new RelativeAddress @@ -95,6 +95,7 @@ public class Fold              )           )        ); +      extra_params.add(0, new ValueOf(storage_address));        while_body.add        ( @@ -107,7 +108,7 @@ public class Fold               * be a set.               */              storage_address, -            params +            extra_params           )        ); diff --git a/src/core/src/tonkadur/wyrd/v1/compiler/util/IndexedMapLambda.java b/src/core/src/tonkadur/wyrd/v1/compiler/util/IndexedMapLambda.java index 1ff80d1..869b049 100644 --- a/src/core/src/tonkadur/wyrd/v1/compiler/util/IndexedMapLambda.java +++ b/src/core/src/tonkadur/wyrd/v1/compiler/util/IndexedMapLambda.java @@ -37,14 +37,13 @@ public class IndexedMapLambda        final Computation lambda,        final Address collection_in,        final Address collection_out, -      final boolean to_set +      final boolean to_set, +      final List<Computation> extra_params     )     { -      final List<Computation> params;        final List<Instruction> result, while_body;        final Register iterator, collection_in_size, storage; -      params = new ArrayList<Computation>();        result = new ArrayList<Instruction>();        while_body = new ArrayList<Instruction>(); @@ -67,10 +66,10 @@ public class IndexedMapLambda           )        ); -      params.add(iterator.get_value()); -      params.add +      extra_params.add        ( +         0,           new ValueOf           (              new RelativeAddress @@ -82,6 +81,8 @@ public class IndexedMapLambda           )        ); +      extra_params.add(0, iterator.get_value()); +        while_body.add        (           LambdaEvaluation.generate @@ -93,7 +94,7 @@ public class IndexedMapLambda               * be a set.               */              storage.get_address(), -            params +            extra_params           )        ); diff --git a/src/core/src/tonkadur/wyrd/v1/compiler/util/MapLambda.java b/src/core/src/tonkadur/wyrd/v1/compiler/util/MapLambda.java index 580bcb1..0b02130 100644 --- a/src/core/src/tonkadur/wyrd/v1/compiler/util/MapLambda.java +++ b/src/core/src/tonkadur/wyrd/v1/compiler/util/MapLambda.java @@ -37,14 +37,13 @@ public class MapLambda        final Computation lambda,        final Address collection_in,        final Address collection_out, -      final boolean to_set +      final boolean to_set, +      final List<Computation> extra_params     )     { -      final List<Computation> params;        final List<Instruction> result, while_body;        final Register iterator, collection_in_size, storage; -      params = new ArrayList<Computation>();        result = new ArrayList<Instruction>();        while_body = new ArrayList<Instruction>(); @@ -67,8 +66,9 @@ public class MapLambda           )        ); -      params.add +      extra_params.add        ( +         0,           new ValueOf           (              new RelativeAddress @@ -93,7 +93,7 @@ public class MapLambda               * be a set.               */              storage.get_address(), -            params +            extra_params           )        ); diff --git a/src/core/src/tonkadur/wyrd/v1/compiler/util/MergeLambda.java b/src/core/src/tonkadur/wyrd/v1/compiler/util/MergeLambda.java index f17cf02..d09f05f 100644 --- a/src/core/src/tonkadur/wyrd/v1/compiler/util/MergeLambda.java +++ b/src/core/src/tonkadur/wyrd/v1/compiler/util/MergeLambda.java @@ -39,15 +39,14 @@ public class MergeLambda        final Address collection_in_a,        final Address collection_in_b,        final Address collection_out, -      final boolean to_set +      final boolean to_set, +      final List<Computation> extra_params     )     { -      final List<Computation> params;        final List<Instruction> result, while_body;        final Register iterator, collection_in_size, storage;        final Register collection_in_b_size; -      params = new ArrayList<Computation>();        result = new ArrayList<Instruction>();        while_body = new ArrayList<Instruction>(); @@ -99,28 +98,30 @@ public class MergeLambda           )        ); -      params.add +      extra_params.add        ( +         0,           new ValueOf           (              new RelativeAddress              ( -               collection_in_a, +               collection_in_b,                 new Cast(iterator.get_value(), Type.STRING), -               ((MapType) collection_in_a.get_target_type()).get_member_type() +               ((MapType) collection_in_b.get_target_type()).get_member_type()              )           )        ); -      params.add +      extra_params.add        ( +         0,           new ValueOf           (              new RelativeAddress              ( -               collection_in_b, +               collection_in_a,                 new Cast(iterator.get_value(), Type.STRING), -               ((MapType) collection_in_b.get_target_type()).get_member_type() +               ((MapType) collection_in_a.get_target_type()).get_member_type()              )           )        ); @@ -136,7 +137,7 @@ public class MergeLambda               * be a set.               */              storage.get_address(), -            params +            extra_params           )        ); | 


