| 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/core | |
| parent | 190cf9e6c79375ab1ae9f36b5d13f1fd07c082e5 (diff) | |
...
Diffstat (limited to 'src/core')
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 ) ); |


