summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorNathanael Sensfelder <SpamShield0@MultiAgentSystems.org>2021-10-22 11:33:02 +0200
committerNathanael Sensfelder <SpamShield0@MultiAgentSystems.org>2021-10-22 11:33:02 +0200
commit87b3ce9b51499ac51027fcdd5cd971a16e5e844a (patch)
tree0914b660c58ac496529db3c921da5727ec0685ae /src
parentb6ea4c2effe4256f415175de544d4b5c631ea451 (diff)
Adds support for partial lambdas.
Diffstat (limited to 'src')
-rw-r--r--src/core/src/tonkadur/fate/v1/lang/computation/generic/FilterComputation.java29
-rw-r--r--src/core/src/tonkadur/fate/v1/lang/computation/generic/Fold.java26
-rw-r--r--src/core/src/tonkadur/fate/v1/lang/computation/generic/IndexedFilterComputation.java30
-rw-r--r--src/core/src/tonkadur/fate/v1/lang/computation/generic/IndexedMapComputation.java26
-rw-r--r--src/core/src/tonkadur/fate/v1/lang/computation/generic/IndexedMergeComputation.java28
-rw-r--r--src/core/src/tonkadur/fate/v1/lang/computation/generic/IndexedPartitionComputation.java26
-rw-r--r--src/core/src/tonkadur/fate/v1/lang/computation/generic/IndexedSafeMergeComputation.java27
-rw-r--r--src/core/src/tonkadur/fate/v1/lang/computation/generic/LambdaEvaluation.java3
-rw-r--r--src/core/src/tonkadur/fate/v1/lang/computation/generic/MapComputation.java26
-rw-r--r--src/core/src/tonkadur/fate/v1/lang/computation/generic/MergeComputation.java28
-rw-r--r--src/core/src/tonkadur/fate/v1/lang/computation/generic/PartialLambdaEvaluation.java166
-rw-r--r--src/core/src/tonkadur/fate/v1/lang/computation/generic/PartitionComputation.java26
-rw-r--r--src/core/src/tonkadur/fate/v1/lang/computation/generic/SafeMergeComputation.java33
-rw-r--r--src/core/src/tonkadur/fate/v1/lang/computation/generic/SortComputation.java30
-rw-r--r--src/core/src/tonkadur/fate/v1/lang/computation/generic/SubListComputation.java2
-rw-r--r--src/core/src/tonkadur/fate/v1/lang/instruction/generic/Filter.java29
-rw-r--r--src/core/src/tonkadur/fate/v1/lang/instruction/generic/IndexedFilter.java32
-rw-r--r--src/core/src/tonkadur/fate/v1/lang/instruction/generic/IndexedPartition.java32
-rw-r--r--src/core/src/tonkadur/fate/v1/lang/instruction/generic/Partition.java32
-rw-r--r--src/core/src/tonkadur/fate/v1/lang/instruction/generic/Sort.java29
-rw-r--r--src/core/src/tonkadur/fate/v1/lang/instruction/generic/UserInstruction.java17
-rw-r--r--src/core/src/tonkadur/fate/v1/lang/meta/RecurrentChecks.java82
-rw-r--r--src/core/src/tonkadur/fate/v1/parser/FateParser.g415
-rw-r--r--src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/Compiler.java40
-rw-r--r--src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/ComputationCompiler.java72
-rw-r--r--src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/SequenceCompiler.java24
-rw-r--r--src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/computation/generic/AtReferenceCompiler.java1
-rw-r--r--src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/computation/generic/FilterComputationCompiler.java30
-rw-r--r--src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/computation/generic/FoldCompiler.java29
-rw-r--r--src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/computation/generic/IndexedFilterComputationCompiler.java30
-rw-r--r--src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/computation/generic/IndexedMapComputationCompiler.java30
-rw-r--r--src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/computation/generic/IndexedMergeComputationCompiler.java30
-rw-r--r--src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/computation/generic/IndexedPartitionComputationCompiler.java37
-rw-r--r--src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/computation/generic/IndexedSafeMergeComputationCompiler.java30
-rw-r--r--src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/computation/generic/LambdaEvaluationCompiler.java17
-rw-r--r--src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/computation/generic/MapComputationCompiler.java30
-rw-r--r--src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/computation/generic/MergeComputationCompiler.java30
-rw-r--r--src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/computation/generic/PartialLambdaEvaluationCompiler.java100
-rw-r--r--src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/computation/generic/PartitionComputationCompiler.java34
-rw-r--r--src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/computation/generic/SafeMergeComputationCompiler.java31
-rw-r--r--src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/computation/generic/SortComputationCompiler.java30
-rw-r--r--src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/instruction/generic/FilterCompiler.java42
-rw-r--r--src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/instruction/generic/IndexedFilterCompiler.java42
-rw-r--r--src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/instruction/generic/IndexedPartitionCompiler.java42
-rw-r--r--src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/instruction/generic/PartitionCompiler.java42
-rw-r--r--src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/instruction/generic/SortCompiler.java42
-rw-r--r--src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/instruction/generic/UserInstructionCompiler.java39
-rw-r--r--src/core/src/tonkadur/wyrd/v1/compiler/util/AddParametersToLambda.java78
-rw-r--r--src/core/src/tonkadur/wyrd/v1/compiler/util/BinarySearch.java18
-rw-r--r--src/core/src/tonkadur/wyrd/v1/compiler/util/FilterLambda.java13
-rw-r--r--src/core/src/tonkadur/wyrd/v1/compiler/util/Fold.java16
-rw-r--r--src/core/src/tonkadur/wyrd/v1/compiler/util/IndexedFilterLambda.java16
-rw-r--r--src/core/src/tonkadur/wyrd/v1/compiler/util/IndexedMapLambda.java16
-rw-r--r--src/core/src/tonkadur/wyrd/v1/compiler/util/IndexedMergeLambda.java73
-rw-r--r--src/core/src/tonkadur/wyrd/v1/compiler/util/IndexedPartitionLambda.java14
-rw-r--r--src/core/src/tonkadur/wyrd/v1/compiler/util/LambdaEvaluation.java52
-rw-r--r--src/core/src/tonkadur/wyrd/v1/compiler/util/MapLambda.java13
-rw-r--r--src/core/src/tonkadur/wyrd/v1/compiler/util/MergeLambda.java65
-rw-r--r--src/core/src/tonkadur/wyrd/v1/compiler/util/PartitionLambda.java13
-rw-r--r--src/core/src/tonkadur/wyrd/v1/compiler/util/Sort.java6
-rw-r--r--src/core/src/tonkadur/wyrd/v1/lang/computation/Constant.java20
61 files changed, 953 insertions, 1108 deletions
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<Computation> 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)> <Y0>...<YN>)"
+ + " <(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<Computation> 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<Computation> 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<Computation> 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<Computation> extra_params;
final List<Type> base_param_types;
final Type return_type;
@@ -71,7 +70,7 @@ public class Fold extends GenericComputation
base_param_types = new ArrayList<Type>();
- 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))> <initial_value: X>"
- + " <(LIST Y)|(SET Y)> <Z0>...<ZN>)"
+ + " <(LAMBDA X (X Y))> <initial_value: X> <(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<Computation> 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<Computation> 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<Computation> 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<Computation> extra_params;
final List<Type> base_param_types;
base_param_types = new ArrayList<Type>();
- 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)>"
- + " <Y0>...<YN>)"
+ + " <(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<Computation> 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<Computation> 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<Computation> 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<Computation> extra_params;
final List<Type> base_param_types;
base_param_types = new ArrayList<Type>();
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)>"
- + " <Z0>...<ZN>)"
+ + " <(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<Computation> 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<Computation> 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<Computation> 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<Computation> extra_params;
final List<Type> base_param_types;
final boolean to_set;
base_param_types = new ArrayList<Type>();
- 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)> <W0>...<WN>)"
+ + " <(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<Computation> 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<Computation> 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<Computation> 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<Computation> extra_params;
final List<Type> base_param_types;
final Type type;
base_param_types = new ArrayList<Type>();
- 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)>"
- + " <Y0>...<YN>)"
+ + " <(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<Computation> 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<Computation> 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<Computation> 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<Computation> extra_params;
final List<Type> base_param_types;
final boolean to_set;
base_param_types = new ArrayList<Type>();
- 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)>"
- + " <default_y: Y> <(LIST Z)|(SET Z)> <default_z: Z>"
- + " <W0>...<WN>)"
+ + " <(LAMBDA X (INT Y Z))> <(LIST Y)|(SET Y)>"
+ + " <default_y: Y> <(LIST Z)|(SET Z)> <default_z: 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<Computation> 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<Computation> 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<Computation> 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<Type>(),
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<Computation> 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)>"
- + " <Z0>...<ZN>)"
+ + " <(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<Computation> 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<Computation> 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<Computation> 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<Computation> extra_params;
final List<Type> base_param_types;
final boolean to_set;
base_param_types = new ArrayList<Type>();
- 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)> <W0>...<WN>)"
+ + " <(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<Computation> 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<Computation> 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<Computation> 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<String> get_aliases ()
+ {
+ final Collection<String> aliases;
+
+ aliases = new ArrayList<String>();
+
+ 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<Computation> call_parameters
+ )
+ throws Throwable
+ {
+ final Computation lambda_function;
+ final List<Computation> parameters;
+ final LambdaType initial_type;
+ final List<Type> initial_signature;
+ final List<Type> remaining_signature;
+
+ if (call_parameters.size() < 1)
+ {
+ ErrorManager.handle
+ (
+ new WrongNumberOfParametersException
+ (
+ origin,
+ "(" + alias + " <(LAMBDA X (Y0...YN))> <Y0>...<YM, with M =< N>)"
+ )
+ );
+
+ 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<Type>(),
+ 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<Computation> parameters;
+
+ /***************************************************************************/
+ /**** PROTECTED ************************************************************/
+ /***************************************************************************/
+ /**** Constructors *********************************************************/
+ protected PartialLambdaEvaluation
+ (
+ final Origin origin,
+ final Computation lambda_function,
+ final List<Computation> 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<Computation> 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<Computation> 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)>"
- + " <Y0>...<YN>)"
+ + " <(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<Computation> 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<Computation> 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<Computation> 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<Computation> extra_params;
final List<Type> base_param_types;
final boolean to_set;
base_param_types = new ArrayList<Type>();
- 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)>"
- + " <default_y: Y> <(LIST Z)|(SET Z)> <default_z: Z>"
- + " <W0>...<WN>)"
+ + " <(LAMBDA X (Y Z))> <(LIST Y)|(SET Y)>"
+ + " <default_y: Y> <(LIST Z)|(SET Z)> <default_z: 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<Computation> 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<Computation> 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<Computation> 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<Computation> extra_params;
final List<Type> base_param_types;
base_param_types = new ArrayList<Type>();
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)>"
- + " <Y0>...<YN>)"
+ + " <(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<Computation> 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<Computation> 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<Computation> 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
+ " <start_at_index: INT> <end_before_index: INT>"
- + " <(LIST X)|(SET X)> <Y0>...<YN>)"
+ + " <(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<Computation> 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>"
- + " <Y0>...<YN>)"
+ + "! <(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<Computation> 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<Computation> 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<Computation> 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<Computation> extra_params;
final List<Type> base_param_types;
base_param_types = new ArrayList<Type>();
- 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>"
- + " <Y0>...<YN>)"
+ + "! <(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<Computation> 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<Computation> 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<Computation> 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<Computation> extra_params;
final List<Type> base_param_types;
base_param_types = new ArrayList<Type>();
- 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))>"
+ " <if_true: (LIST X)|(SET X) REFERENCE>"
- + " <if_false: (LIST X)|(SET X) REFERENCE>"
- + " <Y0>...<YN>)"
+ + " <if_false: (LIST X)|(SET X) REFERENCE>)"
)
);
@@ -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<Computation> 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<Computation> 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<Computation> 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<Computation> 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))>"
+ " <if_true: (LIST X)|(SET X) REFERENCE>"
- + " <if_false: (LIST X)|(SET X) REFERENCE>"
- + " <Y0>...<YN>)"
+ + " <if_false: (LIST X)|(SET X) REFERENCE>)"
)
);
@@ -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<Computation> 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<Computation> 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<Computation> 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<Computation> extra_params;
final List<Type> base_param_types;
base_param_types = new ArrayList<Type>();
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>"
- + " <Y0>...<YN>)"
+ + "! <(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<Computation> 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<Computation> 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<Computation> 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<Computation> parameters;
/***************************************************************************/
@@ -88,24 +88,23 @@ public class UserInstruction extends GenericInstruction
protected UserInstruction
(
final Origin origin,
- final Sequence definition,
+ final String instruction_name,
final List<Computation> 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<Computation> 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<Type> 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<Computation> params
+ )
+ throws ParsingError
+ {
+ final List<Type> 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<Type> filled_types
+ )
+ throws ParsingError
+ {
+ final List<Type> 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<Register> side_channel_parameters;
final List<Register> 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("<lambda_expr#out>");
in_label = compiler.assembler().generate_label("<lambda_expr#in>");
parameters = new ArrayList<Register>();
+ side_channel_parameters = new ArrayList<Register>();
+
+ 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<Register> to_be_cleaned;
final InstructionCompiler ic;
+ final String name;
init_instructions = new ArrayList<Instruction>();
parameters = new ArrayList<Register>();
to_be_cleaned = new ArrayList<Register>();
ic = new InstructionCompiler(compiler);
+ name = (name_prefix + fate_sequence.get_name());
end_of_sequence = compiler.assembler().generate_label("<sequence#end>");
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<Computation> 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<Computation>();
-
- 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<Computation> 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<Computation>();
-
- 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<Computation> 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<Computation>();
-
- 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<Computation> 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<Computation>();
-
- 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<Computation> 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<Computation>();
-
- 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<Computation> 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<Computation>();
-
- 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<Computation> 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<Computation>();
-
- 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<Computation> parameters;
final Register result;
source = (LambdaEvaluation) computation;
parameters = new ArrayList<Computation>();
- 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<Computation> 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<Computation>();
-
- 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<Computation> 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<Computation>();
-
- 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<Computation> parameters;
+ final Register result;
+ final int max_number_of_arguments;
+
+ source = (PartialLambdaEvaluation) computation;
+
+ parameters = new ArrayList<Computation>();
+ 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<Computation> 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<Computation>();
-
- 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<Computation> 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<Computation>();
-
- 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<Computation> 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<Computation>();
-
- 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<Computation> params;
- final List<ComputationCompiler> param_cc_list;
final ComputationCompiler lambda_cc, collection_cc;
source = (Filter) instruction;
- params = new ArrayList<Computation>();
- param_cc_list = new ArrayList<ComputationCompiler>();
-
- 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<Computation> params;
- final List<ComputationCompiler> param_cc_list;
final ComputationCompiler lambda_cc, collection_cc;
source = (IndexedFilter) instruction;
- params = new ArrayList<Computation>();
- param_cc_list = new ArrayList<ComputationCompiler>();
-
- 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<Computation> params;
- final List<ComputationCompiler> param_cc_list;
final ComputationCompiler lambda_cc, collection_in_cc, collection_out_cc;
source = (IndexedPartition) instruction;
- params = new ArrayList<Computation>();
- param_cc_list = new ArrayList<ComputationCompiler>();
-
- 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<Computation> params;
- final List<ComputationCompiler> param_cc_list;
final ComputationCompiler lambda_cc, collection_in_cc, collection_out_cc;
source = (Partition) instruction;
- params = new ArrayList<Computation>();
- param_cc_list = new ArrayList<ComputationCompiler>();
-
- 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<Computation> params;
- final List<ComputationCompiler> param_cc_list;
final ComputationCompiler collection_cc;
final Register sorted_result;
source = (Sort) instruction;
- params = new ArrayList<Computation>();
- param_cc_list = new ArrayList<ComputationCompiler>();
-
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 <string> c0 ... cn)
+ *
+ * Wyrd (event_call <string> 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<Computation> parameters,
+ final int missing_params_count
+ )
+ {
+ final List<Instruction> result;
+ final int parameters_size;
+
+ result = new ArrayList<Instruction>();
+ 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<Computation> sort_fun_extra_params
+ final Address result_index
)
{
final List<Instruction> 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<Computation> sort_fun_extra_params,
final Register bot,
final Register top,
final Register midval,
@@ -335,10 +332,13 @@ public class BinarySearch
final List<Instruction> result, while_body;
final Type element_type;
final Computation value_of_result_index;
+ final List<Computation> lambda_params;
result = new ArrayList<Instruction>();
while_body = new ArrayList<Instruction>();
+ lambda_params = new ArrayList<Computation>();
+
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<Computation> extra_params
+ final Address lambda,
+ final Address collection
)
{
final List<Instruction> result, while_body, remove_instructions;
final Register iterator, index_storage, collection_size, storage;
+ final List<Computation> lambda_params;
result = new ArrayList<Instruction>();
while_body = new ArrayList<Instruction>();
remove_instructions = new ArrayList<Instruction>();
+ lambda_params = new ArrayList<Computation>();
+
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<Computation> extra_params
+ final boolean is_foldl
)
{
final List<Instruction> result, while_body;
final Register iterator, collection_in_size;
final Computation start_point, end_point, condition, increment;
+ final List<Computation> lambda_params;
result = new ArrayList<Instruction>();
while_body = new ArrayList<Instruction>();
+ lambda_params = new ArrayList<Computation>();
+
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<Computation> extra_params
+ final Address lambda,
+ final Address collection
)
{
final List<Instruction> result, while_body, remove_instructions;
final Register iterator, index_storage, collection_size, storage;
final Register index_counter;
+ final List<Computation> lambda_params;
result = new ArrayList<Instruction>();
while_body = new ArrayList<Instruction>();
remove_instructions = new ArrayList<Instruction>();
+ lambda_params = new ArrayList<Computation>();
+
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<Computation> extra_params
+ final boolean to_set
)
{
final List<Instruction> result, while_body;
final Register iterator, collection_in_size, storage;
+ final List<Computation> lambda_params;
result = new ArrayList<Instruction>();
while_body = new ArrayList<Instruction>();
+ lambda_params = new ArrayList<Computation>();
+
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<Computation> extra_params
+ final boolean to_set
)
{
final List<Instruction> result, while_body;
final Register iterator, collection_in_size, storage;
final Register collection_in_b_size;
+ final List<Computation> lambda_params;
result = new ArrayList<Instruction>();
while_body = new ArrayList<Instruction>();
+ lambda_params = new ArrayList<Computation>();
+
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<Computation> extra_params
+ final boolean to_set
)
{
final List<Instruction> 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<Computation> lambda_params;
result = new ArrayList<Instruction>();
while_body = new ArrayList<Instruction>();
oob_a_body = new ArrayList<Instruction>();
oob_b_body = new ArrayList<Instruction>();
+ lambda_params = new ArrayList<Computation>();
+
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<Computation> extra_params
+ final boolean to_set
)
{
final List<Instruction> result, while_body, remove_instructions;
final Register iterator, index_storage, collection_size, storage;
final Computation iterator_target;
+ final List<Computation> lambda_params;
result = new ArrayList<Instruction>();
while_body = new ArrayList<Instruction>();
remove_instructions = new ArrayList<Instruction>();
+ lambda_params = new ArrayList<Computation>();
+
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<Computation> parameters
)
{
final List<Instruction> result;
final String return_to_label;
+ final int invokation_parameters_count;
+ final Computation lambda_line;
+ final List<Computation> 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<Instruction>();
+ side_channel_params = new ArrayList<Computation>();
+
+ lambda_data_storage = registers.reserve(DictType.WILD, result);
return_to_label = assembler.generate_label("<lambda_eval#return_to>");
- 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<Computation> extra_params
+ final boolean to_set
)
{
final List<Instruction> result, while_body;
final Register iterator, collection_in_size, storage;
+ final List<Computation> lambda_params;
result = new ArrayList<Instruction>();
while_body = new ArrayList<Instruction>();
+ lambda_params = new ArrayList<Computation>();
+
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<Computation> extra_params
+ final boolean to_set
)
{
final List<Instruction> result, while_body;
final Register iterator, collection_in_size, storage;
final Register collection_in_b_size;
+ final List<Computation> lambda_params;
result = new ArrayList<Instruction>();
while_body = new ArrayList<Instruction>();
+ lambda_params = new ArrayList<Computation>();
+
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<Computation> extra_params
+ final boolean to_set
)
{
final List<Instruction> result, while_body;
final Register iterator_a, iterator_b;
final Register collection_a_size, collection_b_size;
final Register storage;
+ final List<Computation> lambda_params;
result = new ArrayList<Instruction>();
while_body = new ArrayList<Instruction>();
+ lambda_params = new ArrayList<Computation>();
+
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<Computation> extra_params
+ final boolean to_set
)
{
final List<Instruction> result, while_body, remove_instructions;
final Register iterator, index_storage, collection_size, storage;
final Computation iterator_target;
+ final List<Computation> lambda_params;
result = new ArrayList<Instruction>();
while_body = new ArrayList<Instruction>();
remove_instructions = new ArrayList<Instruction>();
+ lambda_params = new ArrayList<Computation>();
+
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<Computation> 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 ()
{