From 87b3ce9b51499ac51027fcdd5cd971a16e5e844a Mon Sep 17 00:00:00 2001 From: Nathanael Sensfelder Date: Fri, 22 Oct 2021 11:33:02 +0200 Subject: Adds support for partial lambdas. --- .../computation/generic/FilterComputation.java | 29 +--- .../fate/v1/lang/computation/generic/Fold.java | 26 +--- .../generic/IndexedFilterComputation.java | 30 +--- .../computation/generic/IndexedMapComputation.java | 26 +--- .../generic/IndexedMergeComputation.java | 28 +--- .../generic/IndexedPartitionComputation.java | 26 +--- .../generic/IndexedSafeMergeComputation.java | 27 +--- .../lang/computation/generic/LambdaEvaluation.java | 3 +- .../lang/computation/generic/MapComputation.java | 26 +--- .../lang/computation/generic/MergeComputation.java | 28 +--- .../generic/PartialLambdaEvaluation.java | 166 +++++++++++++++++++++ .../computation/generic/PartitionComputation.java | 26 +--- .../computation/generic/SafeMergeComputation.java | 33 +--- .../lang/computation/generic/SortComputation.java | 30 +--- .../computation/generic/SubListComputation.java | 2 +- .../fate/v1/lang/instruction/generic/Filter.java | 29 +--- .../v1/lang/instruction/generic/IndexedFilter.java | 32 +--- .../lang/instruction/generic/IndexedPartition.java | 32 +--- .../v1/lang/instruction/generic/Partition.java | 32 +--- .../fate/v1/lang/instruction/generic/Sort.java | 29 +--- .../lang/instruction/generic/UserInstruction.java | 17 +-- .../fate/v1/lang/meta/RecurrentChecks.java | 82 +++++++++- src/core/src/tonkadur/fate/v1/parser/FateParser.g4 | 15 +- .../wyrd/v1/compiler/fate/v1/Compiler.java | 40 ++++- .../v1/compiler/fate/v1/ComputationCompiler.java | 72 ++++++++- .../wyrd/v1/compiler/fate/v1/SequenceCompiler.java | 24 ++- .../computation/generic/AtReferenceCompiler.java | 1 - .../generic/FilterComputationCompiler.java | 30 +--- .../fate/v1/computation/generic/FoldCompiler.java | 29 +--- .../generic/IndexedFilterComputationCompiler.java | 30 +--- .../generic/IndexedMapComputationCompiler.java | 30 +--- .../generic/IndexedMergeComputationCompiler.java | 30 +--- .../IndexedPartitionComputationCompiler.java | 37 +---- .../IndexedSafeMergeComputationCompiler.java | 30 +--- .../generic/LambdaEvaluationCompiler.java | 17 ++- .../generic/MapComputationCompiler.java | 30 +--- .../generic/MergeComputationCompiler.java | 30 +--- .../generic/PartialLambdaEvaluationCompiler.java | 100 +++++++++++++ .../generic/PartitionComputationCompiler.java | 34 +---- .../generic/SafeMergeComputationCompiler.java | 31 +--- .../generic/SortComputationCompiler.java | 30 +--- .../v1/instruction/generic/FilterCompiler.java | 42 +----- .../instruction/generic/IndexedFilterCompiler.java | 42 +----- .../generic/IndexedPartitionCompiler.java | 42 +----- .../v1/instruction/generic/PartitionCompiler.java | 42 +----- .../fate/v1/instruction/generic/SortCompiler.java | 42 +----- .../generic/UserInstructionCompiler.java | 39 +++++ .../v1/compiler/util/AddParametersToLambda.java | 78 ++++++++++ .../wyrd/v1/compiler/util/BinarySearch.java | 18 +-- .../wyrd/v1/compiler/util/FilterLambda.java | 13 +- .../src/tonkadur/wyrd/v1/compiler/util/Fold.java | 16 +- .../wyrd/v1/compiler/util/IndexedFilterLambda.java | 16 +- .../wyrd/v1/compiler/util/IndexedMapLambda.java | 16 +- .../wyrd/v1/compiler/util/IndexedMergeLambda.java | 73 ++++----- .../v1/compiler/util/IndexedPartitionLambda.java | 14 +- .../wyrd/v1/compiler/util/LambdaEvaluation.java | 52 ++++++- .../tonkadur/wyrd/v1/compiler/util/MapLambda.java | 13 +- .../wyrd/v1/compiler/util/MergeLambda.java | 65 ++++---- .../wyrd/v1/compiler/util/PartitionLambda.java | 13 +- .../src/tonkadur/wyrd/v1/compiler/util/Sort.java | 6 +- .../wyrd/v1/lang/computation/Constant.java | 20 +++ 61 files changed, 953 insertions(+), 1108 deletions(-) create mode 100644 src/core/src/tonkadur/fate/v1/lang/computation/generic/PartialLambdaEvaluation.java create mode 100644 src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/computation/generic/PartialLambdaEvaluationCompiler.java create mode 100644 src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/instruction/generic/UserInstructionCompiler.java create mode 100644 src/core/src/tonkadur/wyrd/v1/compiler/util/AddParametersToLambda.java diff --git a/src/core/src/tonkadur/fate/v1/lang/computation/generic/FilterComputation.java b/src/core/src/tonkadur/fate/v1/lang/computation/generic/FilterComputation.java index b12aec8..fe368da 100644 --- a/src/core/src/tonkadur/fate/v1/lang/computation/generic/FilterComputation.java +++ b/src/core/src/tonkadur/fate/v1/lang/computation/generic/FilterComputation.java @@ -47,9 +47,8 @@ public class FilterComputation extends GenericComputation { final Computation lambda_function; final Computation collection; - final List extra_params; - if (call_parameters.size() < 2) + if (call_parameters.size() != 2) { ErrorManager.handle ( @@ -58,7 +57,7 @@ public class FilterComputation extends GenericComputation origin, "(" + alias - + " <(LAMBDA BOOL (X Y0...YN))> <(LIST X)|(SET X)> ...)" + + " <(LAMBDA BOOL (X))> <(LIST X)|(SET X)>)" ) ); @@ -67,7 +66,6 @@ public class FilterComputation extends GenericComputation lambda_function = call_parameters.get(0); collection = call_parameters.get(1); - extra_params = call_parameters.subList(2, call_parameters.size()); collection.expect_non_string(); @@ -86,8 +84,7 @@ public class FilterComputation extends GenericComputation Collections.singletonList ( ((CollectionType) collection.get_type()).get_content_type() - ), - extra_params + ) ); RecurrentChecks.assert_return_type_is(lambda_function, Type.BOOL); @@ -97,15 +94,13 @@ public class FilterComputation extends GenericComputation ( origin, lambda_function, - collection, - extra_params + collection ); } /***************************************************************************/ /**** MEMBERS **************************************************************/ /***************************************************************************/ - protected final List extra_params; protected final Computation lambda_function; protected final Computation collection; @@ -117,15 +112,13 @@ public class FilterComputation extends GenericComputation ( final Origin origin, final Computation lambda_function, - final Computation collection, - final List extra_params + final Computation collection ) { super(origin, collection.get_type()); this.lambda_function = lambda_function; this.collection = collection; - this.extra_params = extra_params; } /***************************************************************************/ @@ -142,11 +135,6 @@ public class FilterComputation extends GenericComputation return collection; } - public List get_extra_parameters () - { - return extra_params; - } - /**** Misc. ****************************************************************/ @Override public String toString () @@ -157,13 +145,6 @@ public class FilterComputation extends GenericComputation 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/generic/Fold.java b/src/core/src/tonkadur/fate/v1/lang/computation/generic/Fold.java index 7bb5300..c0a200c 100644 --- a/src/core/src/tonkadur/fate/v1/lang/computation/generic/Fold.java +++ b/src/core/src/tonkadur/fate/v1/lang/computation/generic/Fold.java @@ -63,7 +63,6 @@ public class Fold extends GenericComputation final Computation initial_value; final Computation collection; final boolean is_foldl; - final List extra_params; final List base_param_types; final Type return_type; @@ -71,7 +70,7 @@ public class Fold extends GenericComputation base_param_types = new ArrayList(); - if (call_parameters.size() < 3) + if (call_parameters.size() != 3) { ErrorManager.handle ( @@ -80,8 +79,7 @@ public class Fold extends GenericComputation origin, "(" + alias - + " <(LAMBDA X (X Y Z0...ZN))> " - + " <(LIST Y)|(SET Y)> ...)" + + " <(LAMBDA X (X Y))> <(SET Y)|(LIST Y)>)" ) ); @@ -91,7 +89,6 @@ public class Fold extends GenericComputation lambda_function = call_parameters.get(0); initial_value = call_parameters.get(1); collection = call_parameters.get(2); - extra_params = call_parameters.subList(3, call_parameters.size()); lambda_function.expect_non_string(); collection.expect_non_string(); @@ -117,8 +114,7 @@ public class Fold extends GenericComputation RecurrentChecks.propagate_expected_types_and_assert_is_lambda ( lambda_function, - base_param_types, - extra_params + base_param_types ); return @@ -129,7 +125,6 @@ public class Fold extends GenericComputation initial_value, collection, is_foldl, - extra_params, return_type ); } @@ -137,7 +132,6 @@ public class Fold extends GenericComputation /***************************************************************************/ /**** MEMBERS **************************************************************/ /***************************************************************************/ - protected final List extra_params; protected final Computation lambda_function; protected final Computation initial_value; protected final Computation collection; @@ -154,7 +148,6 @@ public class Fold extends GenericComputation final Computation initial_value, final Computation collection, final boolean is_foldl, - final List extra_params, final Type act_as ) { @@ -164,7 +157,6 @@ public class Fold extends GenericComputation this.initial_value = initial_value; this.collection = collection; this.is_foldl = is_foldl; - this.extra_params = extra_params; } /***************************************************************************/ @@ -191,11 +183,6 @@ public class Fold extends GenericComputation return is_foldl; } - public List get_extra_parameters () - { - return extra_params; - } - /**** Misc. ****************************************************************/ @Override public String toString () @@ -217,13 +204,6 @@ public class Fold extends GenericComputation 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/generic/IndexedFilterComputation.java b/src/core/src/tonkadur/fate/v1/lang/computation/generic/IndexedFilterComputation.java index 9a4ac64..4f3eb57 100644 --- a/src/core/src/tonkadur/fate/v1/lang/computation/generic/IndexedFilterComputation.java +++ b/src/core/src/tonkadur/fate/v1/lang/computation/generic/IndexedFilterComputation.java @@ -52,12 +52,11 @@ public class IndexedFilterComputation extends GenericComputation { final Computation lambda_function; final Computation collection; - final List extra_params; final List base_param_types; base_param_types = new ArrayList(); - if (call_parameters.size() < 2) + if (call_parameters.size() != 2) { ErrorManager.handle ( @@ -66,8 +65,7 @@ public class IndexedFilterComputation extends GenericComputation origin, "(" + alias - + " <(LAMBDA BOOL (INT X Y0...YN))> <(LIST X)|(SET X)>" - + " ...)" + + " <(LAMBDA BOOL (INT X))> <(LIST X)|(SET X)>)" ) ); @@ -76,7 +74,6 @@ public class IndexedFilterComputation extends GenericComputation lambda_function = call_parameters.get(0); collection = call_parameters.get(1); - extra_params = call_parameters.subList(2, call_parameters.size()); collection.expect_non_string(); @@ -98,8 +95,7 @@ public class IndexedFilterComputation extends GenericComputation RecurrentChecks.propagate_expected_types_and_assert_is_lambda ( lambda_function, - base_param_types, - extra_params + base_param_types ); RecurrentChecks.assert_return_type_is(lambda_function, Type.BOOL); @@ -109,15 +105,13 @@ public class IndexedFilterComputation extends GenericComputation ( origin, lambda_function, - collection, - extra_params + collection ); } /***************************************************************************/ /**** MEMBERS **************************************************************/ /***************************************************************************/ - protected final List extra_params; protected final Computation lambda_function; protected final Computation collection; @@ -129,15 +123,13 @@ public class IndexedFilterComputation extends GenericComputation ( final Origin origin, final Computation lambda_function, - final Computation collection, - final List extra_params + final Computation collection ) { super(origin, collection.get_type()); this.lambda_function = lambda_function; this.collection = collection; - this.extra_params = extra_params; } /***************************************************************************/ @@ -154,11 +146,6 @@ public class IndexedFilterComputation extends GenericComputation return collection; } - public List get_extra_parameters () - { - return extra_params; - } - /**** Misc. ****************************************************************/ @Override public String toString () @@ -169,13 +156,6 @@ public class IndexedFilterComputation extends GenericComputation 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/generic/IndexedMapComputation.java b/src/core/src/tonkadur/fate/v1/lang/computation/generic/IndexedMapComputation.java index c02f3f4..3358e01 100644 --- a/src/core/src/tonkadur/fate/v1/lang/computation/generic/IndexedMapComputation.java +++ b/src/core/src/tonkadur/fate/v1/lang/computation/generic/IndexedMapComputation.java @@ -52,13 +52,12 @@ public class IndexedMapComputation extends GenericComputation { final Computation lambda_function; final Computation collection; - final List extra_params; final List base_param_types; base_param_types = new ArrayList(); base_param_types.add(Type.INT); - if (call_parameters.size() < 2) + if (call_parameters.size() != 2) { ErrorManager.handle ( @@ -67,8 +66,7 @@ public class IndexedMapComputation extends GenericComputation origin, "(" + alias - + " <(LAMBDA X (INT Y Z0...ZN))> <(LIST Y)|(SET Y)>" - + " ...)" + + " <(LAMBDA X (INT Y))> <(LIST Y)|(SET Y)>)" ) ); @@ -77,7 +75,6 @@ public class IndexedMapComputation extends GenericComputation lambda_function = call_parameters.get(0); collection = call_parameters.get(1); - extra_params = call_parameters.subList(2, call_parameters.size()); collection.expect_non_string(); @@ -98,8 +95,7 @@ public class IndexedMapComputation extends GenericComputation RecurrentChecks.propagate_expected_types_and_assert_is_lambda ( lambda_function, - base_param_types, - extra_params + base_param_types ); return @@ -108,7 +104,6 @@ public class IndexedMapComputation extends GenericComputation origin, lambda_function, collection, - extra_params, CollectionType.build ( origin, @@ -122,7 +117,6 @@ public class IndexedMapComputation extends GenericComputation /***************************************************************************/ /**** MEMBERS **************************************************************/ /***************************************************************************/ - protected final List extra_params; protected final Computation lambda_function; protected final Computation collection; @@ -135,7 +129,6 @@ public class IndexedMapComputation extends GenericComputation final Origin origin, final Computation lambda_function, final Computation collection, - final List extra_params, final Type output_type ) { @@ -143,7 +136,6 @@ public class IndexedMapComputation extends GenericComputation this.lambda_function = lambda_function; this.collection = collection; - this.extra_params = extra_params; } /***************************************************************************/ @@ -160,11 +152,6 @@ public class IndexedMapComputation extends GenericComputation return collection; } - public List get_extra_parameters () - { - return extra_params; - } - /**** Misc. ****************************************************************/ @Override public String toString () @@ -175,13 +162,6 @@ public class IndexedMapComputation extends GenericComputation 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/generic/IndexedMergeComputation.java b/src/core/src/tonkadur/fate/v1/lang/computation/generic/IndexedMergeComputation.java index 23fc09f..193fc63 100644 --- a/src/core/src/tonkadur/fate/v1/lang/computation/generic/IndexedMergeComputation.java +++ b/src/core/src/tonkadur/fate/v1/lang/computation/generic/IndexedMergeComputation.java @@ -53,13 +53,12 @@ public class IndexedMergeComputation extends GenericComputation final Computation lambda_function; final Computation collection_a; final Computation collection_b; - final List extra_params; final List base_param_types; final boolean to_set; base_param_types = new ArrayList(); - if (call_parameters.size() < 3) + if (call_parameters.size() != 3) { ErrorManager.handle ( @@ -68,8 +67,8 @@ public class IndexedMergeComputation extends GenericComputation origin, "(" + alias - + " <(LAMBDA X (INT Y Z W0...WN))> <(LIST Y)|(SET Y)>" - + " <(LIST Z)|(SET Z)> ...)" + + " <(LAMBDA X (INT Y Z))> <(LIST Y)|(SET Y)>" + + " <(LIST Z)|(SET Z)>)" ) ); @@ -79,7 +78,6 @@ public class IndexedMergeComputation extends GenericComputation lambda_function = call_parameters.get(0); collection_a = call_parameters.get(1); collection_b = call_parameters.get(2); - extra_params = call_parameters.subList(3, call_parameters.size()); collection_a.expect_non_string(); collection_b.expect_non_string(); @@ -99,8 +97,7 @@ public class IndexedMergeComputation extends GenericComputation RecurrentChecks.propagate_expected_types_and_assert_is_lambda ( lambda_function, - base_param_types, - extra_params + base_param_types ); to_set = alias.startsWith("set:"); @@ -122,7 +119,6 @@ public class IndexedMergeComputation extends GenericComputation collection_a, collection_b, to_set, - extra_params, CollectionType.build ( origin, @@ -136,7 +132,6 @@ public class IndexedMergeComputation extends GenericComputation /***************************************************************************/ /**** MEMBERS **************************************************************/ /***************************************************************************/ - protected final List extra_params; protected final Computation lambda_function; protected final Computation collection_in_a; protected final Computation collection_in_b; @@ -153,7 +148,6 @@ public class IndexedMergeComputation extends GenericComputation final Computation collection_in_a, final Computation collection_in_b, final boolean to_set, - final List extra_params, final Type output_type ) { @@ -163,7 +157,6 @@ public class IndexedMergeComputation extends GenericComputation this.collection_in_a = collection_in_a; this.collection_in_b = collection_in_b; this.to_set = to_set; - this.extra_params = extra_params; } /***************************************************************************/ @@ -185,11 +178,6 @@ public class IndexedMergeComputation extends GenericComputation return collection_in_b; } - public List get_extra_parameters () - { - return extra_params; - } - public boolean to_set () { return to_set; @@ -214,15 +202,7 @@ public class IndexedMergeComputation extends GenericComputation sb.append(" "); sb.append(collection_in_a.toString()); sb.append(" "); - sb.append(collection_in_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/generic/IndexedPartitionComputation.java b/src/core/src/tonkadur/fate/v1/lang/computation/generic/IndexedPartitionComputation.java index bb253a0..8da23b4 100644 --- a/src/core/src/tonkadur/fate/v1/lang/computation/generic/IndexedPartitionComputation.java +++ b/src/core/src/tonkadur/fate/v1/lang/computation/generic/IndexedPartitionComputation.java @@ -53,13 +53,12 @@ public class IndexedPartitionComputation extends GenericComputation { final Computation lambda_function; final Computation collection; - final List extra_params; final List base_param_types; final Type type; base_param_types = new ArrayList(); - if (call_parameters.size() < 2) + if (call_parameters.size() != 2) { ErrorManager.handle ( @@ -68,8 +67,7 @@ public class IndexedPartitionComputation extends GenericComputation origin, "(" + alias - + " <(LAMBDA BOOL (INT X Y0...YN))> <(LIST X)|(SET X)>" - + " ...)" + + " <(LAMBDA BOOL (INT X))> <(LIST X)|(SET X)>)" ) ); @@ -78,7 +76,6 @@ public class IndexedPartitionComputation extends GenericComputation lambda_function = call_parameters.get(0); collection = call_parameters.get(1); - extra_params = call_parameters.subList(2, call_parameters.size()); collection.expect_non_string(); @@ -101,8 +98,7 @@ public class IndexedPartitionComputation extends GenericComputation RecurrentChecks.propagate_expected_types_and_assert_is_lambda ( lambda_function, - base_param_types, - extra_params + base_param_types ); RecurrentChecks.assert_return_type_is(lambda_function, Type.BOOL); @@ -122,7 +118,6 @@ public class IndexedPartitionComputation extends GenericComputation origin, lambda_function, collection, - extra_params, type ); } @@ -130,7 +125,6 @@ public class IndexedPartitionComputation extends GenericComputation /***************************************************************************/ /**** MEMBERS **************************************************************/ /***************************************************************************/ - protected final List extra_params; protected final Computation lambda_function; protected final Computation collection; @@ -143,7 +137,6 @@ public class IndexedPartitionComputation extends GenericComputation final Origin origin, final Computation lambda_function, final Computation collection, - final List extra_params, final Type output_type ) { @@ -151,7 +144,6 @@ public class IndexedPartitionComputation extends GenericComputation this.lambda_function = lambda_function; this.collection = collection; - this.extra_params = extra_params; } /***************************************************************************/ @@ -168,11 +160,6 @@ public class IndexedPartitionComputation extends GenericComputation return collection; } - public List get_extra_parameters () - { - return extra_params; - } - /**** Misc. ****************************************************************/ @Override public String toString () @@ -183,13 +170,6 @@ public class IndexedPartitionComputation extends GenericComputation 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/generic/IndexedSafeMergeComputation.java b/src/core/src/tonkadur/fate/v1/lang/computation/generic/IndexedSafeMergeComputation.java index 3d1e22a..d59fb2f 100644 --- a/src/core/src/tonkadur/fate/v1/lang/computation/generic/IndexedSafeMergeComputation.java +++ b/src/core/src/tonkadur/fate/v1/lang/computation/generic/IndexedSafeMergeComputation.java @@ -64,13 +64,12 @@ public class IndexedSafeMergeComputation extends GenericComputation final Computation default_a; final Computation collection_b; final Computation default_b; - final List extra_params; final List base_param_types; final boolean to_set; base_param_types = new ArrayList(); - if (call_parameters.size() < 5) + if (call_parameters.size() != 5) { ErrorManager.handle ( @@ -79,9 +78,8 @@ public class IndexedSafeMergeComputation extends GenericComputation origin, "(" + alias - + " <(LAMBDA X (INT Y Z W0...WN))> <(LIST Y)|(SET Y)>" - + " <(LIST Z)|(SET Z)> " - + " ...)" + + " <(LAMBDA X (INT Y Z))> <(LIST Y)|(SET Y)>" + + " <(LIST Z)|(SET Z)> )" ) ); @@ -93,7 +91,6 @@ public class IndexedSafeMergeComputation extends GenericComputation default_a = call_parameters.get(2); collection_b = call_parameters.get(3); default_b = call_parameters.get(4); - extra_params = call_parameters.subList(5, call_parameters.size()); RecurrentChecks.propagate_expected_types_and_assert_is_a_collection_of ( @@ -124,8 +121,7 @@ public class IndexedSafeMergeComputation extends GenericComputation RecurrentChecks.propagate_expected_types_and_assert_is_lambda ( lambda_function, - base_param_types, - extra_params + base_param_types ); to_set = alias.startsWith("set:"); @@ -149,7 +145,6 @@ public class IndexedSafeMergeComputation extends GenericComputation collection_b, default_b, to_set, - extra_params, CollectionType.build ( origin, @@ -163,7 +158,6 @@ public class IndexedSafeMergeComputation extends GenericComputation /***************************************************************************/ /**** MEMBERS **************************************************************/ /***************************************************************************/ - protected final List extra_params; protected final Computation lambda_function; protected final Computation collection_in_a; protected final Computation default_a; @@ -184,7 +178,6 @@ public class IndexedSafeMergeComputation extends GenericComputation final Computation collection_in_b, final Computation default_b, final boolean to_set, - final List extra_params, final Type output_type ) { @@ -196,7 +189,6 @@ public class IndexedSafeMergeComputation extends GenericComputation this.collection_in_b = collection_in_b; this.default_b = default_b; this.to_set = to_set; - this.extra_params = extra_params; } /***************************************************************************/ @@ -228,11 +220,6 @@ public class IndexedSafeMergeComputation extends GenericComputation return default_b; } - public List get_extra_parameters () - { - return extra_params; - } - public boolean to_set () { return to_set; @@ -280,12 +267,6 @@ public class IndexedSafeMergeComputation extends GenericComputation 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/generic/LambdaEvaluation.java b/src/core/src/tonkadur/fate/v1/lang/computation/generic/LambdaEvaluation.java index fe5466a..207845d 100644 --- a/src/core/src/tonkadur/fate/v1/lang/computation/generic/LambdaEvaluation.java +++ b/src/core/src/tonkadur/fate/v1/lang/computation/generic/LambdaEvaluation.java @@ -65,10 +65,9 @@ public class LambdaEvaluation extends GenericComputation lambda_function = call_parameters.get(0); parameters = call_parameters.subList(1, call_parameters.size()); - RecurrentChecks.propagate_expected_types_and_assert_is_lambda + RecurrentChecks.propagate_expected_types_and_assert_is_lambda_params ( lambda_function, - new ArrayList(), parameters ); diff --git a/src/core/src/tonkadur/fate/v1/lang/computation/generic/MapComputation.java b/src/core/src/tonkadur/fate/v1/lang/computation/generic/MapComputation.java index bb3157f..7093980 100644 --- a/src/core/src/tonkadur/fate/v1/lang/computation/generic/MapComputation.java +++ b/src/core/src/tonkadur/fate/v1/lang/computation/generic/MapComputation.java @@ -47,9 +47,8 @@ public class MapComputation extends GenericComputation { final Computation lambda_function; final Computation collection; - final List extra_params; - if (call_parameters.size() < 2) + if (call_parameters.size() != 2) { ErrorManager.handle ( @@ -58,8 +57,7 @@ public class MapComputation extends GenericComputation origin, "(" + alias - + " <(LAMBDA X (Y Z0...ZN))> <(LIST Y)|(SET Y)>" - + " ...)" + + " <(LAMBDA X (Y))> <(LIST Y)|(SET Y)>)" ) ); @@ -68,7 +66,6 @@ public class MapComputation extends GenericComputation lambda_function = call_parameters.get(0); collection = call_parameters.get(1); - extra_params = call_parameters.subList(2, call_parameters.size()); collection.expect_non_string(); @@ -87,8 +84,7 @@ public class MapComputation extends GenericComputation Collections.singletonList ( ((CollectionType) collection.get_type()).get_content_type() - ), - extra_params + ) ); return @@ -97,7 +93,6 @@ public class MapComputation extends GenericComputation origin, lambda_function, collection, - extra_params, CollectionType.build ( origin, @@ -110,7 +105,6 @@ public class MapComputation extends GenericComputation /***************************************************************************/ /**** MEMBERS **************************************************************/ /***************************************************************************/ - protected final List extra_params; protected final Computation lambda_function; protected final Computation collection; @@ -123,7 +117,6 @@ public class MapComputation extends GenericComputation final Origin origin, final Computation lambda_function, final Computation collection, - final List extra_params, final Type output_type ) { @@ -131,7 +124,6 @@ public class MapComputation extends GenericComputation this.lambda_function = lambda_function; this.collection = collection; - this.extra_params = extra_params; } /***************************************************************************/ @@ -148,11 +140,6 @@ public class MapComputation extends GenericComputation return collection; } - public List get_extra_parameters () - { - return extra_params; - } - /**** Misc. ****************************************************************/ @Override public String toString () @@ -163,13 +150,6 @@ public class MapComputation extends GenericComputation 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/generic/MergeComputation.java b/src/core/src/tonkadur/fate/v1/lang/computation/generic/MergeComputation.java index a29caa9..bf36913 100644 --- a/src/core/src/tonkadur/fate/v1/lang/computation/generic/MergeComputation.java +++ b/src/core/src/tonkadur/fate/v1/lang/computation/generic/MergeComputation.java @@ -47,13 +47,12 @@ public class MergeComputation extends GenericComputation final Computation lambda_function; final Computation collection_a; final Computation collection_b; - final List extra_params; final List base_param_types; final boolean to_set; base_param_types = new ArrayList(); - if (call_parameters.size() < 3) + if (call_parameters.size() != 3) { ErrorManager.handle ( @@ -62,8 +61,8 @@ public class MergeComputation extends GenericComputation origin, "(" + alias - + " <(LAMBDA X (Y Z W0...WN))> <(LIST Y)|(SET Y)>" - + " <(LIST Z)|(SET Z)> ...)" + + " <(LAMBDA X (Y Z))> <(LIST Y)|(SET Y)>" + + " <(LIST Z)|(SET Z)>)" ) ); @@ -73,7 +72,6 @@ public class MergeComputation extends GenericComputation lambda_function = call_parameters.get(0); collection_a = call_parameters.get(1); collection_b = call_parameters.get(2); - extra_params = call_parameters.subList(3, call_parameters.size()); collection_a.expect_non_string(); collection_b.expect_non_string(); @@ -91,8 +89,7 @@ public class MergeComputation extends GenericComputation RecurrentChecks.propagate_expected_types_and_assert_is_lambda ( lambda_function, - base_param_types, - extra_params + base_param_types ); to_set = alias.startsWith("set:"); @@ -114,7 +111,6 @@ public class MergeComputation extends GenericComputation collection_a, collection_b, to_set, - extra_params, CollectionType.build ( origin, @@ -127,7 +123,6 @@ public class MergeComputation extends GenericComputation /***************************************************************************/ /**** MEMBERS **************************************************************/ /***************************************************************************/ - protected final List extra_params; protected final Computation lambda_function; protected final Computation collection_in_a; protected final Computation collection_in_b; @@ -144,7 +139,6 @@ public class MergeComputation extends GenericComputation final Computation collection_in_a, final Computation collection_in_b, final boolean to_set, - final List extra_params, final Type output_type ) { @@ -154,7 +148,6 @@ public class MergeComputation extends GenericComputation this.collection_in_a = collection_in_a; this.collection_in_b = collection_in_b; this.to_set = to_set; - this.extra_params = extra_params; } /***************************************************************************/ @@ -176,11 +169,6 @@ public class MergeComputation extends GenericComputation return collection_in_b; } - public List get_extra_parameters () - { - return extra_params; - } - public boolean to_set () { return to_set; @@ -205,15 +193,7 @@ public class MergeComputation extends GenericComputation sb.append(" "); sb.append(collection_in_a.toString()); sb.append(" "); - sb.append(collection_in_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/generic/PartialLambdaEvaluation.java b/src/core/src/tonkadur/fate/v1/lang/computation/generic/PartialLambdaEvaluation.java new file mode 100644 index 0000000..4f15340 --- /dev/null +++ b/src/core/src/tonkadur/fate/v1/lang/computation/generic/PartialLambdaEvaluation.java @@ -0,0 +1,166 @@ +package tonkadur.fate.v1.lang.computation.generic; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; + +import tonkadur.parser.Origin; +import tonkadur.parser.ParsingError; + +import tonkadur.functional.Merge; + +import tonkadur.error.ErrorManager; + +import tonkadur.fate.v1.error.WrongNumberOfParametersException; + +import tonkadur.fate.v1.lang.type.Type; +import tonkadur.fate.v1.lang.type.LambdaType; + +import tonkadur.fate.v1.lang.meta.ComputationVisitor; +import tonkadur.fate.v1.lang.meta.Computation; +import tonkadur.fate.v1.lang.meta.RecurrentChecks; + +import tonkadur.fate.v1.lang.computation.GenericComputation; + +public class PartialLambdaEvaluation extends GenericComputation +{ + public static Collection get_aliases () + { + final Collection aliases; + + aliases = new ArrayList(); + + aliases.add("partial"); + aliases.add("partial_eval"); + aliases.add("partialeval"); + aliases.add("partialEval"); + aliases.add("partial_evaluate"); + aliases.add("partialevaluate"); + aliases.add("partialEvaluate"); + + return aliases; + } + + /**** Constructors *********************************************************/ + public static Computation build + ( + final Origin origin, + final String alias, + final List call_parameters + ) + throws Throwable + { + final Computation lambda_function; + final List parameters; + final LambdaType initial_type; + final List initial_signature; + final List remaining_signature; + + if (call_parameters.size() < 1) + { + ErrorManager.handle + ( + new WrongNumberOfParametersException + ( + origin, + "(" + alias + " <(LAMBDA X (Y0...YN))> ...)" + ) + ); + + return null; + } + + lambda_function = call_parameters.get(0); + parameters = call_parameters.subList(1, call_parameters.size()); + + RecurrentChecks.propagate_partial_expected_types_and_assert_is_lambda + ( + lambda_function, + new ArrayList(), + parameters + ); + + initial_type = (LambdaType) lambda_function.get_type(); + initial_signature = initial_type.get_signature(); + remaining_signature = + initial_signature.subList + ( + (call_parameters.size() - 1), + initial_signature.size() + ); + + return + new PartialLambdaEvaluation + ( + origin, + lambda_function, + parameters, + new LambdaType + ( + origin, + initial_type.get_return_type(), + ("(Partial from " + initial_type.get_name() + ")"), + remaining_signature + ) + ); + } + + /***************************************************************************/ + /**** MEMBERS **************************************************************/ + /***************************************************************************/ + protected final Computation lambda_function; + protected final List parameters; + + /***************************************************************************/ + /**** PROTECTED ************************************************************/ + /***************************************************************************/ + /**** Constructors *********************************************************/ + protected PartialLambdaEvaluation + ( + final Origin origin, + final Computation lambda_function, + final List parameters, + final Type act_as + ) + { + super(origin, act_as); + + this.lambda_function = lambda_function; + this.parameters = parameters; + } + + /***************************************************************************/ + /**** PUBLIC ***************************************************************/ + /***************************************************************************/ + + /**** Accessors ************************************************************/ + public Computation get_lambda_function () + { + return lambda_function; + } + + public List get_parameters () + { + return parameters; + } + + /**** Misc. ****************************************************************/ + @Override + public String toString () + { + final StringBuilder sb = new StringBuilder(); + + sb.append("(PartialLambdaEvaluation ("); + sb.append(lambda_function.toString()); + + for (final Computation param: parameters) + { + sb.append(" "); + sb.append(param.toString()); + } + + sb.append("))"); + + return sb.toString(); + } +} diff --git a/src/core/src/tonkadur/fate/v1/lang/computation/generic/PartitionComputation.java b/src/core/src/tonkadur/fate/v1/lang/computation/generic/PartitionComputation.java index b4125c8..3a0f93c 100644 --- a/src/core/src/tonkadur/fate/v1/lang/computation/generic/PartitionComputation.java +++ b/src/core/src/tonkadur/fate/v1/lang/computation/generic/PartitionComputation.java @@ -47,10 +47,9 @@ public class PartitionComputation extends GenericComputation { final Computation lambda_function; final Computation collection; - final List extra_params; final Type type; - if (call_parameters.size() < 2) + if (call_parameters.size() != 2) { ErrorManager.handle ( @@ -59,8 +58,7 @@ public class PartitionComputation extends GenericComputation origin, "(" + alias - + " <(LAMBDA BOOL (X Y0...YN))> <(LIST X)|(SET X)>" - + " ...)" + + " <(LAMBDA BOOL (X)> <(LIST X)|(SET X)>)" ) ); @@ -69,7 +67,6 @@ public class PartitionComputation extends GenericComputation lambda_function = call_parameters.get(0); collection = call_parameters.get(1); - extra_params = call_parameters.subList(2, call_parameters.size()); collection.expect_non_string(); @@ -88,8 +85,7 @@ public class PartitionComputation extends GenericComputation Collections.singletonList ( ((CollectionType) collection.get_type()).get_content_type() - ), - extra_params + ) ); RecurrentChecks.assert_return_type_is(lambda_function, Type.BOOL); @@ -109,7 +105,6 @@ public class PartitionComputation extends GenericComputation origin, lambda_function, collection, - extra_params, type ); } @@ -117,7 +112,6 @@ public class PartitionComputation extends GenericComputation /***************************************************************************/ /**** MEMBERS **************************************************************/ /***************************************************************************/ - protected final List extra_params; protected final Computation lambda_function; protected final Computation collection; @@ -130,7 +124,6 @@ public class PartitionComputation extends GenericComputation final Origin origin, final Computation lambda_function, final Computation collection, - final List extra_params, final Type output_type ) { @@ -138,7 +131,6 @@ public class PartitionComputation extends GenericComputation this.lambda_function = lambda_function; this.collection = collection; - this.extra_params = extra_params; } /***************************************************************************/ @@ -155,11 +147,6 @@ public class PartitionComputation extends GenericComputation return collection; } - public List get_extra_parameters () - { - return extra_params; - } - /**** Misc. ****************************************************************/ @Override public String toString () @@ -170,13 +157,6 @@ public class PartitionComputation extends GenericComputation 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/generic/SafeMergeComputation.java b/src/core/src/tonkadur/fate/v1/lang/computation/generic/SafeMergeComputation.java index 308bba7..f879f15 100644 --- a/src/core/src/tonkadur/fate/v1/lang/computation/generic/SafeMergeComputation.java +++ b/src/core/src/tonkadur/fate/v1/lang/computation/generic/SafeMergeComputation.java @@ -17,7 +17,6 @@ import tonkadur.fate.v1.lang.type.CollectionType; import tonkadur.fate.v1.lang.meta.ComputationVisitor; import tonkadur.fate.v1.lang.meta.Computation; -import tonkadur.fate.v1.lang.meta.Computation; import tonkadur.fate.v1.lang.meta.RecurrentChecks; import tonkadur.fate.v1.lang.computation.GenericComputation; @@ -53,13 +52,12 @@ public class SafeMergeComputation extends GenericComputation final Computation default_a; final Computation collection_b; final Computation default_b; - final List extra_params; final List base_param_types; final boolean to_set; base_param_types = new ArrayList(); - if (call_parameters.size() < 5) + if (call_parameters.size() != 5) { ErrorManager.handle ( @@ -68,9 +66,8 @@ public class SafeMergeComputation extends GenericComputation origin, "(" + alias - + " <(LAMBDA X (Y Z W0...WN))> <(LIST Y)|(SET Y)>" - + " <(LIST Z)|(SET Z)> " - + " ...)" + + " <(LAMBDA X (Y Z))> <(LIST Y)|(SET Y)>" + + " <(LIST Z)|(SET Z)> )" ) ); @@ -82,7 +79,6 @@ public class SafeMergeComputation extends GenericComputation default_a = call_parameters.get(2); collection_b = call_parameters.get(3); default_b = call_parameters.get(4); - extra_params = call_parameters.subList(5, call_parameters.size()); RecurrentChecks.propagate_expected_types_and_assert_is_a_collection_of ( @@ -109,8 +105,7 @@ public class SafeMergeComputation extends GenericComputation RecurrentChecks.propagate_expected_types_and_assert_is_lambda ( lambda_function, - base_param_types, - extra_params + base_param_types ); to_set = alias.startsWith("set:"); @@ -134,7 +129,6 @@ public class SafeMergeComputation extends GenericComputation collection_b, default_b, to_set, - extra_params, CollectionType.build ( origin, @@ -147,7 +141,6 @@ public class SafeMergeComputation extends GenericComputation /***************************************************************************/ /**** MEMBERS **************************************************************/ /***************************************************************************/ - protected final List extra_params; protected final Computation lambda_function; protected final Computation collection_in_a; protected final Computation default_a; @@ -168,7 +161,6 @@ public class SafeMergeComputation extends GenericComputation final Computation collection_in_b, final Computation default_b, final boolean to_set, - final List extra_params, final Type output_type ) { @@ -180,7 +172,6 @@ public class SafeMergeComputation extends GenericComputation this.collection_in_b = collection_in_b; this.default_b = default_b; this.to_set = to_set; - this.extra_params = extra_params; } /***************************************************************************/ @@ -212,11 +203,6 @@ public class SafeMergeComputation extends GenericComputation return default_b; } - public List get_extra_parameters () - { - return extra_params; - } - public boolean to_set () { return to_set; @@ -240,22 +226,15 @@ public class SafeMergeComputation extends GenericComputation sb.append(lambda_function.toString()); sb.append(" "); sb.append(collection_in_a.toString()); - sb.append(" "); + sb.append(" "); sb.append(default_a.toString()); sb.append(" "); sb.append(collection_in_b.toString()); - sb.append(" "); + sb.append(" "); 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/generic/SortComputation.java b/src/core/src/tonkadur/fate/v1/lang/computation/generic/SortComputation.java index 1caa529..b1f9280 100644 --- a/src/core/src/tonkadur/fate/v1/lang/computation/generic/SortComputation.java +++ b/src/core/src/tonkadur/fate/v1/lang/computation/generic/SortComputation.java @@ -44,13 +44,12 @@ public class SortComputation extends GenericComputation { final Computation lambda_function; final Computation collection; - final List extra_params; final List base_param_types; base_param_types = new ArrayList(); base_param_types.add(Type.INT); - if (call_parameters.size() < 2) + if (call_parameters.size() != 2) { ErrorManager.handle ( @@ -59,8 +58,7 @@ public class SortComputation extends GenericComputation origin, "(" + alias - + " <(LAMBDA INT (X Y0...YN))> <(LIST X)|(SET X)>" - + " ...)" + + " <(LAMBDA INT (X))> <(LIST X)|(SET X)>)" ) ); @@ -69,7 +67,6 @@ public class SortComputation extends GenericComputation lambda_function = call_parameters.get(0); collection = call_parameters.get(1); - extra_params = call_parameters.subList(2, call_parameters.size()); collection.expect_non_string(); @@ -85,20 +82,17 @@ public class SortComputation extends GenericComputation RecurrentChecks.propagate_expected_types_and_assert_is_lambda ( lambda_function, - base_param_types, - extra_params + base_param_types ); RecurrentChecks.assert_return_type_is(lambda_function, Type.INT); - return - new SortComputation(origin, lambda_function, collection, extra_params); + return new SortComputation(origin, lambda_function, collection); } /***************************************************************************/ /**** MEMBERS **************************************************************/ /***************************************************************************/ - protected final List extra_params; protected final Computation lambda_function; protected final Computation collection; @@ -110,15 +104,13 @@ public class SortComputation extends GenericComputation ( final Origin origin, final Computation lambda_function, - final Computation collection, - final List extra_params + final Computation collection ) { super(origin, collection.get_type()); this.lambda_function = lambda_function; this.collection = collection; - this.extra_params = extra_params; } /***************************************************************************/ @@ -135,11 +127,6 @@ public class SortComputation extends GenericComputation return collection; } - public List get_extra_parameters () - { - return extra_params; - } - /**** Misc. ****************************************************************/ @Override public String toString () @@ -150,13 +137,6 @@ public class SortComputation extends GenericComputation 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/generic/SubListComputation.java b/src/core/src/tonkadur/fate/v1/lang/computation/generic/SubListComputation.java index 39225e9..6d7f29f 100644 --- a/src/core/src/tonkadur/fate/v1/lang/computation/generic/SubListComputation.java +++ b/src/core/src/tonkadur/fate/v1/lang/computation/generic/SubListComputation.java @@ -60,7 +60,7 @@ public class SubListComputation extends GenericComputation "(" + alias + " " - + " <(LIST X)|(SET X)> ...)" + + " <(LIST X)|(SET X)>)" ) ); diff --git a/src/core/src/tonkadur/fate/v1/lang/instruction/generic/Filter.java b/src/core/src/tonkadur/fate/v1/lang/instruction/generic/Filter.java index 5a15f17..fa0080a 100644 --- a/src/core/src/tonkadur/fate/v1/lang/instruction/generic/Filter.java +++ b/src/core/src/tonkadur/fate/v1/lang/instruction/generic/Filter.java @@ -50,9 +50,8 @@ public class Filter extends GenericInstruction { final Computation lambda_function; final Computation collection; - final List extra_params; - if (call_parameters.size() < 2) + if (call_parameters.size() != 2) { ErrorManager.handle ( @@ -61,8 +60,7 @@ public class Filter extends GenericInstruction origin, "(" + alias - + "! <(LAMBDA BOOL (X Y0...YN))> <(LIST X)|(SET X) REFERENCE>" - + " ...)" + + "! <(LAMBDA BOOL (X))> <(LIST X)|(SET X) REFERENCE>)" ) ); @@ -71,7 +69,6 @@ public class Filter extends GenericInstruction lambda_function = call_parameters.get(0); collection = call_parameters.get(1); - extra_params = call_parameters.subList(2, call_parameters.size()); collection.expect_non_string(); @@ -90,21 +87,19 @@ public class Filter extends GenericInstruction Collections.singletonList ( ((CollectionType) collection.get_type()).get_content_type() - ), - extra_params + ) ); RecurrentChecks.assert_return_type_is(lambda_function, Type.BOOL); collection.use_as_reference(); - return new Filter(origin, lambda_function, collection, extra_params); + return new Filter(origin, lambda_function, collection); } /***************************************************************************/ /**** MEMBERS **************************************************************/ /***************************************************************************/ - protected final List extra_params; protected final Computation lambda_function; protected final Computation collection; @@ -116,15 +111,13 @@ public class Filter extends GenericInstruction ( final Origin origin, final Computation lambda_function, - final Computation collection, - final List extra_params + final Computation collection ) { super(origin); this.lambda_function = lambda_function; this.collection = collection; - this.extra_params = extra_params; } /***************************************************************************/ @@ -141,11 +134,6 @@ public class Filter extends GenericInstruction return collection; } - public List get_extra_parameters () - { - return extra_params; - } - /**** Misc. ****************************************************************/ @Override public String toString () @@ -156,13 +144,6 @@ public class Filter extends GenericInstruction 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/generic/IndexedFilter.java b/src/core/src/tonkadur/fate/v1/lang/instruction/generic/IndexedFilter.java index 4a99186..4782bb3 100644 --- a/src/core/src/tonkadur/fate/v1/lang/instruction/generic/IndexedFilter.java +++ b/src/core/src/tonkadur/fate/v1/lang/instruction/generic/IndexedFilter.java @@ -57,12 +57,11 @@ public class IndexedFilter extends GenericInstruction { final Computation lambda_function; final Computation collection; - final List extra_params; final List base_param_types; base_param_types = new ArrayList(); - if (call_parameters.size() < 2) + if (call_parameters.size() != 2) { ErrorManager.handle ( @@ -71,9 +70,8 @@ public class IndexedFilter extends GenericInstruction origin, "(" + alias - + "! <(LAMBDA BOOL (INT X Y0...YN))>" - + " <(LIST X)|(SET X) REFERENCE>" - + " ...)" + + "! <(LAMBDA BOOL (INT X))>" + + " <(LIST X)|(SET X) REFERENCE>)" ) ); @@ -82,7 +80,6 @@ public class IndexedFilter extends GenericInstruction lambda_function = call_parameters.get(0); collection = call_parameters.get(1); - extra_params = call_parameters.subList(2, call_parameters.size()); collection.expect_non_string(); @@ -104,8 +101,7 @@ public class IndexedFilter extends GenericInstruction RecurrentChecks.propagate_expected_types_and_assert_is_lambda ( lambda_function, - base_param_types, - extra_params + base_param_types ); RecurrentChecks.assert_return_type_is(lambda_function, Type.BOOL); @@ -117,15 +113,13 @@ public class IndexedFilter extends GenericInstruction ( origin, lambda_function, - collection, - extra_params + collection ); } /***************************************************************************/ /**** MEMBERS **************************************************************/ /***************************************************************************/ - protected final List extra_params; protected final Computation lambda_function; protected final Computation collection; @@ -137,15 +131,13 @@ public class IndexedFilter extends GenericInstruction ( final Origin origin, final Computation lambda_function, - final Computation collection, - final List extra_params + final Computation collection ) { super(origin); this.lambda_function = lambda_function; this.collection = collection; - this.extra_params = extra_params; } /***************************************************************************/ @@ -162,11 +154,6 @@ public class IndexedFilter extends GenericInstruction return collection; } - public List get_extra_parameters () - { - return extra_params; - } - /**** Misc. ****************************************************************/ @Override public String toString () @@ -177,13 +164,6 @@ public class IndexedFilter extends GenericInstruction 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/generic/IndexedPartition.java b/src/core/src/tonkadur/fate/v1/lang/instruction/generic/IndexedPartition.java index 7e8e9c9..5e35e15 100644 --- a/src/core/src/tonkadur/fate/v1/lang/instruction/generic/IndexedPartition.java +++ b/src/core/src/tonkadur/fate/v1/lang/instruction/generic/IndexedPartition.java @@ -57,12 +57,11 @@ public class IndexedPartition extends GenericInstruction final Computation lambda_function; final Computation collection_in; final Computation collection_out; - final List extra_params; final List base_param_types; base_param_types = new ArrayList(); - if (call_parameters.size() < 3) + if (call_parameters.size() != 3) { ErrorManager.handle ( @@ -71,10 +70,9 @@ public class IndexedPartition extends GenericInstruction origin, "(" + alias - + "! <(LAMBDA BOOL (INT X Y0...YN))>" + + "! <(LAMBDA BOOL (INT X))>" + " " - + " " - + " ...)" + + " )" ) ); @@ -84,7 +82,6 @@ public class IndexedPartition extends GenericInstruction lambda_function = call_parameters.get(0); collection_in = call_parameters.get(1); collection_out = call_parameters.get(2); - extra_params = call_parameters.subList(3, call_parameters.size()); if (alias.startsWith("set:")) { @@ -112,8 +109,7 @@ public class IndexedPartition extends GenericInstruction RecurrentChecks.propagate_expected_types_and_assert_is_lambda ( lambda_function, - base_param_types, - extra_params + base_param_types ); RecurrentChecks.assert_return_type_is(lambda_function, Type.BOOL); @@ -126,15 +122,13 @@ public class IndexedPartition extends GenericInstruction origin, lambda_function, collection_in, - collection_out, - extra_params + collection_out ); } /***************************************************************************/ /**** MEMBERS **************************************************************/ /***************************************************************************/ - protected final List extra_params; protected final Computation lambda_function; protected final Computation collection_in; protected final Computation collection_out; @@ -148,8 +142,7 @@ public class IndexedPartition extends GenericInstruction final Origin origin, final Computation lambda_function, final Computation collection_in, - final Computation collection_out, - final List extra_params + final Computation collection_out ) { super(origin); @@ -157,7 +150,6 @@ public class IndexedPartition extends GenericInstruction this.lambda_function = lambda_function; this.collection_in = collection_in; this.collection_out = collection_out; - this.extra_params = extra_params; } /***************************************************************************/ @@ -179,11 +171,6 @@ public class IndexedPartition extends GenericInstruction return collection_out; } - public List get_extra_parameters () - { - return extra_params; - } - /**** Misc. ****************************************************************/ @Override public String toString () @@ -196,13 +183,6 @@ public class IndexedPartition extends GenericInstruction 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/generic/Partition.java b/src/core/src/tonkadur/fate/v1/lang/instruction/generic/Partition.java index fa6b3f7..7807db5 100644 --- a/src/core/src/tonkadur/fate/v1/lang/instruction/generic/Partition.java +++ b/src/core/src/tonkadur/fate/v1/lang/instruction/generic/Partition.java @@ -51,9 +51,8 @@ public class Partition extends GenericInstruction final Computation lambda_function; final Computation collection_in; final Computation collection_out; - final List extra_params; - if (call_parameters.size() < 3) + if (call_parameters.size() != 3) { ErrorManager.handle ( @@ -62,10 +61,9 @@ public class Partition extends GenericInstruction origin, "(" + alias - + "! <(LAMBDA BOOL (X Y0...YN))>" + + "! <(LAMBDA BOOL (X))>" + " " - + " " - + " ...)" + + " )" ) ); @@ -75,7 +73,6 @@ public class Partition extends GenericInstruction lambda_function = call_parameters.get(0); collection_in = call_parameters.get(1); collection_out = call_parameters.get(2); - extra_params = call_parameters.subList(3, call_parameters.size()); if (alias.startsWith("set:")) { @@ -100,8 +97,7 @@ public class Partition extends GenericInstruction Collections.singletonList ( ((CollectionType) collection_in.get_type()).get_content_type() - ), - extra_params + ) ); RecurrentChecks.assert_return_type_is(lambda_function, Type.BOOL); @@ -114,15 +110,13 @@ public class Partition extends GenericInstruction origin, lambda_function, collection_in, - collection_out, - extra_params + collection_out ); } /***************************************************************************/ /**** MEMBERS **************************************************************/ /***************************************************************************/ - protected final List extra_params; protected final Computation lambda_function; protected final Computation collection_in; protected final Computation collection_out; @@ -136,8 +130,7 @@ public class Partition extends GenericInstruction final Origin origin, final Computation lambda_function, final Computation collection_in, - final Computation collection_out, - final List extra_params + final Computation collection_out ) { super(origin); @@ -145,7 +138,6 @@ public class Partition extends GenericInstruction this.lambda_function = lambda_function; this.collection_in = collection_in; this.collection_out = collection_out; - this.extra_params = extra_params; } /***************************************************************************/ @@ -167,11 +159,6 @@ public class Partition extends GenericInstruction return collection_out; } - public List get_extra_parameters () - { - return extra_params; - } - /**** Misc. ****************************************************************/ @Override public String toString () @@ -184,13 +171,6 @@ public class Partition extends GenericInstruction 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/generic/Sort.java b/src/core/src/tonkadur/fate/v1/lang/instruction/generic/Sort.java index 72d0ef6..ac2c02b 100644 --- a/src/core/src/tonkadur/fate/v1/lang/instruction/generic/Sort.java +++ b/src/core/src/tonkadur/fate/v1/lang/instruction/generic/Sort.java @@ -47,13 +47,12 @@ public class Sort extends GenericInstruction { final Computation lambda_function; final Computation collection; - final List extra_params; final List base_param_types; base_param_types = new ArrayList(); base_param_types.add(Type.INT); - if (call_parameters.size() < 2) + if (call_parameters.size() != 2) { ErrorManager.handle ( @@ -62,8 +61,7 @@ public class Sort extends GenericInstruction origin, "(" + alias - + "! <(LAMBDA INT (X Y0...YN))> <(LIST X)|(SET X) REFERENCE>" - + " ...)" + + "! <(LAMBDA INT (X))> <(LIST X)|(SET X) REFERENCE>)" ) ); @@ -72,7 +70,6 @@ public class Sort extends GenericInstruction lambda_function = call_parameters.get(0); collection = call_parameters.get(1); - extra_params = call_parameters.subList(2, call_parameters.size()); collection.expect_non_string(); @@ -88,21 +85,19 @@ public class Sort extends GenericInstruction RecurrentChecks.propagate_expected_types_and_assert_is_lambda ( lambda_function, - base_param_types, - extra_params + base_param_types ); RecurrentChecks.assert_return_type_is(lambda_function, Type.INT); collection.use_as_reference(); - return new Sort(origin, lambda_function, collection, extra_params); + return new Sort(origin, lambda_function, collection); } /***************************************************************************/ /**** MEMBERS **************************************************************/ /***************************************************************************/ - protected final List extra_params; protected final Computation lambda_function; protected final Computation collection; @@ -114,15 +109,13 @@ public class Sort extends GenericInstruction ( final Origin origin, final Computation lambda_function, - final Computation collection, - final List extra_params + final Computation collection ) { super(origin); this.lambda_function = lambda_function; this.collection = collection; - this.extra_params = extra_params; } /***************************************************************************/ @@ -139,11 +132,6 @@ public class Sort extends GenericInstruction return collection; } - public List get_extra_parameters () - { - return extra_params; - } - /**** Misc. ****************************************************************/ @Override public String toString () @@ -154,13 +142,6 @@ public class Sort extends GenericInstruction 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/generic/UserInstruction.java b/src/core/src/tonkadur/fate/v1/lang/instruction/generic/UserInstruction.java index 9c32c20..3d8140d 100644 --- a/src/core/src/tonkadur/fate/v1/lang/instruction/generic/UserInstruction.java +++ b/src/core/src/tonkadur/fate/v1/lang/instruction/generic/UserInstruction.java @@ -72,13 +72,13 @@ public class UserInstruction extends GenericInstruction call_parameters ); - return new UserInstruction(origin, definition, call_parameters); + return new UserInstruction(origin, alias, call_parameters); } /***************************************************************************/ /**** MEMBERS **************************************************************/ /***************************************************************************/ - protected final Sequence definition; + protected final String instruction_name; protected final List parameters; /***************************************************************************/ @@ -88,24 +88,23 @@ public class UserInstruction extends GenericInstruction protected UserInstruction ( final Origin origin, - final Sequence definition, + final String instruction_name, final List parameters ) { super(origin); - this.definition = definition; + this.instruction_name = instruction_name; this.parameters = parameters; } /***************************************************************************/ /**** PUBLIC ***************************************************************/ /***************************************************************************/ - /**** Accessors ************************************************************/ - public Sequence get_definition () + public String get_instruction_name () { - return definition; + return instruction_name; } public List get_parameters () @@ -120,9 +119,9 @@ public class UserInstruction extends GenericInstruction final StringBuilder sb = new StringBuilder(); sb.append("("); - sb.append(definition.get_name()); + sb.append(get_instruction_name()); - for (final Computation param: parameters) + for (final Computation param: get_parameters()) { sb.append(" "); sb.append(param.toString()); diff --git a/src/core/src/tonkadur/fate/v1/lang/meta/RecurrentChecks.java b/src/core/src/tonkadur/fate/v1/lang/meta/RecurrentChecks.java index 4c701ab..038e687 100644 --- a/src/core/src/tonkadur/fate/v1/lang/meta/RecurrentChecks.java +++ b/src/core/src/tonkadur/fate/v1/lang/meta/RecurrentChecks.java @@ -442,7 +442,7 @@ public class RecurrentChecks } } - public static void propagate_expected_types_and_assert_is_lambda + public static void propagate_partial_expected_types_and_assert_is_lambda ( final Computation lambda, final List filled_types, @@ -461,7 +461,7 @@ public class RecurrentChecks extra_params_size = extra_params.size(); - if ((filled_types.size() + extra_params_size) != lambda_signature.size()) + if ((filled_types.size() + extra_params_size) > lambda_signature.size()) { ErrorManager.handle ( @@ -491,6 +491,84 @@ public class RecurrentChecks } } + public static void propagate_expected_types_and_assert_is_lambda_params + ( + final Computation lambda, + final List params + ) + throws ParsingError + { + final List lambda_signature; + final int params_size; + + lambda.expect_non_string(); + + assert_is_a_lambda_function(lambda); + + lambda_signature = ((LambdaType) lambda.get_type()).get_signature(); + + params_size = params.size(); + + if (params_size != lambda_signature.size()) + { + ErrorManager.handle + ( + new InvalidArityException + ( + lambda.get_origin(), + params_size, + lambda_signature.size(), + lambda_signature.size() + ) + ); + } + + for (int i = 0; i < params_size; ++i) + { + handle_expected_type_propagation + ( + params.get(i), + lambda_signature.get(i) + ); + + assert_can_be_used_as + ( + params.get(i), + lambda_signature.get(i) + ); + } + } + + public static void propagate_expected_types_and_assert_is_lambda + ( + final Computation lambda, + final List filled_types + ) + throws ParsingError + { + final List lambda_signature; + + lambda.expect_non_string(); + + assert_is_a_lambda_function(lambda); + + lambda_signature = ((LambdaType) lambda.get_type()).get_signature(); + + if (filled_types.size() != lambda_signature.size()) + { + ErrorManager.handle + ( + new InvalidArityException + ( + lambda.get_origin(), + filled_types.size(), + lambda_signature.size(), + lambda_signature.size() + ) + ); + } + } + public static void assert_types_matches_signature ( final Origin o, diff --git a/src/core/src/tonkadur/fate/v1/parser/FateParser.g4 b/src/core/src/tonkadur/fate/v1/parser/FateParser.g4 index a06487b..c8eba75 100644 --- a/src/core/src/tonkadur/fate/v1/parser/FateParser.g4 +++ b/src/core/src/tonkadur/fate/v1/parser/FateParser.g4 @@ -48,9 +48,11 @@ options import tonkadur.fate.v1.lang.computation.*; import tonkadur.fate.v1.lang.computation.generic.ExtraComputation; + import tonkadur.fate.v1.lang.computation.generic.UserComputation; import tonkadur.fate.v1.lang.instruction.generic.SetValue; import tonkadur.fate.v1.lang.instruction.generic.ExtraInstruction; + import tonkadur.fate.v1.lang.instruction.generic.UserInstruction; } @members @@ -562,9 +564,10 @@ first_level_instruction ($variable_list.result).get_entries() ); - //PARSER.get_world().user_defined_instructions().add(new_sequence); PARSER.restore_local_variables_stack(previous_local_variables_stack); + UserInstruction.register(new_sequence); + RecurrentChecks.assert_has_user_content_prefix ( start_origin, @@ -607,13 +610,9 @@ first_level_instruction ($variable_list.result).get_entries(), ($computation.result) ); - /* - PARSER.get_world().user_defined_computations().add - ( - ($identifier.result), - new_sequence - ); - */ + + UserComputation.register(($identifier.result), computation); + RecurrentChecks.assert_has_user_content_prefix ( start_origin, diff --git a/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/Compiler.java b/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/Compiler.java index 7fee7f6..6e91184 100644 --- a/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/Compiler.java +++ b/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/Compiler.java @@ -42,6 +42,9 @@ public class Compiler // compiler.compile_types(fate_world); compiler.compile_variables(fate_world); + compiler.compile_user_instructions(fate_world); + compiler.compile_user_computations(fate_world); + compiler.compile_sequences(fate_world); compiler.compile_main_sequence(fate_world); @@ -141,8 +144,43 @@ public class Compiler fate_world.sequences().get_all() ) { - SequenceCompiler.compile(this, sequence); + SequenceCompiler.compile(this, sequence, ""); + } + } + + protected void compile_user_instructions + ( + final tonkadur.fate.v1.lang.World fate_world + ) + throws Throwable + { + for + ( + final tonkadur.fate.v1.lang.Sequence sequence: + tonkadur.fate.v1.lang.instruction.generic.UserInstruction.get_all_definitions() + ) + { + SequenceCompiler.compile(this, sequence, "User Instruction "); + } + } + + protected void compile_user_computations + ( + final tonkadur.fate.v1.lang.World fate_world + ) + throws Throwable + { + // TODO: implement. + /* + for + ( + final tonkadur.fate.v1.lang.Sequence sequence: + tonkadur.fate.v1.lang.computation.generic.UserComputation.get_all_definitions() + ) + { + SequenceCompiler.compile(this, sequence, "User Instruction "); } + */ } protected void compile_main_sequence 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 721f6d8..ac905d0 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 @@ -728,16 +728,23 @@ implements tonkadur.fate.v1.lang.meta.ComputationVisitor throws Throwable { final String out_label, in_label; + final List side_channel_parameters; final List parameters; final Register result_holder; final ComputationCompiler expr_compiler; final Type result_type; final String context_name; + final Register lambda_data_register; + final Address lambda_function_line_address; + int i; out_label = compiler.assembler().generate_label(""); in_label = compiler.assembler().generate_label(""); parameters = new ArrayList(); + side_channel_parameters = new ArrayList(); + + lambda_data_register = reserve(DictType.WILD); context_name = compiler.registers().create_stackable_context_name(); @@ -777,7 +784,18 @@ implements tonkadur.fate.v1.lang.meta.ComputationVisitor init_instructions ); - parameters.add(result_holder); + side_channel_parameters.add(result_holder); + side_channel_parameters.add(lambda_data_register); + + // TODO: read two params: + // - result holder + // - wild dict, where the real params are. + init_instructions.addAll + ( + compiler.registers().read_parameters(side_channel_parameters) + ); + + i = n.get_parameters().size() - 1; for (final tonkadur.fate.v1.lang.Variable param: n.get_parameters()) { @@ -794,12 +812,29 @@ implements tonkadur.fate.v1.lang.meta.ComputationVisitor parameters.add(r); compiler.registers().bind(param.get_name(), r); - } + init_instructions.add + ( + new SetValue + ( + r.get_address(), + new ValueOf + ( + new RelativeAddress + ( + new Address + ( + lambda_data_register.get_value(), + DictType.WILD + ), + Constant.string_value(Integer.toString(i)), + r.get_value().get_type() + ) + ) + ) + ); - init_instructions.addAll - ( - compiler.registers().read_parameters(parameters) - ); + --i; + } expr_compiler = new ComputationCompiler(compiler); @@ -846,7 +881,30 @@ implements tonkadur.fate.v1.lang.meta.ComputationVisitor compiler.registers().pop_context(); - result_as_computation = compiler.assembler().get_label_constant(in_label); + lambda_function_line_address = + new RelativeAddress + ( + lambda_data_register.get_address(), + Constant.string_value("l"), + Type.INT + ); + + init_instructions.add + ( + new Initialize(lambda_function_line_address, Type.INT) + ); + + init_instructions.add + ( + new SetValue + ( + lambda_function_line_address, + compiler.assembler().get_label_constant(in_label) + ) + ); + + result_as_computation = lambda_data_register.get_value(); + result_as_address = lambda_data_register.get_address(); } @Override diff --git a/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/SequenceCompiler.java b/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/SequenceCompiler.java index 6f3a83d..c10ae2a 100644 --- a/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/SequenceCompiler.java +++ b/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/SequenceCompiler.java @@ -20,7 +20,8 @@ public class SequenceCompiler public static void compile ( final Compiler compiler, - final tonkadur.fate.v1.lang.Sequence fate_sequence + final tonkadur.fate.v1.lang.Sequence fate_sequence, + final String name_prefix ) throws Throwable { @@ -29,25 +30,27 @@ public class SequenceCompiler final String end_of_sequence; final List to_be_cleaned; final InstructionCompiler ic; + final String name; init_instructions = new ArrayList(); parameters = new ArrayList(); to_be_cleaned = new ArrayList(); ic = new InstructionCompiler(compiler); + name = (name_prefix + fate_sequence.get_name()); end_of_sequence = compiler.assembler().generate_label(""); compiler.world().add_sequence_label ( - fate_sequence.get_name(), + name, (compiler.world().get_current_line() + 1) ); - compiler.assembler().add_fixed_name_label(fate_sequence.get_name()); + compiler.assembler().add_fixed_name_label(name); compiler.registers().create_stackable_context ( - fate_sequence.get_name(), + name, init_instructions ); @@ -56,24 +59,21 @@ public class SequenceCompiler new SetPC(compiler.assembler().get_label_constant(end_of_sequence)) ); - System.out.println("[D] Defining Context " + fate_sequence.get_name()); + System.out.println("[D] Defining Context " + name); init_instructions.add ( compiler.assembler().mark ( - fate_sequence.get_name(), + name, compiler.assembler().merge ( - compiler.registers().get_initialize_context_instructions - ( - fate_sequence.get_name() - ) + compiler.registers().get_initialize_context_instructions(name) ) ) ); - compiler.registers().push_context(fate_sequence.get_name()); + compiler.registers().push_context(name); for ( @@ -114,7 +114,6 @@ public class SequenceCompiler } */ - init_instructions.addAll ( compiler.registers().get_finalize_context_instructions() @@ -131,7 +130,6 @@ public class SequenceCompiler compiler.registers().get_leave_context_instructions() ); - compiler.registers().pop_context(); compiler.assembler().handle_adding_instruction diff --git a/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/computation/generic/AtReferenceCompiler.java b/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/computation/generic/AtReferenceCompiler.java index f840dbd..3c538f8 100644 --- a/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/computation/generic/AtReferenceCompiler.java +++ b/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/computation/generic/AtReferenceCompiler.java @@ -10,7 +10,6 @@ import tonkadur.wyrd.v1.compiler.fate.v1.ComputationCompiler; import tonkadur.wyrd.v1.compiler.fate.v1.computation.GenericComputationCompiler; - public class AtReferenceCompiler extends GenericComputationCompiler { public static Class get_target_class () diff --git a/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/computation/generic/FilterComputationCompiler.java b/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/computation/generic/FilterComputationCompiler.java index b2123f7..ecc8bc6 100644 --- a/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/computation/generic/FilterComputationCompiler.java +++ b/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/computation/generic/FilterComputationCompiler.java @@ -40,7 +40,6 @@ extends GenericComputationCompiler throws Throwable { final FilterComputation source; - final List params; final ComputationCompiler lambda_cc, in_collection_cc; final Register result; @@ -51,32 +50,10 @@ extends GenericComputationCompiler result_as_address = result.get_address(); result_as_computation = result.get_value(); - params = new ArrayList(); - - for - ( - final tonkadur.fate.v1.lang.meta.Computation p: - source.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); source.get_lambda_function().get_visited_by(lambda_cc); - + lambda_cc.generate_address(); assimilate(lambda_cc); in_collection_cc = new ComputationCompiler(compiler); @@ -101,9 +78,8 @@ extends GenericComputationCompiler ( compiler.registers(), compiler.assembler(), - lambda_cc.get_computation(), - result_as_address, - params + lambda_cc.get_address(), + result_as_address ) ); } diff --git a/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/computation/generic/FoldCompiler.java b/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/computation/generic/FoldCompiler.java index 9dc4106..551667a 100644 --- a/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/computation/generic/FoldCompiler.java +++ b/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/computation/generic/FoldCompiler.java @@ -40,7 +40,6 @@ extends GenericComputationCompiler throws Throwable { final Fold source; - final List params; final ComputationCompiler lambda_cc, in_collection_cc, default_cc; final Register result; @@ -51,28 +50,6 @@ extends GenericComputationCompiler result_as_address = result.get_address(); result_as_computation = result.get_value(); - params = new ArrayList(); - - for - ( - final tonkadur.fate.v1.lang.meta.Computation p: - source.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); source.get_initial_value().get_visited_by(default_cc); @@ -92,6 +69,7 @@ extends GenericComputationCompiler lambda_cc = new ComputationCompiler(compiler); source.get_lambda_function().get_visited_by(lambda_cc); + lambda_cc.generate_address(); assimilate(lambda_cc); @@ -107,11 +85,10 @@ extends GenericComputationCompiler ( compiler.registers(), compiler.assembler(), - lambda_cc.get_computation(), + lambda_cc.get_address(), result_as_address, in_collection_cc.get_address(), - source.is_foldl(), - params + source.is_foldl() ) ); } diff --git a/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/computation/generic/IndexedFilterComputationCompiler.java b/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/computation/generic/IndexedFilterComputationCompiler.java index 6ebcd62..3413b83 100644 --- a/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/computation/generic/IndexedFilterComputationCompiler.java +++ b/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/computation/generic/IndexedFilterComputationCompiler.java @@ -39,7 +39,6 @@ extends GenericComputationCompiler throws Throwable { final IndexedFilterComputation source; - final List params; final ComputationCompiler lambda_cc, in_collection_cc; final Register result; @@ -50,32 +49,12 @@ extends GenericComputationCompiler result_as_address = result.get_address(); result_as_computation = result.get_value(); - params = new ArrayList(); - - for - ( - final tonkadur.fate.v1.lang.meta.Computation p: - source.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); source.get_lambda_function().get_visited_by(lambda_cc); + lambda_cc.generate_address(); + assimilate(lambda_cc); in_collection_cc = new ComputationCompiler(compiler); @@ -100,9 +79,8 @@ extends GenericComputationCompiler ( compiler.registers(), compiler.assembler(), - lambda_cc.get_computation(), - result_as_address, - params + lambda_cc.get_address(), + result_as_address ) ); } diff --git a/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/computation/generic/IndexedMapComputationCompiler.java b/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/computation/generic/IndexedMapComputationCompiler.java index c5b5e3c..bf4bae8 100644 --- a/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/computation/generic/IndexedMapComputationCompiler.java +++ b/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/computation/generic/IndexedMapComputationCompiler.java @@ -40,7 +40,6 @@ extends GenericComputationCompiler throws Throwable { final IndexedMapComputation source; - final List params; final ComputationCompiler lambda_cc, in_collection_cc; final Register result; @@ -51,32 +50,12 @@ extends GenericComputationCompiler result_as_address = result.get_address(); result_as_computation = result.get_value(); - params = new ArrayList(); - - for - ( - final tonkadur.fate.v1.lang.meta.Computation p: - source.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); source.get_lambda_function().get_visited_by(lambda_cc); + lambda_cc.generate_address(); + assimilate(lambda_cc); in_collection_cc = new ComputationCompiler(compiler); @@ -91,14 +70,13 @@ extends GenericComputationCompiler ( compiler.registers(), compiler.assembler(), - lambda_cc.get_computation(), + lambda_cc.get_address(), in_collection_cc.get_address(), result_as_address, ( (tonkadur.fate.v1.lang.type.CollectionType) source.get_collection().get_type() - ).is_set(), - params + ).is_set() ) ); } diff --git a/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/computation/generic/IndexedMergeComputationCompiler.java b/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/computation/generic/IndexedMergeComputationCompiler.java index 3106a29..0138a7b 100644 --- a/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/computation/generic/IndexedMergeComputationCompiler.java +++ b/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/computation/generic/IndexedMergeComputationCompiler.java @@ -47,7 +47,6 @@ extends GenericComputationCompiler throws Throwable { final IndexedMergeComputation source; - final List params; final ComputationCompiler lambda_cc; final ComputationCompiler in_collection_a_cc, in_collection_b_cc; final Register result; @@ -59,32 +58,12 @@ extends GenericComputationCompiler result_as_address = result.get_address(); result_as_computation = result.get_value(); - params = new ArrayList(); - - for - ( - final tonkadur.fate.v1.lang.meta.Computation p: - source.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); source.get_lambda_function().get_visited_by(lambda_cc); + lambda_cc.generate_address(); + assimilate(lambda_cc); in_collection_a_cc = new ComputationCompiler(compiler); @@ -105,12 +84,11 @@ extends GenericComputationCompiler ( compiler.registers(), compiler.assembler(), - lambda_cc.get_computation(), + lambda_cc.get_address(), in_collection_a_cc.get_address(), in_collection_b_cc.get_address(), result_as_address, - source.to_set(), - params + source.to_set() ) ); } diff --git a/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/computation/generic/IndexedPartitionComputationCompiler.java b/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/computation/generic/IndexedPartitionComputationCompiler.java index 196ae37..10c4563 100644 --- a/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/computation/generic/IndexedPartitionComputationCompiler.java +++ b/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/computation/generic/IndexedPartitionComputationCompiler.java @@ -5,7 +5,6 @@ import java.util.ArrayList; import tonkadur.fate.v1.lang.computation.generic.IndexedPartitionComputation; - import tonkadur.wyrd.v1.lang.Register; import tonkadur.wyrd.v1.lang.instruction.SetValue; @@ -17,8 +16,8 @@ import tonkadur.wyrd.v1.lang.computation.RelativeAddress; import tonkadur.wyrd.v1.lang.meta.Computation; -import tonkadur.wyrd.v1.lang.type.Type; import tonkadur.wyrd.v1.lang.type.DictType; +import tonkadur.wyrd.v1.lang.type.Type; import tonkadur.wyrd.v1.compiler.fate.v1.Compiler; import tonkadur.wyrd.v1.compiler.fate.v1.TypeCompiler; @@ -46,7 +45,6 @@ extends GenericComputationCompiler throws Throwable { final IndexedPartitionComputation source; - final List params; final ComputationCompiler lambda_cc, in_collection_cc; final Address car_addr, cdr_addr; final Register result; @@ -58,32 +56,12 @@ extends GenericComputationCompiler result_as_address = result.get_address(); result_as_computation = result.get_value(); - params = new ArrayList(); - - for - ( - final tonkadur.fate.v1.lang.meta.Computation p: - source.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); source.get_lambda_function().get_visited_by(lambda_cc); + lambda_cc.generate_address(); + assimilate(lambda_cc); in_collection_cc = new ComputationCompiler(compiler); @@ -99,7 +77,7 @@ extends GenericComputationCompiler new RelativeAddress ( result_as_address, - new Constant(Type.STRING, "0"), + Constant.string_value("0"), in_collection_cc.get_computation().get_type() ); @@ -116,7 +94,7 @@ extends GenericComputationCompiler new RelativeAddress ( result_as_address, - new Constant(Type.STRING, "1"), + Constant.string_value("1"), in_collection_cc.get_computation().get_type() ); @@ -130,14 +108,13 @@ extends GenericComputationCompiler ( compiler.registers(), compiler.assembler(), - lambda_cc.get_computation(), + lambda_cc.get_address(), car_addr, cdr_addr, ( (tonkadur.fate.v1.lang.type.CollectionType) source.get_collection().get_type() - ).is_set(), - params + ).is_set() ) ); } diff --git a/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/computation/generic/IndexedSafeMergeComputationCompiler.java b/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/computation/generic/IndexedSafeMergeComputationCompiler.java index 97aabdd..4dcd5e4 100644 --- a/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/computation/generic/IndexedSafeMergeComputationCompiler.java +++ b/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/computation/generic/IndexedSafeMergeComputationCompiler.java @@ -39,7 +39,6 @@ extends GenericComputationCompiler throws Throwable { final IndexedSafeMergeComputation source; - final List params; final ComputationCompiler lambda_cc, default_a_cc, default_b_cc; final ComputationCompiler in_collection_a_cc, in_collection_b_cc; final Register result; @@ -51,32 +50,12 @@ extends GenericComputationCompiler result_as_address = result.get_address(); result_as_computation = result.get_value(); - params = new ArrayList(); - - for - ( - final tonkadur.fate.v1.lang.meta.Computation p: - source.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); source.get_lambda_function().get_visited_by(lambda_cc); + lambda_cc.generate_address(); + assimilate(lambda_cc); default_a_cc = new ComputationCompiler(compiler); @@ -113,14 +92,13 @@ extends GenericComputationCompiler ( compiler.registers(), compiler.assembler(), - lambda_cc.get_computation(), + lambda_cc.get_address(), default_a_cc.get_computation(), in_collection_a_cc.get_address(), default_b_cc.get_computation(), in_collection_b_cc.get_address(), result_as_address, - source.to_set(), - params + source.to_set() ) ); diff --git a/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/computation/generic/LambdaEvaluationCompiler.java b/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/computation/generic/LambdaEvaluationCompiler.java index fb74eb9..825491d 100644 --- a/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/computation/generic/LambdaEvaluationCompiler.java +++ b/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/computation/generic/LambdaEvaluationCompiler.java @@ -9,6 +9,8 @@ import tonkadur.wyrd.v1.lang.Register; import tonkadur.wyrd.v1.lang.meta.Computation; +import tonkadur.wyrd.v1.lang.type.DictType; + import tonkadur.wyrd.v1.lang.computation.Address; import tonkadur.wyrd.v1.compiler.fate.v1.Compiler; @@ -37,21 +39,22 @@ public class LambdaEvaluationCompiler extends GenericComputationCompiler throws Throwable { final LambdaEvaluation source; - final ComputationCompiler parent_cc; - final ComputationCompiler target_line_cc; + final ComputationCompiler lambda_cc; final List parameters; final Register result; source = (LambdaEvaluation) computation; parameters = new ArrayList(); - target_line_cc = new ComputationCompiler(compiler); + lambda_cc = new ComputationCompiler(compiler); + + source.get_lambda_function().get_visited_by(lambda_cc); - source.get_lambda_function().get_visited_by(target_line_cc); + lambda_cc.generate_address(); - assimilate(target_line_cc); + assimilate(lambda_cc); - result = reserve(TypeCompiler.compile(compiler, source.get_type())); + result = reserve(DictType.WILD); result_as_address = result.get_address(); result_as_computation = result.get_value(); @@ -79,7 +82,7 @@ public class LambdaEvaluationCompiler extends GenericComputationCompiler ( compiler.registers(), compiler.assembler(), - target_line_cc.get_computation(), + lambda_cc.get_address(), result_as_address, parameters ) diff --git a/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/computation/generic/MapComputationCompiler.java b/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/computation/generic/MapComputationCompiler.java index 459936f..7e98df9 100644 --- a/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/computation/generic/MapComputationCompiler.java +++ b/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/computation/generic/MapComputationCompiler.java @@ -37,7 +37,6 @@ extends GenericComputationCompiler throws Throwable { final MapComputation source; - final List params; final ComputationCompiler lambda_cc, in_collection_cc; final Register result; @@ -48,32 +47,12 @@ extends GenericComputationCompiler result_as_address = result.get_address(); result_as_computation = result.get_value(); - params = new ArrayList(); - - for - ( - final tonkadur.fate.v1.lang.meta.Computation p: - source.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); source.get_lambda_function().get_visited_by(lambda_cc); + lambda_cc.generate_address(); + assimilate(lambda_cc); in_collection_cc = new ComputationCompiler(compiler); @@ -88,14 +67,13 @@ extends GenericComputationCompiler ( compiler.registers(), compiler.assembler(), - lambda_cc.get_computation(), + lambda_cc.get_address(), in_collection_cc.get_address(), result_as_address, ( (tonkadur.fate.v1.lang.type.CollectionType) source.get_collection().get_type() - ).is_set(), - params + ).is_set() ) ); } diff --git a/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/computation/generic/MergeComputationCompiler.java b/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/computation/generic/MergeComputationCompiler.java index 116ce1e..2767364 100644 --- a/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/computation/generic/MergeComputationCompiler.java +++ b/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/computation/generic/MergeComputationCompiler.java @@ -37,7 +37,6 @@ extends GenericComputationCompiler throws Throwable { final MergeComputation source; - final List params; final ComputationCompiler lambda_cc; final ComputationCompiler in_collection_a_cc, in_collection_b_cc; final Register result; @@ -49,32 +48,12 @@ extends GenericComputationCompiler result_as_address = result.get_address(); result_as_computation = result.get_value(); - params = new ArrayList(); - - for - ( - final tonkadur.fate.v1.lang.meta.Computation p: - source.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); source.get_lambda_function().get_visited_by(lambda_cc); + lambda_cc.generate_address(); + assimilate(lambda_cc); in_collection_a_cc = new ComputationCompiler(compiler); @@ -95,12 +74,11 @@ extends GenericComputationCompiler ( compiler.registers(), compiler.assembler(), - lambda_cc.get_computation(), + lambda_cc.get_address(), in_collection_a_cc.get_address(), in_collection_b_cc.get_address(), result_as_address, - source.to_set(), - params + source.to_set() ) ); } diff --git a/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/computation/generic/PartialLambdaEvaluationCompiler.java b/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/computation/generic/PartialLambdaEvaluationCompiler.java new file mode 100644 index 0000000..8bf8a20 --- /dev/null +++ b/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/computation/generic/PartialLambdaEvaluationCompiler.java @@ -0,0 +1,100 @@ +package tonkadur.wyrd.v1.compiler.fate.v1.computation.generic; + +import java.util.List; +import java.util.ArrayList; + +import tonkadur.fate.v1.lang.computation.generic.PartialLambdaEvaluation; + +import tonkadur.fate.v1.lang.type.LambdaType; +import tonkadur.fate.v1.lang.type.Type; + +import tonkadur.wyrd.v1.lang.Register; + +import tonkadur.wyrd.v1.lang.type.DictType; + +import tonkadur.wyrd.v1.lang.meta.Computation; + +import tonkadur.wyrd.v1.lang.computation.Address; + +import tonkadur.wyrd.v1.compiler.fate.v1.Compiler; +import tonkadur.wyrd.v1.compiler.fate.v1.TypeCompiler; +import tonkadur.wyrd.v1.compiler.fate.v1.ComputationCompiler; + +import tonkadur.wyrd.v1.compiler.fate.v1.computation.GenericComputationCompiler; + +public class PartialLambdaEvaluationCompiler extends GenericComputationCompiler +{ + public static Class get_target_class () + { + return PartialLambdaEvaluation.class; + } + + public PartialLambdaEvaluationCompiler (final Compiler compiler) + { + super(compiler); + } + + public void compile + ( + final tonkadur.fate.v1.lang.computation.GenericComputation computation + ) + throws Throwable + { + final PartialLambdaEvaluation source; + final ComputationCompiler parent_lambda_cc; + final List parameters; + final Register result; + final int max_number_of_arguments; + + source = (PartialLambdaEvaluation) computation; + + parameters = new ArrayList(); + parent_lambda_cc = new ComputationCompiler(compiler); + + source.get_lambda_function().get_visited_by(parent_lambda_cc); + + parent_lambda_cc.generate_address(); + + assimilate(parent_lambda_cc); + + result = reserve(DictType.WILD); + + result_as_address = result.get_address(); + result_as_computation = result.get_value(); + + max_number_of_arguments = + ( + (LambdaType) source.get_lambda_function().get_type() + ).get_signature().size(); + + for + ( + final tonkadur.fate.v1.lang.meta.Computation param: + source.get_parameters() + ) + { + final ComputationCompiler cc; + + cc = new ComputationCompiler(compiler); + + param.get_visited_by(cc); + + assimilate(cc); + + parameters.add(cc.get_computation()); + } + + init_instructions.add + ( + tonkadur.wyrd.v1.compiler.util.AddParametersToLambda.generate + ( + compiler.registers(), + compiler.assembler(), + parent_lambda_cc.get_address(), + result_as_address, + parameters, + (max_number_of_arguments - parameters.size()) + ) + ); + } +} diff --git a/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/computation/generic/PartitionComputationCompiler.java b/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/computation/generic/PartitionComputationCompiler.java index d66c1dd..f6ab5e2 100644 --- a/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/computation/generic/PartitionComputationCompiler.java +++ b/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/computation/generic/PartitionComputationCompiler.java @@ -46,7 +46,6 @@ extends GenericComputationCompiler throws Throwable { final PartitionComputation source; - final List params; final ComputationCompiler lambda_cc, in_collection_cc; final Address car_addr, cdr_addr; final Register result; @@ -58,32 +57,12 @@ extends GenericComputationCompiler result_as_address = result.get_address(); result_as_computation = result.get_value(); - params = new ArrayList(); - - for - ( - final tonkadur.fate.v1.lang.meta.Computation p: - source.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); source.get_lambda_function().get_visited_by(lambda_cc); + lambda_cc.generate_address(); + assimilate(lambda_cc); in_collection_cc = new ComputationCompiler(compiler); @@ -99,7 +78,7 @@ extends GenericComputationCompiler new RelativeAddress ( result_as_address, - new Constant(Type.STRING, "0"), + Constant.string_value("0"), in_collection_cc.get_computation().get_type() ); @@ -116,7 +95,7 @@ extends GenericComputationCompiler new RelativeAddress ( result_as_address, - new Constant(Type.STRING, "1"), + Constant.string_value("1"), in_collection_cc.get_computation().get_type() ); @@ -130,14 +109,13 @@ extends GenericComputationCompiler ( compiler.registers(), compiler.assembler(), - lambda_cc.get_computation(), + lambda_cc.get_address(), car_addr, cdr_addr, ( (tonkadur.fate.v1.lang.type.CollectionType) source.get_collection().get_type() - ).is_set(), - params + ).is_set() ) ); } diff --git a/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/computation/generic/SafeMergeComputationCompiler.java b/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/computation/generic/SafeMergeComputationCompiler.java index 17673da..29162fe 100644 --- a/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/computation/generic/SafeMergeComputationCompiler.java +++ b/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/computation/generic/SafeMergeComputationCompiler.java @@ -37,7 +37,6 @@ extends GenericComputationCompiler throws Throwable { final SafeMergeComputation source; - final List params; final ComputationCompiler lambda_cc, default_a_cc, default_b_cc; final ComputationCompiler in_collection_a_cc, in_collection_b_cc; final Register result; @@ -49,32 +48,12 @@ extends GenericComputationCompiler result_as_address = result.get_address(); result_as_computation = result.get_value(); - params = new ArrayList(); - - for - ( - final tonkadur.fate.v1.lang.meta.Computation p: - source.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); source.get_lambda_function().get_visited_by(lambda_cc); + lambda_cc.generate_address(); + assimilate(lambda_cc); default_a_cc = new ComputationCompiler(compiler); @@ -111,16 +90,14 @@ extends GenericComputationCompiler ( compiler.registers(), compiler.assembler(), - lambda_cc.get_computation(), + lambda_cc.get_address(), default_a_cc.get_computation(), in_collection_a_cc.get_address(), default_b_cc.get_computation(), in_collection_b_cc.get_address(), result_as_address, - source.to_set(), - params + source.to_set() ) ); - } } diff --git a/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/computation/generic/SortComputationCompiler.java b/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/computation/generic/SortComputationCompiler.java index f4805e1..250c7e9 100644 --- a/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/computation/generic/SortComputationCompiler.java +++ b/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/computation/generic/SortComputationCompiler.java @@ -35,7 +35,6 @@ extends GenericComputationCompiler throws Throwable { final SortComputation source; - final List params; final ComputationCompiler lambda_cc, in_collection_cc; final Register result; @@ -46,32 +45,12 @@ extends GenericComputationCompiler result_as_address = result.get_address(); result_as_computation = result.get_value(); - params = new ArrayList(); - - for - ( - final tonkadur.fate.v1.lang.meta.Computation p: - source.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); source.get_lambda_function().get_visited_by(lambda_cc); + lambda_cc.generate_address(); + assimilate(lambda_cc); in_collection_cc = new ComputationCompiler(compiler); @@ -89,10 +68,9 @@ extends GenericComputationCompiler ( compiler.registers(), compiler.assembler(), - lambda_cc.get_computation(), + lambda_cc.get_address(), in_collection_cc.get_address(), - result_as_address, - params + result_as_address ) ); diff --git a/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/instruction/generic/FilterCompiler.java b/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/instruction/generic/FilterCompiler.java index a7e2035..eec5385 100644 --- a/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/instruction/generic/FilterCompiler.java +++ b/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/instruction/generic/FilterCompiler.java @@ -31,44 +31,16 @@ public class FilterCompiler extends GenericInstructionCompiler throws Throwable { final Filter source; - final List params; - final List param_cc_list; final ComputationCompiler lambda_cc, collection_cc; source = (Filter) instruction; - params = new ArrayList(); - param_cc_list = new ArrayList(); - - for - ( - final tonkadur.fate.v1.lang.meta.Computation p: - source.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); source.get_lambda_function().get_visited_by(lambda_cc); + lambda_cc.generate_address(); + if (lambda_cc.has_init()) { result.add(lambda_cc.get_init()); @@ -89,18 +61,12 @@ public class FilterCompiler extends GenericInstructionCompiler ( compiler.registers(), compiler.assembler(), - lambda_cc.get_computation(), - collection_cc.get_address(), - params + lambda_cc.get_address(), + collection_cc.get_address() ) ); lambda_cc.release_registers(result); collection_cc.release_registers(result); - - for (final ComputationCompiler cc: param_cc_list) - { - cc.release_registers(result); - } } } diff --git a/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/instruction/generic/IndexedFilterCompiler.java b/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/instruction/generic/IndexedFilterCompiler.java index d4e00a3..0ab19a9 100644 --- a/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/instruction/generic/IndexedFilterCompiler.java +++ b/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/instruction/generic/IndexedFilterCompiler.java @@ -31,44 +31,16 @@ public class IndexedFilterCompiler extends GenericInstructionCompiler throws Throwable { final IndexedFilter source; - final List params; - final List param_cc_list; final ComputationCompiler lambda_cc, collection_cc; source = (IndexedFilter) instruction; - params = new ArrayList(); - param_cc_list = new ArrayList(); - - for - ( - final tonkadur.fate.v1.lang.meta.Computation p: - source.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); source.get_lambda_function().get_visited_by(lambda_cc); + lambda_cc.generate_address(); + if (lambda_cc.has_init()) { result.add(lambda_cc.get_init()); @@ -89,18 +61,12 @@ public class IndexedFilterCompiler extends GenericInstructionCompiler ( compiler.registers(), compiler.assembler(), - lambda_cc.get_computation(), - collection_cc.get_address(), - params + lambda_cc.get_address(), + collection_cc.get_address() ) ); lambda_cc.release_registers(result); collection_cc.release_registers(result); - - for (final ComputationCompiler cc: param_cc_list) - { - cc.release_registers(result); - } } } diff --git a/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/instruction/generic/IndexedPartitionCompiler.java b/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/instruction/generic/IndexedPartitionCompiler.java index ebe8eb2..bda2914 100644 --- a/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/instruction/generic/IndexedPartitionCompiler.java +++ b/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/instruction/generic/IndexedPartitionCompiler.java @@ -31,44 +31,16 @@ public class IndexedPartitionCompiler extends GenericInstructionCompiler throws Throwable { final IndexedPartition source; - final List params; - final List param_cc_list; final ComputationCompiler lambda_cc, collection_in_cc, collection_out_cc; source = (IndexedPartition) instruction; - params = new ArrayList(); - param_cc_list = new ArrayList(); - - for - ( - final tonkadur.fate.v1.lang.meta.Computation p: - source.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); source.get_lambda_function().get_visited_by(lambda_cc); + lambda_cc.generate_address(); + if (lambda_cc.has_init()) { result.add(lambda_cc.get_init()); @@ -98,24 +70,18 @@ public class IndexedPartitionCompiler extends GenericInstructionCompiler ( compiler.registers(), compiler.assembler(), - lambda_cc.get_computation(), + lambda_cc.get_address(), collection_in_cc.get_address(), collection_out_cc.get_address(), ( (tonkadur.fate.v1.lang.type.CollectionType) source.get_collection_out().get_type() - ).is_set(), - params + ).is_set() ) ); lambda_cc.release_registers(result); collection_in_cc.release_registers(result); collection_out_cc.release_registers(result); - - for (final ComputationCompiler cc: param_cc_list) - { - cc.release_registers(result); - } } } diff --git a/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/instruction/generic/PartitionCompiler.java b/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/instruction/generic/PartitionCompiler.java index 602d89f..5818c5a 100644 --- a/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/instruction/generic/PartitionCompiler.java +++ b/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/instruction/generic/PartitionCompiler.java @@ -31,44 +31,16 @@ public class PartitionCompiler extends GenericInstructionCompiler throws Throwable { final Partition source; - final List params; - final List param_cc_list; final ComputationCompiler lambda_cc, collection_in_cc, collection_out_cc; source = (Partition) instruction; - params = new ArrayList(); - param_cc_list = new ArrayList(); - - for - ( - final tonkadur.fate.v1.lang.meta.Computation p: - source.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); source.get_lambda_function().get_visited_by(lambda_cc); + lambda_cc.generate_address(); + if (lambda_cc.has_init()) { result.add(lambda_cc.get_init()); @@ -98,24 +70,18 @@ public class PartitionCompiler extends GenericInstructionCompiler ( compiler.registers(), compiler.assembler(), - lambda_cc.get_computation(), + lambda_cc.get_address(), collection_in_cc.get_address(), collection_out_cc.get_address(), ( (tonkadur.fate.v1.lang.type.CollectionType) source.get_collection_out().get_type() - ).is_set(), - params + ).is_set() ) ); lambda_cc.release_registers(result); collection_in_cc.release_registers(result); collection_out_cc.release_registers(result); - - for (final ComputationCompiler cc: param_cc_list) - { - cc.release_registers(result); - } } } diff --git a/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/instruction/generic/SortCompiler.java b/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/instruction/generic/SortCompiler.java index f31f58e..00f9642 100644 --- a/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/instruction/generic/SortCompiler.java +++ b/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/instruction/generic/SortCompiler.java @@ -36,20 +36,17 @@ public class SortCompiler extends GenericInstructionCompiler { final Sort source; final ComputationCompiler lambda_cc; - final List params; - final List param_cc_list; final ComputationCompiler collection_cc; final Register sorted_result; source = (Sort) instruction; - params = new ArrayList(); - param_cc_list = new ArrayList(); - lambda_cc = new ComputationCompiler(compiler); source.get_lambda_function().get_visited_by(lambda_cc); + lambda_cc.generate_address(); + if (lambda_cc.has_init()) { result.add(lambda_cc.get_init()); @@ -64,31 +61,6 @@ public class SortCompiler extends GenericInstructionCompiler result.add(collection_cc.get_init()); } - for - ( - final tonkadur.fate.v1.lang.meta.Computation p: - source.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()); - } - sorted_result = compiler.registers().reserve ( @@ -102,10 +74,9 @@ public class SortCompiler extends GenericInstructionCompiler ( compiler.registers(), compiler.assembler(), - lambda_cc.get_computation(), + lambda_cc.get_address(), collection_cc.get_address(), - sorted_result.get_address(), - params + sorted_result.get_address() ) ); @@ -117,10 +88,5 @@ public class SortCompiler extends GenericInstructionCompiler compiler.registers().release(sorted_result, result); collection_cc.release_registers(result); - - for (final ComputationCompiler cc: param_cc_list) - { - cc.release_registers(result); - } } } diff --git a/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/instruction/generic/UserInstructionCompiler.java b/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/instruction/generic/UserInstructionCompiler.java new file mode 100644 index 0000000..674b7b4 --- /dev/null +++ b/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/instruction/generic/UserInstructionCompiler.java @@ -0,0 +1,39 @@ +package tonkadur.wyrd.v1.compiler.fate.v1.instruction.generic; + +import java.util.List; +import java.util.ArrayList; + +import tonkadur.fate.v1.lang.instruction.generic.UserInstruction; + +import tonkadur.wyrd.v1.lang.meta.Computation; + +import tonkadur.wyrd.v1.compiler.fate.v1.Compiler; +import tonkadur.wyrd.v1.compiler.fate.v1.ComputationCompiler; + +import tonkadur.wyrd.v1.compiler.fate.v1.instruction.GenericInstructionCompiler; + +public class UserInstructionCompiler extends GenericInstructionCompiler +{ + public static Class get_target_class () + { + return UserInstruction.class; + } + + public UserInstructionCompiler (final Compiler compiler) + { + super(compiler); + } + + /* + * Fate: (event_call c0 ... cn) + * + * Wyrd (event_call c0 ... cn) + */ + public void compile + ( + final tonkadur.fate.v1.lang.instruction.GenericInstruction instruction + ) + throws Throwable + { + } +} diff --git a/src/core/src/tonkadur/wyrd/v1/compiler/util/AddParametersToLambda.java b/src/core/src/tonkadur/wyrd/v1/compiler/util/AddParametersToLambda.java new file mode 100644 index 0000000..ffed045 --- /dev/null +++ b/src/core/src/tonkadur/wyrd/v1/compiler/util/AddParametersToLambda.java @@ -0,0 +1,78 @@ +package tonkadur.wyrd.v1.compiler.util; + +import java.util.List; +import java.util.ArrayList; + +import tonkadur.wyrd.v1.lang.meta.Instruction; +import tonkadur.wyrd.v1.lang.meta.Computation; + +import tonkadur.wyrd.v1.lang.computation.Address; +import tonkadur.wyrd.v1.lang.computation.Constant; +import tonkadur.wyrd.v1.lang.computation.ValueOf; +import tonkadur.wyrd.v1.lang.computation.RelativeAddress; + +import tonkadur.wyrd.v1.lang.instruction.SetValue; +import tonkadur.wyrd.v1.lang.instruction.Initialize; + +import tonkadur.wyrd.v1.compiler.util.registers.RegisterManager; + +public class AddParametersToLambda +{ + /* Utility Class */ + private AddParametersToLambda () {} + + public static Instruction generate + ( + final RegisterManager registers, + final InstructionManager assembler, + final Address parent_lambda, + final Address result_storage, + final List parameters, + final int missing_params_count + ) + { + final List result; + final int parameters_size; + + result = new ArrayList(); + parameters_size = parameters.size(); + + result.add(new SetValue(result_storage, new ValueOf(parent_lambda))); + + for (int i = 0; i < parameters_size; ++i) + { + final Computation param; + final Address param_storage_address; + + param = parameters.get(i); + + param_storage_address = + new RelativeAddress + ( + result_storage, + Constant.string_value + ( + Integer.toString + ( + ((parameters_size - 1) - i) + + missing_params_count + ) + ), + param.get_type() + ); + + result.add + ( + new Initialize + ( + param_storage_address, + param.get_type() + ) + ); + + result.add(new SetValue(param_storage_address, param)); + } + + return assembler.merge(result); + } +} diff --git a/src/core/src/tonkadur/wyrd/v1/compiler/util/BinarySearch.java b/src/core/src/tonkadur/wyrd/v1/compiler/util/BinarySearch.java index 00b80e5..656e816 100644 --- a/src/core/src/tonkadur/wyrd/v1/compiler/util/BinarySearch.java +++ b/src/core/src/tonkadur/wyrd/v1/compiler/util/BinarySearch.java @@ -268,13 +268,12 @@ public class BinarySearch ( final RegisterManager registers, final InstructionManager assembler, - final Computation sort_fun, + final Address sort_fun, final Computation target, final Computation collection_size, final Address collection, final Address result_was_found, - final Address result_index, - final List sort_fun_extra_params + final Address result_index ) { final List result; @@ -299,7 +298,6 @@ public class BinarySearch collection, result_was_found, result_index, - sort_fun_extra_params, bot, top, midval, @@ -319,13 +317,12 @@ public class BinarySearch ( final RegisterManager registers, final InstructionManager assembler, - final Computation sort_fun, + final Address sort_fun, final Computation target, final Computation collection_size, final Address collection, final Address result_was_found, final Address result_index, - final List sort_fun_extra_params, final Register bot, final Register top, final Register midval, @@ -335,10 +332,13 @@ public class BinarySearch final List result, while_body; final Type element_type; final Computation value_of_result_index; + final List lambda_params; result = new ArrayList(); while_body = new ArrayList(); + lambda_params = new ArrayList(); + element_type = target.get_type(); value_of_result_index = new ValueOf(result_index); @@ -413,8 +413,8 @@ public class BinarySearch ) ); - sort_fun_extra_params.add(0, target); - sort_fun_extra_params.add(0, midval.get_value()); + lambda_params.add(midval.get_value()); + lambda_params.add(target); while_body.add ( @@ -424,7 +424,7 @@ public class BinarySearch assembler, sort_fun, cmp.get_address(), - sort_fun_extra_params + lambda_params ) ); 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 6617688..2b1d31d 100644 --- a/src/core/src/tonkadur/wyrd/v1/compiler/util/FilterLambda.java +++ b/src/core/src/tonkadur/wyrd/v1/compiler/util/FilterLambda.java @@ -33,18 +33,20 @@ public class FilterLambda ( final RegisterManager registers, final InstructionManager assembler, - final Computation lambda, - final Address collection, - final List extra_params + final Address lambda, + final Address collection ) { final List result, while_body, remove_instructions; final Register iterator, index_storage, collection_size, storage; + final List lambda_params; result = new ArrayList(); while_body = new ArrayList(); remove_instructions = new ArrayList(); + lambda_params = new ArrayList(); + iterator = registers.reserve(Type.INT, result); index_storage = registers.reserve(Type.INT, result); collection_size = registers.reserve(Type.INT, result); @@ -56,9 +58,8 @@ public class FilterLambda new SetValue(collection_size.get_address(), new Size(collection)) ); - extra_params.add + lambda_params.add ( - 0, new ValueOf ( new RelativeAddress @@ -107,7 +108,7 @@ public class FilterLambda * be a set. */ storage.get_address(), - extra_params + lambda_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 7e6a225..b4a17aa 100644 --- a/src/core/src/tonkadur/wyrd/v1/compiler/util/Fold.java +++ b/src/core/src/tonkadur/wyrd/v1/compiler/util/Fold.java @@ -29,25 +29,26 @@ public class Fold /* Utility Class */ private Fold () {} - /* Uses Durstenfeld's shuffling algorithm */ public static Instruction generate ( final RegisterManager registers, final InstructionManager assembler, - final Computation lambda, + final Address lambda, final Address storage_address, final Address collection_in, - final boolean is_foldl, - final List extra_params + final boolean is_foldl ) { final List result, while_body; final Register iterator, collection_in_size; final Computation start_point, end_point, condition, increment; + final List lambda_params; result = new ArrayList(); while_body = new ArrayList(); + lambda_params = new ArrayList(); + iterator = registers.reserve(Type.INT, result); collection_in_size = registers.reserve(Type.INT, result); @@ -80,9 +81,9 @@ public class Fold result.add(new SetValue(iterator.get_address(), start_point)); - extra_params.add + lambda_params.add(new ValueOf(storage_address)); + lambda_params.add ( - 0, new ValueOf ( new RelativeAddress @@ -95,7 +96,6 @@ public class Fold ) ) ); - extra_params.add(0, new ValueOf(storage_address)); while_body.add ( @@ -108,7 +108,7 @@ public class Fold * be a set. */ storage_address, - extra_params + lambda_params ) ); diff --git a/src/core/src/tonkadur/wyrd/v1/compiler/util/IndexedFilterLambda.java b/src/core/src/tonkadur/wyrd/v1/compiler/util/IndexedFilterLambda.java index 620f06b..09e9851 100644 --- a/src/core/src/tonkadur/wyrd/v1/compiler/util/IndexedFilterLambda.java +++ b/src/core/src/tonkadur/wyrd/v1/compiler/util/IndexedFilterLambda.java @@ -29,24 +29,25 @@ public class IndexedFilterLambda /* Utility Class */ private IndexedFilterLambda () {} - /* Uses Durstenfeld's shuffling algorithm */ public static Instruction generate ( final RegisterManager registers, final InstructionManager assembler, - final Computation lambda, - final Address collection, - final List extra_params + final Address lambda, + final Address collection ) { final List result, while_body, remove_instructions; final Register iterator, index_storage, collection_size, storage; final Register index_counter; + final List lambda_params; result = new ArrayList(); while_body = new ArrayList(); remove_instructions = new ArrayList(); + lambda_params = new ArrayList(); + iterator = registers.reserve(Type.INT, result); index_counter = registers.reserve(Type.INT, result); index_storage = registers.reserve(Type.INT, result); @@ -60,9 +61,9 @@ public class IndexedFilterLambda new SetValue(collection_size.get_address(), new Size(collection)) ); - extra_params.add + lambda_params.add(index_counter.get_value()); + lambda_params.add ( - 0, new ValueOf ( new RelativeAddress @@ -74,7 +75,6 @@ public class IndexedFilterLambda ) ); - extra_params.add(0, index_counter.get_value()); remove_instructions.add ( @@ -113,7 +113,7 @@ public class IndexedFilterLambda * be a set. */ storage.get_address(), - extra_params + lambda_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 869b049..ee589e4 100644 --- a/src/core/src/tonkadur/wyrd/v1/compiler/util/IndexedMapLambda.java +++ b/src/core/src/tonkadur/wyrd/v1/compiler/util/IndexedMapLambda.java @@ -29,24 +29,25 @@ public class IndexedMapLambda /* Utility Class */ private IndexedMapLambda () {} - /* Uses Durstenfeld's shuffling algorithm */ public static Instruction generate ( final RegisterManager registers, final InstructionManager assembler, - final Computation lambda, + final Address lambda, final Address collection_in, final Address collection_out, - final boolean to_set, - final List extra_params + final boolean to_set ) { final List result, while_body; final Register iterator, collection_in_size, storage; + final List lambda_params; result = new ArrayList(); while_body = new ArrayList(); + lambda_params = new ArrayList(); + iterator = registers.reserve(Type.INT, result); collection_in_size = registers.reserve(Type.INT, result); storage = @@ -67,9 +68,9 @@ public class IndexedMapLambda ); - extra_params.add + lambda_params.add(iterator.get_value()); + lambda_params.add ( - 0, new ValueOf ( new RelativeAddress @@ -81,7 +82,6 @@ public class IndexedMapLambda ) ); - extra_params.add(0, iterator.get_value()); while_body.add ( @@ -94,7 +94,7 @@ public class IndexedMapLambda * be a set. */ storage.get_address(), - extra_params + lambda_params ) ); diff --git a/src/core/src/tonkadur/wyrd/v1/compiler/util/IndexedMergeLambda.java b/src/core/src/tonkadur/wyrd/v1/compiler/util/IndexedMergeLambda.java index 818fde6..7406ad7 100644 --- a/src/core/src/tonkadur/wyrd/v1/compiler/util/IndexedMergeLambda.java +++ b/src/core/src/tonkadur/wyrd/v1/compiler/util/IndexedMergeLambda.java @@ -34,21 +34,23 @@ public class IndexedMergeLambda ( final RegisterManager registers, final InstructionManager assembler, - final Computation lambda, + final Address lambda, final Address collection_in_a, final Address collection_in_b, final Address collection_out, - final boolean to_set, - final List extra_params + final boolean to_set ) { final List result, while_body; final Register iterator, collection_in_size, storage; final Register collection_in_b_size; + final List lambda_params; result = new ArrayList(); while_body = new ArrayList(); + lambda_params = new ArrayList(); + iterator = registers.reserve(Type.INT, result); collection_in_size = registers.reserve(Type.INT, result); collection_in_b_size = registers.reserve(Type.INT, result); @@ -98,36 +100,33 @@ public class IndexedMergeLambda ); - extra_params.add + + lambda_params.add(iterator.get_value()); + lambda_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() ) ) ); - - extra_params.add + lambda_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() ) ) ); - extra_params.add(0, iterator.get_value()); - while_body.add ( LambdaEvaluation.generate @@ -139,7 +138,7 @@ public class IndexedMergeLambda * be a set. */ storage.get_address(), - extra_params + lambda_params ) ); @@ -191,26 +190,28 @@ public class IndexedMergeLambda ( final RegisterManager registers, final InstructionManager assembler, - final Computation lambda, + final Address lambda, final Computation default_a, final Address collection_in_a, final Computation default_b, final Address collection_in_b, final Address collection_out, - final boolean to_set, - final List extra_params + final boolean to_set ) { final List result, while_body, oob_a_body, oob_b_body; final Register iterator_a, iterator_b, oob_a, oob_b; final Register collection_a_size, collection_b_size; final Register storage; + final List lambda_params; result = new ArrayList(); while_body = new ArrayList(); oob_a_body = new ArrayList(); oob_b_body = new ArrayList(); + lambda_params = new ArrayList(); + iterator_a = registers.reserve(Type.INT, result); iterator_b = registers.reserve(Type.INT, result); @@ -274,52 +275,52 @@ public class IndexedMergeLambda ) ); - extra_params.add + + + lambda_params.add(iterator_a.get_value()); + + lambda_params.add ( - 0, new IfElseComputation ( - oob_b.get_value(), - default_b, + oob_a.get_value(), + default_a, new ValueOf ( new RelativeAddress ( - collection_in_b, - new Cast(iterator_b.get_value(), Type.STRING), + collection_in_a, + new Cast(iterator_a.get_value(), Type.STRING), ( - (MapType) collection_in_b.get_target_type() + (MapType) collection_in_a.get_target_type() ).get_member_type() ) ) ) ); - extra_params.add(0, iterator_b.get_value()); + lambda_params.add(iterator_b.get_value()); - extra_params.add + lambda_params.add ( - 0, new IfElseComputation ( - oob_a.get_value(), - default_a, + oob_b.get_value(), + default_b, new ValueOf ( new RelativeAddress ( - collection_in_a, - new Cast(iterator_a.get_value(), Type.STRING), + collection_in_b, + new Cast(iterator_b.get_value(), Type.STRING), ( - (MapType) collection_in_a.get_target_type() + (MapType) collection_in_b.get_target_type() ).get_member_type() ) ) ) ); - extra_params.add(0, iterator_a.get_value()); - while_body.add ( LambdaEvaluation.generate @@ -331,7 +332,7 @@ public class IndexedMergeLambda * be a set. */ storage.get_address(), - extra_params + lambda_params ) ); diff --git a/src/core/src/tonkadur/wyrd/v1/compiler/util/IndexedPartitionLambda.java b/src/core/src/tonkadur/wyrd/v1/compiler/util/IndexedPartitionLambda.java index 8bd2c74..eea0fef 100644 --- a/src/core/src/tonkadur/wyrd/v1/compiler/util/IndexedPartitionLambda.java +++ b/src/core/src/tonkadur/wyrd/v1/compiler/util/IndexedPartitionLambda.java @@ -34,21 +34,23 @@ public class IndexedPartitionLambda ( final RegisterManager registers, final InstructionManager assembler, - final Computation lambda, + final Address lambda, final Address collection_in, final Address collection_out, - final boolean to_set, - final List extra_params + final boolean to_set ) { final List result, while_body, remove_instructions; final Register iterator, index_storage, collection_size, storage; final Computation iterator_target; + final List lambda_params; result = new ArrayList(); while_body = new ArrayList(); remove_instructions = new ArrayList(); + lambda_params = new ArrayList(); + iterator = registers.reserve(Type.INT, result); index_storage = registers.reserve(Type.INT, result); collection_size = registers.reserve(Type.INT, result); @@ -71,8 +73,8 @@ public class IndexedPartitionLambda new SetValue(collection_size.get_address(), new Size(collection_in)) ); - extra_params.add(0, iterator_target); - extra_params.add(0, iterator.get_value()); + lambda_params.add(0, iterator.get_value()); + lambda_params.add(0, iterator_target); remove_instructions.add ( @@ -123,7 +125,7 @@ public class IndexedPartitionLambda * be a set. */ storage.get_address(), - extra_params + lambda_params ) ); diff --git a/src/core/src/tonkadur/wyrd/v1/compiler/util/LambdaEvaluation.java b/src/core/src/tonkadur/wyrd/v1/compiler/util/LambdaEvaluation.java index 976c60e..00341bf 100644 --- a/src/core/src/tonkadur/wyrd/v1/compiler/util/LambdaEvaluation.java +++ b/src/core/src/tonkadur/wyrd/v1/compiler/util/LambdaEvaluation.java @@ -5,10 +5,19 @@ import java.util.ArrayList; import tonkadur.wyrd.v1.lang.meta.Instruction; import tonkadur.wyrd.v1.lang.meta.Computation; + import tonkadur.wyrd.v1.lang.computation.Address; +import tonkadur.wyrd.v1.lang.computation.Constant; +import tonkadur.wyrd.v1.lang.computation.RelativeAddress; +import tonkadur.wyrd.v1.lang.computation.ValueOf; import tonkadur.wyrd.v1.lang.instruction.SetValue; +import tonkadur.wyrd.v1.lang.type.DictType; +import tonkadur.wyrd.v1.lang.type.Type; + +import tonkadur.wyrd.v1.lang.Register; + import tonkadur.wyrd.v1.compiler.util.registers.RegisterManager; public class LambdaEvaluation @@ -16,26 +25,57 @@ public class LambdaEvaluation /* Utility Class */ private LambdaEvaluation () {} - /* Uses Durstenfeld's shuffling algorithm */ public static Instruction generate ( final RegisterManager registers, final InstructionManager assembler, - final Computation lambda_function, + final Address lambda_function, final Address result_storage, final List parameters ) { final List result; final String return_to_label; + final int invokation_parameters_count; + final Computation lambda_line; + final List side_channel_params; + final Register lambda_data_storage; + + lambda_line = + new ValueOf + ( + new RelativeAddress + ( + lambda_function, + Constant.string_value("l"), + Type.INT + ) + ); result = new ArrayList(); + side_channel_params = new ArrayList(); + + lambda_data_storage = registers.reserve(DictType.WILD, result); return_to_label = assembler.generate_label(""); - parameters.add(0, result_storage); + result.add + ( + AddParametersToLambda.generate + ( + registers, + assembler, + lambda_function, + lambda_data_storage.get_address(), + parameters, + 0 + ) + ); + + side_channel_params.add(result_storage); + side_channel_params.add(lambda_data_storage.get_address()); - result.addAll(registers.store_parameters(parameters)); + result.addAll(registers.store_parameters(side_channel_params)); result.add ( @@ -45,7 +85,7 @@ public class LambdaEvaluation ( registers.get_visit_context_instructions ( - lambda_function, + lambda_line, assembler.get_label_constant(return_to_label) ) ), @@ -53,6 +93,8 @@ public class LambdaEvaluation ) ); + registers.release(lambda_data_storage, result); + return assembler.merge(result); } } 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 0b02130..f3642ff 100644 --- a/src/core/src/tonkadur/wyrd/v1/compiler/util/MapLambda.java +++ b/src/core/src/tonkadur/wyrd/v1/compiler/util/MapLambda.java @@ -34,19 +34,21 @@ public class MapLambda ( final RegisterManager registers, final InstructionManager assembler, - final Computation lambda, + final Address lambda, final Address collection_in, final Address collection_out, - final boolean to_set, - final List extra_params + final boolean to_set ) { final List result, while_body; final Register iterator, collection_in_size, storage; + final List lambda_params; result = new ArrayList(); while_body = new ArrayList(); + lambda_params = new ArrayList(); + iterator = registers.reserve(Type.INT, result); collection_in_size = registers.reserve(Type.INT, result); storage = @@ -66,9 +68,8 @@ public class MapLambda ) ); - extra_params.add + lambda_params.add ( - 0, new ValueOf ( new RelativeAddress @@ -93,7 +94,7 @@ public class MapLambda * be a set. */ storage.get_address(), - extra_params + lambda_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 3cbed3d..b8a88a6 100644 --- a/src/core/src/tonkadur/wyrd/v1/compiler/util/MergeLambda.java +++ b/src/core/src/tonkadur/wyrd/v1/compiler/util/MergeLambda.java @@ -34,21 +34,23 @@ public class MergeLambda ( final RegisterManager registers, final InstructionManager assembler, - final Computation lambda, + final Address lambda, final Address collection_in_a, final Address collection_in_b, final Address collection_out, - final boolean to_set, - final List extra_params + final boolean to_set ) { final List result, while_body; final Register iterator, collection_in_size, storage; final Register collection_in_b_size; + final List lambda_params; result = new ArrayList(); while_body = new ArrayList(); + lambda_params = new ArrayList(); + iterator = registers.reserve(Type.INT, result); collection_in_size = registers.reserve(Type.INT, result); collection_in_b_size = registers.reserve(Type.INT, result); @@ -97,30 +99,28 @@ public class MergeLambda ) ); - extra_params.add + lambda_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() ) ) ); - extra_params.add + lambda_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() ) ) ); @@ -136,7 +136,7 @@ public class MergeLambda * be a set. */ storage.get_address(), - extra_params + lambda_params ) ); @@ -188,24 +188,26 @@ public class MergeLambda ( final RegisterManager registers, final InstructionManager assembler, - final Computation lambda, + final Address lambda, final Computation default_a, final Address collection_in_a, final Computation default_b, final Address collection_in_b, final Address collection_out, - final boolean to_set, - final List extra_params + final boolean to_set ) { final List result, while_body; final Register iterator_a, iterator_b; final Register collection_a_size, collection_b_size; final Register storage; + final List lambda_params; result = new ArrayList(); while_body = new ArrayList(); + lambda_params = new ArrayList(); + iterator_a = registers.reserve(Type.INT, result); iterator_b = registers.reserve(Type.INT, result); @@ -240,53 +242,52 @@ public class MergeLambda ) ); - extra_params.add + + lambda_params.add ( - 0, new IfElseComputation ( Operation.less_than ( - iterator_b.get_value(), - collection_b_size.get_value() + iterator_a.get_value(), + collection_a_size.get_value() ), new ValueOf ( new RelativeAddress ( - collection_in_b, - new Cast(iterator_b.get_value(), Type.STRING), + collection_in_a, + new Cast(iterator_a.get_value(), Type.STRING), ( - (MapType) collection_in_b.get_target_type() + (MapType) collection_in_a.get_target_type() ).get_member_type() ) ), - default_b + default_a ) ); - extra_params.add + lambda_params.add ( - 0, new IfElseComputation ( Operation.less_than ( - iterator_a.get_value(), - collection_a_size.get_value() + iterator_b.get_value(), + collection_b_size.get_value() ), new ValueOf ( new RelativeAddress ( - collection_in_a, - new Cast(iterator_a.get_value(), Type.STRING), + collection_in_b, + new Cast(iterator_b.get_value(), Type.STRING), ( - (MapType) collection_in_a.get_target_type() + (MapType) collection_in_b.get_target_type() ).get_member_type() ) ), - default_a + default_b ) ); @@ -301,7 +302,7 @@ public class MergeLambda * be a set. */ storage.get_address(), - extra_params + lambda_params ) ); diff --git a/src/core/src/tonkadur/wyrd/v1/compiler/util/PartitionLambda.java b/src/core/src/tonkadur/wyrd/v1/compiler/util/PartitionLambda.java index 706aee2..8d40f49 100644 --- a/src/core/src/tonkadur/wyrd/v1/compiler/util/PartitionLambda.java +++ b/src/core/src/tonkadur/wyrd/v1/compiler/util/PartitionLambda.java @@ -29,26 +29,27 @@ public class PartitionLambda /* Utility Class */ private PartitionLambda () {} - /* Uses Durstenfeld's shuffling algorithm */ public static Instruction generate ( final RegisterManager registers, final InstructionManager assembler, - final Computation lambda, + final Address lambda, final Address collection_in, final Address collection_out, - final boolean to_set, - final List extra_params + final boolean to_set ) { final List result, while_body, remove_instructions; final Register iterator, index_storage, collection_size, storage; final Computation iterator_target; + final List lambda_params; result = new ArrayList(); while_body = new ArrayList(); remove_instructions = new ArrayList(); + lambda_params = new ArrayList(); + iterator = registers.reserve(Type.INT, result); index_storage = registers.reserve(Type.INT, result); collection_size = registers.reserve(Type.INT, result); @@ -71,7 +72,7 @@ public class PartitionLambda new SetValue(collection_size.get_address(), new Size(collection_in)) ); - extra_params.add(0, iterator_target); + lambda_params.add(iterator_target); remove_instructions.add ( @@ -122,7 +123,7 @@ public class PartitionLambda * be a set. */ storage.get_address(), - extra_params + lambda_params ) ); diff --git a/src/core/src/tonkadur/wyrd/v1/compiler/util/Sort.java b/src/core/src/tonkadur/wyrd/v1/compiler/util/Sort.java index 6a67389..a6dfa5f 100644 --- a/src/core/src/tonkadur/wyrd/v1/compiler/util/Sort.java +++ b/src/core/src/tonkadur/wyrd/v1/compiler/util/Sort.java @@ -34,10 +34,9 @@ public class Sort ( final RegisterManager registers, final InstructionManager assembler, - final Computation lambda_fun, + final Address lambda_fun, final Address collection, - final Address sorted_result_holder, - final List extra_params + final Address sorted_result_holder ) { final Type element_type; @@ -102,7 +101,6 @@ public class Sort sorted_result_holder, result_was_found.get_address(), result_index.get_address(), - extra_params, bot, top, midval, diff --git a/src/core/src/tonkadur/wyrd/v1/lang/computation/Constant.java b/src/core/src/tonkadur/wyrd/v1/lang/computation/Constant.java index c0c6778..5467669 100644 --- a/src/core/src/tonkadur/wyrd/v1/lang/computation/Constant.java +++ b/src/core/src/tonkadur/wyrd/v1/lang/computation/Constant.java @@ -38,6 +38,26 @@ public class Constant extends Computation this.as_string = as_string; } + public static Constant string_value (final String s) + { + return new Constant(Type.STRING, s); + } + + public static Constant integer_value (final int s) + { + return new Constant(Type.INT, Integer.toString(s)); + } + + public static Constant boolean_value (final boolean s) + { + return s ? TRUE : FALSE; + } + + public static Constant float_value (final float s) + { + return new Constant(Type.FLOAT, Float.toString(s)); + } + /**** Accessors ************************************************************/ public String get_as_string () { -- cgit v1.2.3-70-g09d2