summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/core/src/tonkadur/fate/v1/lang/computation/AddElementAtComputation.java73
-rw-r--r--src/core/src/tonkadur/fate/v1/lang/computation/AddElementComputation.java51
-rw-r--r--src/core/src/tonkadur/fate/v1/lang/computation/AddElementsOfComputation.java68
-rw-r--r--src/core/src/tonkadur/fate/v1/lang/computation/CondValue.java75
-rw-r--r--src/core/src/tonkadur/fate/v1/lang/computation/CountOperator.java75
-rw-r--r--src/core/src/tonkadur/fate/v1/lang/computation/FilterComputation.java62
-rw-r--r--src/core/src/tonkadur/fate/v1/lang/computation/Fold.java89
-rw-r--r--src/core/src/tonkadur/fate/v1/lang/computation/IfElseValue.java97
-rw-r--r--src/core/src/tonkadur/fate/v1/lang/computation/IndexOfOperator.java77
-rw-r--r--src/core/src/tonkadur/fate/v1/lang/computation/IndexedMapComputation.java72
-rw-r--r--src/core/src/tonkadur/fate/v1/lang/computation/IsEmpty.java24
-rw-r--r--src/core/src/tonkadur/fate/v1/lang/computation/IsMemberOperator.java77
-rw-r--r--src/core/src/tonkadur/fate/v1/lang/computation/LambdaEvaluation.java109
-rw-r--r--src/core/src/tonkadur/fate/v1/lang/computation/MapComputation.java72
-rw-r--r--src/core/src/tonkadur/fate/v1/lang/computation/MergeComputation.java164
-rw-r--r--src/core/src/tonkadur/fate/v1/lang/computation/PartitionComputation.java70
-rw-r--r--src/core/src/tonkadur/fate/v1/lang/computation/PopElementComputation.java50
-rw-r--r--src/core/src/tonkadur/fate/v1/lang/computation/PushElementComputation.java70
-rw-r--r--src/core/src/tonkadur/fate/v1/lang/computation/Range.java51
-rw-r--r--src/core/src/tonkadur/fate/v1/lang/computation/RemoveAllOfElementComputation.java57
-rw-r--r--src/core/src/tonkadur/fate/v1/lang/computation/RemoveElementAtComputation.java57
-rw-r--r--src/core/src/tonkadur/fate/v1/lang/computation/RemoveElementComputation.java57
-rw-r--r--src/core/src/tonkadur/fate/v1/lang/computation/ReverseListComputation.java47
-rw-r--r--src/core/src/tonkadur/fate/v1/lang/computation/ShuffleComputation.java47
-rw-r--r--src/core/src/tonkadur/fate/v1/lang/computation/SizeOperator.java23
-rw-r--r--src/core/src/tonkadur/fate/v1/lang/computation/SortComputation.java60
-rw-r--r--src/core/src/tonkadur/fate/v1/lang/computation/SubListComputation.java61
-rw-r--r--src/core/src/tonkadur/fate/v1/lang/computation/SwitchValue.java105
-rw-r--r--src/core/src/tonkadur/fate/v1/lang/computation/TextWithEffect.java91
-rw-r--r--src/core/src/tonkadur/fate/v1/lang/instruction/AddElement.java1
-rw-r--r--src/core/src/tonkadur/fate/v1/lang/instruction/AddElementsOf.java1
-rw-r--r--src/core/src/tonkadur/fate/v1/lang/instruction/RemoveAllOfElement.java1
-rw-r--r--src/core/src/tonkadur/fate/v1/lang/instruction/RemoveElement.java1
-rw-r--r--src/core/src/tonkadur/fate/v1/lang/instruction/RemoveElementAt.java1
-rw-r--r--src/core/src/tonkadur/fate/v1/lang/meta/RecurrentChecks.java32
-rw-r--r--src/core/src/tonkadur/fate/v1/lang/type/CollectionType.java1
-rw-r--r--src/core/src/tonkadur/fate/v1/parser/FateLexer.g43
-rw-r--r--src/core/src/tonkadur/fate/v1/parser/FateParser.g465
38 files changed, 931 insertions, 1206 deletions
diff --git a/src/core/src/tonkadur/fate/v1/lang/computation/AddElementAtComputation.java b/src/core/src/tonkadur/fate/v1/lang/computation/AddElementAtComputation.java
index b34b293..2b0c06a 100644
--- a/src/core/src/tonkadur/fate/v1/lang/computation/AddElementAtComputation.java
+++ b/src/core/src/tonkadur/fate/v1/lang/computation/AddElementAtComputation.java
@@ -1,22 +1,22 @@
package tonkadur.fate.v1.lang.computation;
import tonkadur.parser.Origin;
+import tonkadur.parser.ParsingError;
-import tonkadur.fate.v1.error.ConflictingTypeException;
-import tonkadur.fate.v1.error.IncomparableTypeException;
-import tonkadur.fate.v1.error.InvalidTypeException;
-
-import tonkadur.fate.v1.lang.instruction.AddElementAt;
+import tonkadur.fate.v1.lang.type.Type;
import tonkadur.fate.v1.lang.meta.ComputationVisitor;
import tonkadur.fate.v1.lang.meta.Computation;
+import tonkadur.fate.v1.lang.meta.RecurrentChecks;
public class AddElementAtComputation extends Computation
{
/***************************************************************************/
/**** MEMBERS **************************************************************/
/***************************************************************************/
- protected final AddElementAt instruction;
+ protected final Computation index;
+ protected final Computation element;
+ protected final Computation collection;
/***************************************************************************/
/**** PROTECTED ************************************************************/
@@ -24,12 +24,17 @@ public class AddElementAtComputation extends Computation
/**** Constructors *********************************************************/
protected AddElementAtComputation
(
- final AddElementAt instruction
+ final Origin origin,
+ final Computation index,
+ final Computation element,
+ final Computation collection
)
{
- super(instruction.get_origin(), instruction.get_collection().get_type());
+ super(origin, collection.get_type());
- this.instruction = instruction;
+ this.index = index;
+ this.collection = collection;
+ this.element = element;
}
/***************************************************************************/
@@ -43,16 +48,12 @@ public class AddElementAtComputation extends Computation
final Computation element,
final Computation collection
)
- throws
- InvalidTypeException,
- ConflictingTypeException,
- IncomparableTypeException
+ throws ParsingError
{
- return
- new AddElementAtComputation
- (
- AddElementAt.build(origin, index, element, collection)
- );
+ RecurrentChecks.assert_is_a_list_of(collection, element);
+ RecurrentChecks.assert_can_be_used_as(index, Type.INT);
+
+ return new AddElementAtComputation(origin, index, element, collection);
}
/**** Accessors ************************************************************/
@@ -63,19 +64,47 @@ public class AddElementAtComputation extends Computation
cv.visit_add_element_at(this);
}
- public AddElementAt get_instruction ()
+ public Computation get_collection ()
+ {
+ return collection;
+ }
+
+ public Computation get_index ()
+ {
+ return index;
+ }
+
+ public Computation get_element ()
{
- return instruction;
+ return element;
}
+
/**** Misc. ****************************************************************/
@Override
public String toString ()
{
final StringBuilder sb = new StringBuilder();
- sb.append("(ComputationOf ");
- sb.append(instruction.toString());
+ sb.append("(AddElementAt");
+ sb.append(System.lineSeparator());
+ sb.append(System.lineSeparator());
+
+ sb.append("index:");
+ sb.append(System.lineSeparator());
+ sb.append(index.toString());
+ sb.append(System.lineSeparator());
+ sb.append(System.lineSeparator());
+
+ sb.append("element:");
+ sb.append(System.lineSeparator());
+ sb.append(element.toString());
+ sb.append(System.lineSeparator());
+ sb.append(System.lineSeparator());
+
+ sb.append("collection:");
+ sb.append(System.lineSeparator());
+ sb.append(collection.toString());
sb.append(")");
diff --git a/src/core/src/tonkadur/fate/v1/lang/computation/AddElementComputation.java b/src/core/src/tonkadur/fate/v1/lang/computation/AddElementComputation.java
index 74e0fac..b99d94c 100644
--- a/src/core/src/tonkadur/fate/v1/lang/computation/AddElementComputation.java
+++ b/src/core/src/tonkadur/fate/v1/lang/computation/AddElementComputation.java
@@ -3,21 +3,17 @@ package tonkadur.fate.v1.lang.computation;
import tonkadur.parser.Origin;
import tonkadur.parser.ParsingError;
-import tonkadur.fate.v1.error.ConflictingTypeException;
-import tonkadur.fate.v1.error.IncomparableTypeException;
-import tonkadur.fate.v1.error.InvalidTypeException;
-
-import tonkadur.fate.v1.lang.instruction.AddElement;
-
import tonkadur.fate.v1.lang.meta.ComputationVisitor;
import tonkadur.fate.v1.lang.meta.Computation;
+import tonkadur.fate.v1.lang.meta.RecurrentChecks;
public class AddElementComputation extends Computation
{
/***************************************************************************/
/**** MEMBERS **************************************************************/
/***************************************************************************/
- protected final AddElement instruction;
+ protected final Computation element;
+ protected final Computation collection;
/***************************************************************************/
/**** PROTECTED ************************************************************/
@@ -25,12 +21,15 @@ public class AddElementComputation extends Computation
/**** Constructors *********************************************************/
protected AddElementComputation
(
- final AddElement instruction
+ final Origin origin,
+ final Computation element,
+ final Computation collection
)
{
- super(instruction.get_origin(), instruction.get_collection().get_type());
+ super(origin, collection.get_type());
- this.instruction = instruction;
+ this.collection = collection;
+ this.element = element;
}
/***************************************************************************/
@@ -45,11 +44,9 @@ public class AddElementComputation extends Computation
)
throws ParsingError
{
- return
- new AddElementComputation
- (
- AddElement.build(origin, element, collection)
- );
+ RecurrentChecks.assert_is_a_collection_of(collection, element);
+
+ return new AddElementComputation(origin, element, collection);
}
/**** Accessors ************************************************************/
@@ -60,9 +57,14 @@ public class AddElementComputation extends Computation
cv.visit_add_element(this);
}
- public AddElement get_instruction ()
+ public Computation get_collection ()
{
- return instruction;
+ return collection;
+ }
+
+ public Computation get_element ()
+ {
+ return element;
}
/**** Misc. ****************************************************************/
@@ -71,8 +73,19 @@ public class AddElementComputation extends Computation
{
final StringBuilder sb = new StringBuilder();
- sb.append("(ComputationOf ");
- sb.append(instruction.toString());
+ sb.append("(AddElement");
+ sb.append(System.lineSeparator());
+ sb.append(System.lineSeparator());
+
+ sb.append("element:");
+ sb.append(System.lineSeparator());
+ sb.append(element.toString());
+ sb.append(System.lineSeparator());
+ sb.append(System.lineSeparator());
+
+ sb.append("collection:");
+ sb.append(System.lineSeparator());
+ sb.append(collection.toString());
sb.append(")");
diff --git a/src/core/src/tonkadur/fate/v1/lang/computation/AddElementsOfComputation.java b/src/core/src/tonkadur/fate/v1/lang/computation/AddElementsOfComputation.java
index b6ecec4..b9d4468 100644
--- a/src/core/src/tonkadur/fate/v1/lang/computation/AddElementsOfComputation.java
+++ b/src/core/src/tonkadur/fate/v1/lang/computation/AddElementsOfComputation.java
@@ -1,23 +1,22 @@
package tonkadur.fate.v1.lang.computation;
import tonkadur.parser.Origin;
+import tonkadur.parser.ParsingError;
-import tonkadur.fate.v1.error.ConflictingTypeException;
-import tonkadur.fate.v1.error.IncomparableTypeException;
-import tonkadur.fate.v1.error.InvalidTypeException;
-
-import tonkadur.fate.v1.lang.instruction.AddElementsOf;
+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.Reference;
+import tonkadur.fate.v1.lang.meta.RecurrentChecks;
public class AddElementsOfComputation extends Computation
{
/***************************************************************************/
/**** MEMBERS **************************************************************/
/***************************************************************************/
- protected final AddElementsOf instruction;
+ protected final Reference other_collection;
+ protected final Reference collection;
/***************************************************************************/
/**** PROTECTED ************************************************************/
@@ -25,16 +24,15 @@ public class AddElementsOfComputation extends Computation
/**** Constructors *********************************************************/
protected AddElementsOfComputation
(
- final AddElementsOf instruction
+ final Origin origin,
+ final Reference other_collection,
+ final Reference collection
)
{
- super
- (
- instruction.get_origin(),
- instruction.get_source_collection().get_type()
- );
+ super(origin, collection.get_type());
- this.instruction = instruction;
+ this.collection = collection;
+ this.other_collection = other_collection;
}
/***************************************************************************/
@@ -47,16 +45,18 @@ public class AddElementsOfComputation extends Computation
final Reference other_collection,
final Reference collection
)
- throws
- InvalidTypeException,
- ConflictingTypeException,
- IncomparableTypeException
+ throws ParsingError
{
- return
- new AddElementsOfComputation
- (
- AddElementsOf.build(origin, other_collection, collection)
- );
+ RecurrentChecks.assert_is_a_collection(collection);
+ RecurrentChecks.assert_is_a_collection(other_collection);
+ RecurrentChecks.assert_can_be_used_as
+ (
+ other_collection.get_origin(),
+ ((CollectionType) other_collection.get_type()).get_content_type(),
+ ((CollectionType) collection.get_type()).get_content_type()
+ );
+
+ return new AddElementsOfComputation(origin, other_collection, collection);
}
/**** Accessors ************************************************************/
@@ -67,9 +67,14 @@ public class AddElementsOfComputation extends Computation
cv.visit_add_elements_of(this);
}
- public AddElementsOf get_instruction ()
+ public Reference get_source_collection ()
{
- return instruction;
+ return other_collection;
+ }
+
+ public Reference get_target_collection ()
+ {
+ return collection;
}
/**** Misc. ****************************************************************/
@@ -78,8 +83,19 @@ public class AddElementsOfComputation extends Computation
{
final StringBuilder sb = new StringBuilder();
- sb.append("(ComputationOf ");
- sb.append(instruction.toString());
+ sb.append("(AddElementsOf");
+ sb.append(System.lineSeparator());
+ sb.append(System.lineSeparator());
+
+ sb.append("other_collection:");
+ sb.append(System.lineSeparator());
+ sb.append(other_collection.toString());
+ sb.append(System.lineSeparator());
+ sb.append(System.lineSeparator());
+
+ sb.append("collection:");
+ sb.append(System.lineSeparator());
+ sb.append(collection.toString());
sb.append(")");
diff --git a/src/core/src/tonkadur/fate/v1/lang/computation/CondValue.java b/src/core/src/tonkadur/fate/v1/lang/computation/CondValue.java
index dcd014b..91f6b6b 100644
--- a/src/core/src/tonkadur/fate/v1/lang/computation/CondValue.java
+++ b/src/core/src/tonkadur/fate/v1/lang/computation/CondValue.java
@@ -1,22 +1,17 @@
package tonkadur.fate.v1.lang.computation;
import java.util.List;
-import java.util.Collections;
import tonkadur.functional.Cons;
-import tonkadur.error.ErrorManager;
-
import tonkadur.parser.Origin;
-
-import tonkadur.fate.v1.error.ConflictingTypeException;
-import tonkadur.fate.v1.error.IncomparableTypeException;
-import tonkadur.fate.v1.error.InvalidTypeException;
+import tonkadur.parser.ParsingError;
import tonkadur.fate.v1.lang.type.Type;
import tonkadur.fate.v1.lang.meta.ComputationVisitor;
import tonkadur.fate.v1.lang.meta.Computation;
+import tonkadur.fate.v1.lang.meta.RecurrentChecks;
public class CondValue extends Computation
{
@@ -50,70 +45,17 @@ public class CondValue extends Computation
final Origin origin,
final List<Cons<Computation, Computation>> branches
)
- throws
- InvalidTypeException,
- ConflictingTypeException,
- IncomparableTypeException
+ throws ParsingError
{
- final Type first_type;
- Type candidate_hint, hint;
+ Type hint;
- first_type = branches.get(0).get_cdr().get_type();
- hint = first_type;
+ hint = branches.get(0).get_cdr().get_type();
for (final Cons<Computation, Computation> entry: branches)
{
- if (!entry.get_car().get_type().can_be_used_as(Type.BOOL))
- {
- ErrorManager.handle
- (
- new InvalidTypeException
- (
- entry.get_car().get_origin(),
- entry.get_car().get_type(),
- Collections.singleton(Type.BOOL)
- )
- );
- }
-
- if (entry.get_cdr().get_type().equals(hint))
- {
- continue;
- }
-
- candidate_hint = entry.get_cdr().get_type().try_merging_with(hint);
-
- if (candidate_hint != null)
- {
- hint = candidate_hint;
-
- continue;
- }
-
- ErrorManager.handle
- (
- new ConflictingTypeException
- (
- entry.get_cdr().get_origin(),
- entry.get_cdr().get_type(),
- first_type
- )
- );
-
- hint = (Type) hint.generate_comparable_to(entry.get_cdr().get_type());
-
- if (hint.equals(Type.ANY))
- {
- ErrorManager.handle
- (
- new IncomparableTypeException
- (
- entry.get_cdr().get_origin(),
- entry.get_cdr().get_type(),
- first_type
- )
- );
- }
+ RecurrentChecks.assert_can_be_used_as(entry.get_car(), Type.BOOL);
+
+ hint = RecurrentChecks.assert_can_be_used_as(entry.get_cdr(), hint);
}
return new CondValue(origin, hint, branches);
@@ -138,7 +80,6 @@ public class CondValue extends Computation
{
final StringBuilder sb = new StringBuilder();
- sb.append(origin.toString());
sb.append("(CondValue");
sb.append(System.lineSeparator());
diff --git a/src/core/src/tonkadur/fate/v1/lang/computation/CountOperator.java b/src/core/src/tonkadur/fate/v1/lang/computation/CountOperator.java
index 56d4cac..a46387d 100644
--- a/src/core/src/tonkadur/fate/v1/lang/computation/CountOperator.java
+++ b/src/core/src/tonkadur/fate/v1/lang/computation/CountOperator.java
@@ -3,16 +3,13 @@ package tonkadur.fate.v1.lang.computation;
import tonkadur.error.ErrorManager;
import tonkadur.parser.Origin;
+import tonkadur.parser.ParsingError;
-import tonkadur.fate.v1.error.ConflictingTypeException;
-import tonkadur.fate.v1.error.IncomparableTypeException;
-import tonkadur.fate.v1.error.InvalidTypeException;
-
-import tonkadur.fate.v1.lang.type.CollectionType;
import tonkadur.fate.v1.lang.type.Type;
import tonkadur.fate.v1.lang.meta.ComputationVisitor;
import tonkadur.fate.v1.lang.meta.Computation;
+import tonkadur.fate.v1.lang.meta.RecurrentChecks;
public class CountOperator extends Computation
{
@@ -49,72 +46,9 @@ public class CountOperator extends Computation
final Computation element,
final Computation collection
)
- throws
- InvalidTypeException,
- ConflictingTypeException,
- IncomparableTypeException
+ throws ParsingError
{
- final Type hint;
- final Type collection_type;
- final CollectionType collection_true_type;
- final Type collection_element_type;
-
- collection_type = collection.get_type();
-
- if (!(collection_type instanceof CollectionType))
- {
- ErrorManager.handle
- (
- new InvalidTypeException
- (
- collection.get_origin(),
- collection.get_type(),
- Type.COLLECTION_TYPES
- )
- );
- }
-
- collection_true_type = (CollectionType) collection_type;
- collection_element_type = collection_true_type.get_content_type();
-
- if
- (
- element.get_type().can_be_used_as(collection_element_type)
- ||
- (element.get_type().try_merging_with(collection_element_type) != null)
- )
- {
- return new CountOperator(origin, element, collection);
- }
-
- ErrorManager.handle
- (
- new ConflictingTypeException
- (
- element.get_origin(),
- element.get_type(),
- collection_element_type
- )
- );
-
- hint =
- (Type) element.get_type().generate_comparable_to
- (
- collection_element_type
- );
-
- if (hint.equals(Type.ANY))
- {
- ErrorManager.handle
- (
- new IncomparableTypeException
- (
- element.get_origin(),
- element.get_type(),
- collection_element_type
- )
- );
- }
+ RecurrentChecks.assert_is_a_collection_of(collection, element);
return new CountOperator(origin, element, collection);
}
@@ -143,7 +77,6 @@ public class CountOperator extends Computation
{
final StringBuilder sb = new StringBuilder();
- sb.append(origin.toString());
sb.append("(CountOperator");
sb.append(System.lineSeparator());
sb.append(System.lineSeparator());
diff --git a/src/core/src/tonkadur/fate/v1/lang/computation/FilterComputation.java b/src/core/src/tonkadur/fate/v1/lang/computation/FilterComputation.java
index 8884941..4926265 100644
--- a/src/core/src/tonkadur/fate/v1/lang/computation/FilterComputation.java
+++ b/src/core/src/tonkadur/fate/v1/lang/computation/FilterComputation.java
@@ -1,25 +1,25 @@
package tonkadur.fate.v1.lang.computation;
-import tonkadur.parser.Origin;
+import java.util.Collections;
-import tonkadur.error.ErrorManager;
+import tonkadur.parser.Origin;
+import tonkadur.parser.ParsingError;
import tonkadur.fate.v1.lang.type.Type;
-import tonkadur.fate.v1.lang.type.LambdaType;
import tonkadur.fate.v1.lang.type.CollectionType;
-import tonkadur.fate.v1.lang.instruction.Filter;
-
import tonkadur.fate.v1.lang.meta.ComputationVisitor;
import tonkadur.fate.v1.lang.meta.Computation;
import tonkadur.fate.v1.lang.meta.Reference;
+import tonkadur.fate.v1.lang.meta.RecurrentChecks;
public class FilterComputation extends Computation
{
/***************************************************************************/
/**** MEMBERS **************************************************************/
/***************************************************************************/
- protected final Filter instruction;
+ protected final Computation lambda_function;
+ protected final Reference collection;
/***************************************************************************/
/**** PROTECTED ************************************************************/
@@ -27,13 +27,15 @@ public class FilterComputation extends Computation
/**** Constructors *********************************************************/
protected FilterComputation
(
- final Filter instruction,
- final Type output_type
+ final Origin origin,
+ final Computation lambda_function,
+ final Reference collection
)
{
- super(instruction.get_origin(), output_type);
+ super(origin, collection.get_type());
- this.instruction = instruction;
+ this.lambda_function = lambda_function;
+ this.collection = collection;
}
/***************************************************************************/
@@ -44,18 +46,22 @@ public class FilterComputation extends Computation
(
final Origin origin,
final Computation lambda_function,
- final Reference collection_in
+ final Reference collection
)
- throws Throwable
+ throws ParsingError
{
- final Type type;
- final Filter parent;
-
- parent = Filter.build(origin, lambda_function, collection_in);
-
- type = collection_in.get_type();
-
- return new FilterComputation(parent, type);
+ RecurrentChecks.assert_is_a_collection(collection);
+ RecurrentChecks.assert_lambda_matches_types
+ (
+ lambda_function,
+ Type.BOOL,
+ Collections.singletonList
+ (
+ ((CollectionType) collection.get_type()).get_content_type()
+ )
+ );
+
+ return new FilterComputation(origin, lambda_function, collection);
}
/**** Accessors ************************************************************/
@@ -66,9 +72,14 @@ public class FilterComputation extends Computation
cv.visit_filter(this);
}
- public Filter get_instruction ()
+ public Computation get_lambda_function ()
+ {
+ return lambda_function;
+ }
+
+ public Reference get_collection ()
{
- return instruction;
+ return collection;
}
/**** Misc. ****************************************************************/
@@ -77,9 +88,10 @@ public class FilterComputation extends Computation
{
final StringBuilder sb = new StringBuilder();
- sb.append("(ComputationOf ");
- sb.append(instruction.toString());
-
+ sb.append("(Filter ");
+ sb.append(lambda_function.toString());
+ sb.append(" ");
+ sb.append(collection.toString());
sb.append(")");
return sb.toString();
diff --git a/src/core/src/tonkadur/fate/v1/lang/computation/Fold.java b/src/core/src/tonkadur/fate/v1/lang/computation/Fold.java
index 55f1877..293036c 100644
--- a/src/core/src/tonkadur/fate/v1/lang/computation/Fold.java
+++ b/src/core/src/tonkadur/fate/v1/lang/computation/Fold.java
@@ -1,19 +1,11 @@
package tonkadur.fate.v1.lang.computation;
import java.util.ArrayList;
-import java.util.Collections;
import java.util.List;
import tonkadur.parser.Origin;
import tonkadur.parser.ParsingError;
-import tonkadur.error.ErrorManager;
-
-import tonkadur.fate.v1.error.IncompatibleTypeException;
-import tonkadur.fate.v1.error.IncomparableTypeException;
-import tonkadur.fate.v1.error.InvalidArityException;
-import tonkadur.fate.v1.error.InvalidTypeException;
-
import tonkadur.fate.v1.lang.type.Type;
import tonkadur.fate.v1.lang.type.LambdaType;
import tonkadur.fate.v1.lang.type.CollectionType;
@@ -21,6 +13,7 @@ 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.Reference;
+import tonkadur.fate.v1.lang.meta.RecurrentChecks;
public class Fold extends Computation
{
@@ -66,76 +59,26 @@ public class Fold extends Computation
final Reference collection,
final boolean is_foldl
)
- throws Throwable
+ throws ParsingError
{
- final Type var_type, collection_generic_type;
- final CollectionType collection_type;
- final LambdaType lambda_type;
- final List<Type> signature;
-
- var_type = lambda_function.get_type();
-
- if (!(var_type instanceof LambdaType))
- {
- ErrorManager.handle
- (
- new InvalidTypeException
- (
- origin,
- var_type,
- Collections.singleton(Type.LAMBDA)
- )
- );
-
- return null;
- }
+ final List<Type> types_in;
- lambda_type = (LambdaType) var_type;
+ types_in = new ArrayList<Type>();
- signature = lambda_type.get_signature();
+ RecurrentChecks.assert_is_a_collection(collection);
- if (signature.size() != 2)
- {
- ErrorManager.handle
- (
- new InvalidArityException
- (
- lambda_function.get_origin(),
- signature.size(),
- 2,
- 2
- )
- );
- }
+ types_in.add(initial_value.get_type());
+ types_in.add
+ (
+ ((CollectionType) collection.get_type()).get_content_type()
+ );
- collection_generic_type = collection.get_type();
-
- if (!(collection_generic_type instanceof CollectionType))
- {
- ErrorManager.handle
- (
- new InvalidTypeException
- (
- origin,
- collection_generic_type,
- Type.COLLECTION_TYPES
- )
- );
-
- return null;
- }
-
- collection_type = (CollectionType) collection_generic_type;
-
- if (!initial_value.get_type().can_be_used_as(signature.get(0)))
- {
- /* TODO */
- }
-
- if (!collection_type.get_content_type().can_be_used_as(signature.get(1)))
- {
- /* TODO */
- }
+ RecurrentChecks.assert_lambda_matches_types
+ (
+ lambda_function,
+ initial_value.get_type(),
+ types_in
+ );
return
new Fold
diff --git a/src/core/src/tonkadur/fate/v1/lang/computation/IfElseValue.java b/src/core/src/tonkadur/fate/v1/lang/computation/IfElseValue.java
index 2fdb15e..0097537 100644
--- a/src/core/src/tonkadur/fate/v1/lang/computation/IfElseValue.java
+++ b/src/core/src/tonkadur/fate/v1/lang/computation/IfElseValue.java
@@ -1,19 +1,13 @@
package tonkadur.fate.v1.lang.computation;
-import java.util.Collections;
-
-import tonkadur.error.ErrorManager;
-
import tonkadur.parser.Origin;
-
-import tonkadur.fate.v1.error.ConflictingTypeException;
-import tonkadur.fate.v1.error.IncomparableTypeException;
-import tonkadur.fate.v1.error.InvalidTypeException;
+import tonkadur.parser.ParsingError;
import tonkadur.fate.v1.lang.type.Type;
import tonkadur.fate.v1.lang.meta.ComputationVisitor;
import tonkadur.fate.v1.lang.meta.Computation;
+import tonkadur.fate.v1.lang.meta.RecurrentChecks;
public class IfElseValue extends Computation
{
@@ -55,74 +49,25 @@ public class IfElseValue extends Computation
final Computation if_true,
final Computation if_false
)
- throws
- InvalidTypeException,
- ConflictingTypeException,
- IncomparableTypeException
+ throws ParsingError
{
- Type hint;
- final Type if_true_type;
- final Type if_false_type;
-
- if (!condition.get_type().can_be_used_as(Type.BOOL))
- {
- ErrorManager.handle
- (
- new InvalidTypeException
- (
- condition.get_origin(),
- condition.get_type(),
- Collections.singleton(Type.BOOL)
- )
- );
- }
-
- if_true_type = if_true.get_type();
- if_false_type = if_false.get_type();
-
- if (if_true_type.equals(if_false_type))
- {
- return
- new IfElseValue(origin, if_true_type, condition, if_true, if_false);
- }
-
- hint = if_true_type.try_merging_with(if_false_type);
-
- if (hint != null)
- {
- return new IfElseValue(origin, hint, condition, if_true, if_false);
- }
-
- ErrorManager.handle
- (
- new ConflictingTypeException
- (
- if_false.get_origin(),
- if_false_type,
- if_true_type
- )
- );
-
- hint =
- (Type) if_false_type.generate_comparable_to(if_true_type);
-
- if (hint.equals(Type.ANY))
- {
- ErrorManager.handle
- (
- new IncomparableTypeException
- (
- if_false.get_origin(),
- if_false_type,
- if_true_type
- )
- );
- }
-
- return new IfElseValue(origin, hint, condition, if_true, if_false);
+ final Type type;
+
+ RecurrentChecks.assert_can_be_used_as(condition, Type.BOOL);
+
+ type =
+ RecurrentChecks.assert_can_be_used_as(if_false, if_true.get_type());
+
+ return new IfElseValue(origin, type, condition, if_true, if_false);
}
/**** Accessors ************************************************************/
+ @Override
+ public void get_visited_by (final ComputationVisitor cv)
+ throws Throwable
+ {
+ cv.visit_if_else_value(this);
+ }
public Computation get_condition ()
{
@@ -139,20 +84,12 @@ public class IfElseValue extends Computation
return if_false;
}
- @Override
- public void get_visited_by (final ComputationVisitor cv)
- throws Throwable
- {
- cv.visit_if_else_value(this);
- }
-
/**** Misc. ****************************************************************/
@Override
public String toString ()
{
final StringBuilder sb = new StringBuilder();
- sb.append(origin.toString());
sb.append("(IfElseValue");
sb.append(System.lineSeparator());
sb.append(System.lineSeparator());
diff --git a/src/core/src/tonkadur/fate/v1/lang/computation/IndexOfOperator.java b/src/core/src/tonkadur/fate/v1/lang/computation/IndexOfOperator.java
index 73123f6..3269dbb 100644
--- a/src/core/src/tonkadur/fate/v1/lang/computation/IndexOfOperator.java
+++ b/src/core/src/tonkadur/fate/v1/lang/computation/IndexOfOperator.java
@@ -1,18 +1,13 @@
package tonkadur.fate.v1.lang.computation;
-import tonkadur.error.ErrorManager;
-
import tonkadur.parser.Origin;
+import tonkadur.parser.ParsingError;
-import tonkadur.fate.v1.error.ConflictingTypeException;
-import tonkadur.fate.v1.error.IncomparableTypeException;
-import tonkadur.fate.v1.error.InvalidTypeException;
-
-import tonkadur.fate.v1.lang.type.CollectionType;
import tonkadur.fate.v1.lang.type.Type;
import tonkadur.fate.v1.lang.meta.ComputationVisitor;
import tonkadur.fate.v1.lang.meta.Computation;
+import tonkadur.fate.v1.lang.meta.RecurrentChecks;
public class IndexOfOperator extends Computation
{
@@ -49,72 +44,9 @@ public class IndexOfOperator extends Computation
final Computation element,
final Computation collection
)
- throws
- InvalidTypeException,
- ConflictingTypeException,
- IncomparableTypeException
+ throws ParsingError
{
- final Type hint;
- final Type collection_type;
- final CollectionType collection_true_type;
- final Type collection_element_type;
-
- collection_type = collection.get_type();
-
- if (!(collection_type instanceof CollectionType))
- {
- ErrorManager.handle
- (
- new InvalidTypeException
- (
- collection.get_origin(),
- collection.get_type(),
- Type.COLLECTION_TYPES
- )
- );
- }
-
- collection_true_type = (CollectionType) collection_type;
- collection_element_type = collection_true_type.get_content_type();
-
- if
- (
- element.get_type().can_be_used_as(collection_element_type)
- ||
- (element.get_type().try_merging_with(collection_element_type) != null)
- )
- {
- return new IndexOfOperator(origin, element, collection);
- }
-
- ErrorManager.handle
- (
- new ConflictingTypeException
- (
- element.get_origin(),
- element.get_type(),
- collection_element_type
- )
- );
-
- hint =
- (Type) element.get_type().generate_comparable_to
- (
- collection_element_type
- );
-
- if (hint.equals(Type.ANY))
- {
- ErrorManager.handle
- (
- new IncomparableTypeException
- (
- element.get_origin(),
- element.get_type(),
- collection_element_type
- )
- );
- }
+ RecurrentChecks.assert_is_a_collection_of(collection, element);
return new IndexOfOperator(origin, element, collection);
}
@@ -143,7 +75,6 @@ public class IndexOfOperator extends Computation
{
final StringBuilder sb = new StringBuilder();
- sb.append(origin.toString());
sb.append("(IndexOfOperator");
sb.append(System.lineSeparator());
sb.append(System.lineSeparator());
diff --git a/src/core/src/tonkadur/fate/v1/lang/computation/IndexedMapComputation.java b/src/core/src/tonkadur/fate/v1/lang/computation/IndexedMapComputation.java
index dc3b9e4..d134b71 100644
--- a/src/core/src/tonkadur/fate/v1/lang/computation/IndexedMapComputation.java
+++ b/src/core/src/tonkadur/fate/v1/lang/computation/IndexedMapComputation.java
@@ -1,25 +1,27 @@
package tonkadur.fate.v1.lang.computation;
-import tonkadur.parser.Origin;
+import java.util.List;
+import java.util.ArrayList;
-import tonkadur.error.ErrorManager;
+import tonkadur.parser.Origin;
+import tonkadur.parser.ParsingError;
import tonkadur.fate.v1.lang.type.Type;
import tonkadur.fate.v1.lang.type.LambdaType;
import tonkadur.fate.v1.lang.type.CollectionType;
-import tonkadur.fate.v1.lang.instruction.IndexedMap;
-
import tonkadur.fate.v1.lang.meta.ComputationVisitor;
import tonkadur.fate.v1.lang.meta.Computation;
import tonkadur.fate.v1.lang.meta.Reference;
+import tonkadur.fate.v1.lang.meta.RecurrentChecks;
public class IndexedMapComputation extends Computation
{
/***************************************************************************/
/**** MEMBERS **************************************************************/
/***************************************************************************/
- protected final IndexedMap instruction;
+ protected final Computation lambda_function;
+ protected final Reference collection;
/***************************************************************************/
/**** PROTECTED ************************************************************/
@@ -27,13 +29,16 @@ public class IndexedMapComputation extends Computation
/**** Constructors *********************************************************/
protected IndexedMapComputation
(
- final IndexedMap instruction,
+ final Origin origin,
+ final Computation lambda_function,
+ final Reference collection,
final Type output_type
)
{
- super(instruction.get_origin(), output_type);
+ super(origin, output_type);
- this.instruction = instruction;
+ this.lambda_function = lambda_function;
+ this.collection = collection;
}
/***************************************************************************/
@@ -44,25 +49,38 @@ public class IndexedMapComputation extends Computation
(
final Origin origin,
final Computation lambda_function,
- final Reference collection_in
+ final Reference collection
)
throws Throwable
{
- final Type type;
- final IndexedMap parent;
+ final List<Type> in_types;
+
+ in_types = new ArrayList<Type>();
+
+ RecurrentChecks.assert_is_a_collection(collection);
- parent = IndexedMap.build(origin, lambda_function, collection_in, null);
+ in_types.add(Type.INT);
+ in_types.add
+ (
+ ((CollectionType) collection.get_type()).get_content_type()
+ );
- type =
- CollectionType.build
+ RecurrentChecks.assert_lambda_matches_types(lambda_function, in_types);
+
+ return
+ new IndexedMapComputation
(
origin,
- ((LambdaType) lambda_function.get_type()).get_return_type(),
- ((CollectionType) collection_in.get_type()).is_set(),
- "auto generated"
+ lambda_function,
+ collection,
+ CollectionType.build
+ (
+ origin,
+ ((LambdaType) lambda_function.get_type()).get_return_type(),
+ ((CollectionType) collection.get_type()).is_set(),
+ "auto generated"
+ )
);
-
- return new IndexedMapComputation(parent, type);
}
/**** Accessors ************************************************************/
@@ -73,9 +91,14 @@ public class IndexedMapComputation extends Computation
cv.visit_indexed_map(this);
}
- public IndexedMap get_instruction ()
+ public Computation get_lambda_function ()
+ {
+ return lambda_function;
+ }
+
+ public Reference get_collection ()
{
- return instruction;
+ return collection;
}
/**** Misc. ****************************************************************/
@@ -84,9 +107,10 @@ public class IndexedMapComputation extends Computation
{
final StringBuilder sb = new StringBuilder();
- sb.append("(ComputationOf ");
- sb.append(instruction.toString());
-
+ sb.append("(IndexedMap ");
+ sb.append(lambda_function.toString());
+ sb.append(" ");
+ sb.append(collection.toString());
sb.append(")");
return sb.toString();
diff --git a/src/core/src/tonkadur/fate/v1/lang/computation/IsEmpty.java b/src/core/src/tonkadur/fate/v1/lang/computation/IsEmpty.java
index 66d40f0..054447b 100644
--- a/src/core/src/tonkadur/fate/v1/lang/computation/IsEmpty.java
+++ b/src/core/src/tonkadur/fate/v1/lang/computation/IsEmpty.java
@@ -1,16 +1,13 @@
package tonkadur.fate.v1.lang.computation;
-import tonkadur.error.ErrorManager;
-
import tonkadur.parser.Origin;
+import tonkadur.parser.ParsingError;
-import tonkadur.fate.v1.error.InvalidTypeException;
-
-import tonkadur.fate.v1.lang.type.CollectionType;
import tonkadur.fate.v1.lang.type.Type;
import tonkadur.fate.v1.lang.meta.ComputationVisitor;
import tonkadur.fate.v1.lang.meta.Computation;
+import tonkadur.fate.v1.lang.meta.RecurrentChecks;
public class IsEmpty extends Computation
{
@@ -43,21 +40,9 @@ public class IsEmpty extends Computation
final Origin origin,
final Computation collection
)
- throws InvalidTypeException
+ throws ParsingError
{
-
- if (!(collection.get_type() instanceof CollectionType))
- {
- ErrorManager.handle
- (
- new InvalidTypeException
- (
- collection.get_origin(),
- collection.get_type(),
- Type.COLLECTION_TYPES
- )
- );
- }
+ RecurrentChecks.assert_is_a_collection(collection);
return new IsEmpty(origin, collection);
}
@@ -81,7 +66,6 @@ public class IsEmpty extends Computation
{
final StringBuilder sb = new StringBuilder();
- sb.append(origin.toString());
sb.append("(IsEmpty");
sb.append(System.lineSeparator());
sb.append(System.lineSeparator());
diff --git a/src/core/src/tonkadur/fate/v1/lang/computation/IsMemberOperator.java b/src/core/src/tonkadur/fate/v1/lang/computation/IsMemberOperator.java
index 0422dc2..e909213 100644
--- a/src/core/src/tonkadur/fate/v1/lang/computation/IsMemberOperator.java
+++ b/src/core/src/tonkadur/fate/v1/lang/computation/IsMemberOperator.java
@@ -1,18 +1,13 @@
package tonkadur.fate.v1.lang.computation;
-import tonkadur.error.ErrorManager;
-
import tonkadur.parser.Origin;
+import tonkadur.parser.ParsingError;
-import tonkadur.fate.v1.error.ConflictingTypeException;
-import tonkadur.fate.v1.error.IncomparableTypeException;
-import tonkadur.fate.v1.error.InvalidTypeException;
-
-import tonkadur.fate.v1.lang.type.CollectionType;
import tonkadur.fate.v1.lang.type.Type;
import tonkadur.fate.v1.lang.meta.ComputationVisitor;
import tonkadur.fate.v1.lang.meta.Computation;
+import tonkadur.fate.v1.lang.meta.RecurrentChecks;
public class IsMemberOperator extends Computation
{
@@ -49,72 +44,9 @@ public class IsMemberOperator extends Computation
final Computation element,
final Computation collection
)
- throws
- InvalidTypeException,
- ConflictingTypeException,
- IncomparableTypeException
+ throws ParsingError
{
- final Type hint;
- final Type collection_type;
- final CollectionType collection_true_type;
- final Type collection_element_type;
-
- collection_type = collection.get_type();
-
- if (!(collection_type instanceof CollectionType))
- {
- ErrorManager.handle
- (
- new InvalidTypeException
- (
- collection.get_origin(),
- collection.get_type(),
- Type.COLLECTION_TYPES
- )
- );
- }
-
- collection_true_type = (CollectionType) collection_type;
- collection_element_type = collection_true_type.get_content_type();
-
- if
- (
- element.get_type().can_be_used_as(collection_element_type)
- ||
- (element.get_type().try_merging_with(collection_element_type) != null)
- )
- {
- return new IsMemberOperator(origin, element, collection);
- }
-
- ErrorManager.handle
- (
- new ConflictingTypeException
- (
- element.get_origin(),
- element.get_type(),
- collection_element_type
- )
- );
-
- hint =
- (Type) element.get_type().generate_comparable_to
- (
- collection_element_type
- );
-
- if (hint.equals(Type.ANY))
- {
- ErrorManager.handle
- (
- new IncomparableTypeException
- (
- element.get_origin(),
- element.get_type(),
- collection_element_type
- )
- );
- }
+ RecurrentChecks.assert_is_a_collection_of(collection, element);
return new IsMemberOperator(origin, element, collection);
}
@@ -143,7 +75,6 @@ public class IsMemberOperator extends Computation
{
final StringBuilder sb = new StringBuilder();
- sb.append(origin.toString());
sb.append("(IsMemberOperator");
sb.append(System.lineSeparator());
sb.append(System.lineSeparator());
diff --git a/src/core/src/tonkadur/fate/v1/lang/computation/LambdaEvaluation.java b/src/core/src/tonkadur/fate/v1/lang/computation/LambdaEvaluation.java
index 9bdc731..e29ac6b 100644
--- a/src/core/src/tonkadur/fate/v1/lang/computation/LambdaEvaluation.java
+++ b/src/core/src/tonkadur/fate/v1/lang/computation/LambdaEvaluation.java
@@ -1,27 +1,17 @@
package tonkadur.fate.v1.lang.computation;
-import java.util.ArrayList;
-import java.util.Collections;
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.IncompatibleTypeException;
-import tonkadur.fate.v1.error.IncomparableTypeException;
-import tonkadur.fate.v1.error.InvalidArityException;
-import tonkadur.fate.v1.error.InvalidTypeException;
-
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.Reference;
+import tonkadur.fate.v1.lang.meta.RecurrentChecks;
public class LambdaEvaluation extends Computation
{
@@ -59,100 +49,9 @@ public class LambdaEvaluation extends Computation
final Reference reference,
final List<Computation> parameters
)
- throws Throwable
+ throws ParsingError
{
- final Type var_type;
- final LambdaType lambda_type;
- final List<Type> signature;
-
- var_type = reference.get_type();
-
- if (!(var_type instanceof LambdaType))
- {
- ErrorManager.handle
- (
- new InvalidTypeException
- (
- origin,
- var_type,
- Collections.singleton(Type.LAMBDA)
- )
- );
-
- return null;
- }
-
- lambda_type = (LambdaType) var_type;
-
- signature = lambda_type.get_signature();
-
- if (parameters.size() != signature.size())
- {
- ErrorManager.handle
- (
- new InvalidArityException
- (
- origin,
- parameters.size(),
- signature.size(),
- signature.size()
- )
- );
- }
-
- (new Merge<Type, Computation, Boolean>()
- {
- @Override
- public Boolean risky_lambda (final Type t, final Computation p)
- throws ParsingError
- {
- if ((t == null) || (p == null))
- {
- return Boolean.FALSE;
- }
- else
- {
- final Type hint;
-
- if (p.get_type().can_be_used_as(t))
- {
- return Boolean.TRUE;
- }
-
- if (p.get_type().try_merging_with(t) != null)
- {
- return Boolean.TRUE;
- }
-
- ErrorManager.handle
- (
- new IncompatibleTypeException
- (
- p.get_origin(),
- p.get_type(),
- t
- )
- );
-
- hint = (Type) p.get_type().generate_comparable_to(t);
-
- if (hint.equals(Type.ANY))
- {
- ErrorManager.handle
- (
- new IncomparableTypeException
- (
- p.get_origin(),
- p.get_type(),
- t
- )
- );
- }
-
- return Boolean.FALSE;
- }
- }
- }).risky_merge(signature, parameters);
+ RecurrentChecks.assert_lambda_matches_computations(reference, parameters);
return
new LambdaEvaluation
@@ -160,7 +59,7 @@ public class LambdaEvaluation extends Computation
origin,
reference,
parameters,
- lambda_type.get_return_type()
+ (((LambdaType) reference.get_type()).get_return_type())
);
}
diff --git a/src/core/src/tonkadur/fate/v1/lang/computation/MapComputation.java b/src/core/src/tonkadur/fate/v1/lang/computation/MapComputation.java
index c81926e..4cbd2a7 100644
--- a/src/core/src/tonkadur/fate/v1/lang/computation/MapComputation.java
+++ b/src/core/src/tonkadur/fate/v1/lang/computation/MapComputation.java
@@ -1,25 +1,26 @@
package tonkadur.fate.v1.lang.computation;
-import tonkadur.parser.Origin;
+import java.util.Collections;
-import tonkadur.error.ErrorManager;
+import tonkadur.parser.Origin;
+import tonkadur.parser.ParsingError;
import tonkadur.fate.v1.lang.type.Type;
import tonkadur.fate.v1.lang.type.LambdaType;
import tonkadur.fate.v1.lang.type.CollectionType;
-import tonkadur.fate.v1.lang.instruction.Map;
-
import tonkadur.fate.v1.lang.meta.ComputationVisitor;
import tonkadur.fate.v1.lang.meta.Computation;
import tonkadur.fate.v1.lang.meta.Reference;
+import tonkadur.fate.v1.lang.meta.RecurrentChecks;
public class MapComputation extends Computation
{
/***************************************************************************/
/**** MEMBERS **************************************************************/
/***************************************************************************/
- protected final Map instruction;
+ protected final Computation lambda_function;
+ protected final Reference collection;
/***************************************************************************/
/**** PROTECTED ************************************************************/
@@ -27,13 +28,15 @@ public class MapComputation extends Computation
/**** Constructors *********************************************************/
protected MapComputation
(
- final Map instruction,
+ final Origin origin,
+ final Computation lambda_function,
+ final Reference collection,
final Type output_type
)
{
- super(instruction.get_origin(), output_type);
-
- this.instruction = instruction;
+ super(origin, output_type);
+ this.lambda_function = lambda_function;
+ this.collection = collection;
}
/***************************************************************************/
@@ -44,25 +47,34 @@ public class MapComputation extends Computation
(
final Origin origin,
final Computation lambda_function,
- final Reference collection_in
+ final Reference collection
)
- throws Throwable
+ throws ParsingError
{
- final Type type;
- final Map parent;
-
- parent = Map.build(origin, lambda_function, collection_in, null);
+ RecurrentChecks.assert_is_a_collection(collection);
+ RecurrentChecks.assert_lambda_matches_types
+ (
+ lambda_function,
+ Collections.singletonList
+ (
+ ((CollectionType) collection.get_type()).get_content_type()
+ )
+ );
- type =
- CollectionType.build
+ return
+ new MapComputation
(
origin,
- ((LambdaType) lambda_function.get_type()).get_return_type(),
- ((CollectionType) collection_in.get_type()).is_set(),
- "auto generated"
+ lambda_function,
+ collection,
+ CollectionType.build
+ (
+ origin,
+ ((LambdaType) lambda_function.get_type()).get_return_type(),
+ ((CollectionType) collection.get_type()).is_set(),
+ "auto generated"
+ )
);
-
- return new MapComputation(parent, type);
}
/**** Accessors ************************************************************/
@@ -73,9 +85,14 @@ public class MapComputation extends Computation
cv.visit_map(this);
}
- public Map get_instruction ()
+ public Computation get_lambda_function ()
{
- return instruction;
+ return lambda_function;
+ }
+
+ public Reference get_collection ()
+ {
+ return collection;
}
/**** Misc. ****************************************************************/
@@ -84,9 +101,10 @@ public class MapComputation extends Computation
{
final StringBuilder sb = new StringBuilder();
- sb.append("(ComputationOf ");
- sb.append(instruction.toString());
-
+ sb.append("(Map ");
+ sb.append(lambda_function.toString());
+ sb.append(" ");
+ sb.append(collection.toString());
sb.append(")");
return sb.toString();
diff --git a/src/core/src/tonkadur/fate/v1/lang/computation/MergeComputation.java b/src/core/src/tonkadur/fate/v1/lang/computation/MergeComputation.java
index 3b742c1..a4b41b6 100644
--- a/src/core/src/tonkadur/fate/v1/lang/computation/MergeComputation.java
+++ b/src/core/src/tonkadur/fate/v1/lang/computation/MergeComputation.java
@@ -1,8 +1,10 @@
package tonkadur.fate.v1.lang.computation;
-import tonkadur.parser.Origin;
+import java.util.ArrayList;
+import java.util.List;
-import tonkadur.error.ErrorManager;
+import tonkadur.parser.Origin;
+import tonkadur.parser.ParsingError;
import tonkadur.fate.v1.lang.type.Type;
import tonkadur.fate.v1.lang.type.LambdaType;
@@ -13,13 +15,19 @@ import tonkadur.fate.v1.lang.instruction.Merge;
import tonkadur.fate.v1.lang.meta.ComputationVisitor;
import tonkadur.fate.v1.lang.meta.Computation;
import tonkadur.fate.v1.lang.meta.Reference;
+import tonkadur.fate.v1.lang.meta.RecurrentChecks;
public class MergeComputation extends Computation
{
/***************************************************************************/
/**** MEMBERS **************************************************************/
/***************************************************************************/
- protected final Merge instruction;
+ protected final Computation lambda_function;
+ protected final Reference collection_in_a;
+ protected final Computation default_a;
+ protected final Reference collection_in_b;
+ protected final Computation default_b;
+ protected final boolean to_set;
/***************************************************************************/
/**** PROTECTED ************************************************************/
@@ -27,13 +35,24 @@ public class MergeComputation extends Computation
/**** Constructors *********************************************************/
protected MergeComputation
(
- final Merge instruction,
+ final Origin origin,
+ final Computation lambda_function,
+ final Reference collection_in_a,
+ final Computation default_a,
+ final Reference collection_in_b,
+ final Computation default_b,
+ final boolean to_set,
final Type output_type
)
{
- super(instruction.get_origin(), output_type);
-
- this.instruction = instruction;
+ super(origin, output_type);
+
+ this.lambda_function = lambda_function;
+ this.collection_in_a = collection_in_a;
+ this.default_a = default_a;
+ this.collection_in_b = collection_in_b;
+ this.default_b = default_b;
+ this.to_set = to_set;
}
/***************************************************************************/
@@ -47,15 +66,47 @@ public class MergeComputation extends Computation
final Reference collection_in_a,
final Computation default_a,
final Reference collection_in_b,
- final Computation default_b
+ final Computation default_b,
+ final boolean to_set
)
throws Throwable
{
- final Type type;
- final Merge parent;
-
- parent =
- Merge.build
+ final List<Type> types_in;
+
+ types_in = new ArrayList<Type>();
+
+ if (default_a == null)
+ {
+ RecurrentChecks.assert_is_a_collection(collection_in_a);
+ }
+ else
+ {
+ RecurrentChecks.assert_is_a_collection_of(collection_in_a, default_a);
+ }
+
+ if (default_b == null)
+ {
+ RecurrentChecks.assert_is_a_collection(collection_in_b);
+ }
+ else
+ {
+ RecurrentChecks.assert_is_a_collection_of(collection_in_b, default_b);
+ }
+
+ types_in.add
+ (
+ ((CollectionType) collection_in_a.get_type()).get_content_type()
+ );
+
+ types_in.add
+ (
+ ((CollectionType) collection_in_b.get_type()).get_content_type()
+ );
+
+ RecurrentChecks.assert_lambda_matches_types(lambda_function, types_in);
+
+ return
+ new MergeComputation
(
origin,
lambda_function,
@@ -63,22 +114,15 @@ public class MergeComputation extends Computation
default_a,
collection_in_b,
default_b,
- null
- );
-
- type =
- CollectionType.build
- (
- origin,
- ((LambdaType) lambda_function.get_type()).get_return_type(),
+ to_set,
+ CollectionType.build
(
- ((CollectionType) collection_in_a.get_type()).is_set()
- || ((CollectionType) collection_in_b.get_type()).is_set()
- ),
- "auto generated"
+ origin,
+ ((LambdaType) lambda_function.get_type()).get_return_type(),
+ to_set,
+ "auto generated"
+ )
);
-
- return new MergeComputation(parent, type);
}
/**** Accessors ************************************************************/
@@ -89,9 +133,34 @@ public class MergeComputation extends Computation
cv.visit_merge(this);
}
- public Merge get_instruction ()
+ public Computation get_lambda_function ()
+ {
+ return lambda_function;
+ }
+
+ public Reference get_collection_in_a ()
+ {
+ return collection_in_a;
+ }
+
+ public Computation get_default_a ()
+ {
+ return default_a;
+ }
+
+ public Reference get_collection_in_b ()
+ {
+ return collection_in_b;
+ }
+
+ public Computation get_default_b ()
+ {
+ return default_b;
+ }
+
+ public boolean to_set ()
{
- return instruction;
+ return to_set;
}
/**** Misc. ****************************************************************/
@@ -100,8 +169,41 @@ public class MergeComputation extends Computation
{
final StringBuilder sb = new StringBuilder();
- sb.append("(ComputationOf ");
- sb.append(instruction.toString());
+ if (to_set)
+ {
+ sb.append("(MergeToSet ");
+ }
+ else
+ {
+ sb.append("(MergeToList ");
+ }
+
+ sb.append(lambda_function.toString());
+ sb.append(" ");
+ sb.append(collection_in_a.toString());
+ sb.append(" ");
+
+ if (default_a == null)
+ {
+ sb.append("null");
+ }
+ else
+ {
+ sb.append(default_a.toString());
+ }
+
+ sb.append(" ");
+ sb.append(collection_in_b.toString());
+ sb.append(" ");
+
+ if (default_b == null)
+ {
+ sb.append("null");
+ }
+ else
+ {
+ sb.append(default_b.toString());
+ }
sb.append(")");
diff --git a/src/core/src/tonkadur/fate/v1/lang/computation/PartitionComputation.java b/src/core/src/tonkadur/fate/v1/lang/computation/PartitionComputation.java
index ed578dd..a30a893 100644
--- a/src/core/src/tonkadur/fate/v1/lang/computation/PartitionComputation.java
+++ b/src/core/src/tonkadur/fate/v1/lang/computation/PartitionComputation.java
@@ -1,26 +1,26 @@
package tonkadur.fate.v1.lang.computation;
-import tonkadur.parser.Origin;
+import java.util.Collections;
-import tonkadur.error.ErrorManager;
+import tonkadur.parser.Origin;
+import tonkadur.parser.ParsingError;
import tonkadur.fate.v1.lang.type.CollectionType;
import tonkadur.fate.v1.lang.type.ConsType;
-import tonkadur.fate.v1.lang.type.LambdaType;
import tonkadur.fate.v1.lang.type.Type;
-import tonkadur.fate.v1.lang.instruction.Partition;
-
import tonkadur.fate.v1.lang.meta.ComputationVisitor;
import tonkadur.fate.v1.lang.meta.Computation;
import tonkadur.fate.v1.lang.meta.Reference;
+import tonkadur.fate.v1.lang.meta.RecurrentChecks;
public class PartitionComputation extends Computation
{
/***************************************************************************/
/**** MEMBERS **************************************************************/
/***************************************************************************/
- protected final Partition instruction;
+ protected final Computation lambda_function;
+ protected final Reference collection;
/***************************************************************************/
/**** PROTECTED ************************************************************/
@@ -28,13 +28,16 @@ public class PartitionComputation extends Computation
/**** Constructors *********************************************************/
protected PartitionComputation
(
- final Partition instruction,
+ final Origin origin,
+ final Computation lambda_function,
+ final Reference collection,
final Type output_type
)
{
- super(instruction.get_origin(), output_type);
+ super(origin, output_type);
- this.instruction = instruction;
+ this.lambda_function = lambda_function;
+ this.collection = collection;
}
/***************************************************************************/
@@ -45,32 +48,41 @@ public class PartitionComputation extends Computation
(
final Origin origin,
final Computation lambda_function,
- final Reference collection_in
+ final Reference collection
)
throws Throwable
{
final Type type;
- final Partition parent;
- parent =
- Partition.build
+ RecurrentChecks.assert_is_a_collection(collection);
+
+ RecurrentChecks.assert_lambda_matches_types
+ (
+ lambda_function,
+ Type.BOOL,
+ Collections.singletonList
(
- origin,
- lambda_function,
- collection_in,
- null
- );
+ ((CollectionType) collection.get_type()).get_content_type()
+ )
+ );
type =
new ConsType
(
origin,
- collection_in.get_type(),
- collection_in.get_type(),
+ collection.get_type(),
+ collection.get_type(),
"auto generated"
);
- return new PartitionComputation(parent, type);
+ return
+ new PartitionComputation
+ (
+ origin,
+ lambda_function,
+ collection,
+ type
+ );
}
/**** Accessors ************************************************************/
@@ -81,9 +93,14 @@ public class PartitionComputation extends Computation
cv.visit_partition(this);
}
- public Partition get_instruction ()
+ public Computation get_lambda_function ()
{
- return instruction;
+ return lambda_function;
+ }
+
+ public Reference get_collection ()
+ {
+ return collection;
}
/**** Misc. ****************************************************************/
@@ -92,9 +109,10 @@ public class PartitionComputation extends Computation
{
final StringBuilder sb = new StringBuilder();
- sb.append("(ComputationOf ");
- sb.append(instruction.toString());
-
+ sb.append("(Partition ");
+ sb.append(lambda_function.toString());
+ sb.append(" ");
+ sb.append(collection.toString());
sb.append(")");
return sb.toString();
diff --git a/src/core/src/tonkadur/fate/v1/lang/computation/PopElementComputation.java b/src/core/src/tonkadur/fate/v1/lang/computation/PopElementComputation.java
index 6e0a7f0..5d50018 100644
--- a/src/core/src/tonkadur/fate/v1/lang/computation/PopElementComputation.java
+++ b/src/core/src/tonkadur/fate/v1/lang/computation/PopElementComputation.java
@@ -1,20 +1,19 @@
package tonkadur.fate.v1.lang.computation;
import tonkadur.parser.Origin;
-
-import tonkadur.fate.v1.error.InvalidTypeException;
-
-import tonkadur.fate.v1.lang.instruction.PopElement;
+import tonkadur.parser.ParsingError;
import tonkadur.fate.v1.lang.meta.ComputationVisitor;
import tonkadur.fate.v1.lang.meta.Computation;
+import tonkadur.fate.v1.lang.meta.RecurrentChecks;
public class PopElementComputation extends Computation
{
/***************************************************************************/
/**** MEMBERS **************************************************************/
/***************************************************************************/
- protected final PopElement instruction;
+ protected final Computation collection;
+ protected final boolean is_from_left;
/***************************************************************************/
/**** PROTECTED ************************************************************/
@@ -22,12 +21,15 @@ public class PopElementComputation extends Computation
/**** Constructors *********************************************************/
protected PopElementComputation
(
- final PopElement instruction
+ final Origin origin,
+ final Computation collection,
+ final boolean is_from_left
)
{
- super(instruction.get_origin(), instruction.get_collection().get_type());
+ super(origin, collection.get_type());
- this.instruction = instruction;
+ this.collection = collection;
+ this.is_from_left = is_from_left;
}
/***************************************************************************/
@@ -40,14 +42,11 @@ public class PopElementComputation extends Computation
final Computation collection,
final boolean is_from_left
)
- throws
- InvalidTypeException
+ throws ParsingError
{
- return
- new PopElementComputation
- (
- PopElement.build(origin, collection, is_from_left)
- );
+ RecurrentChecks.assert_is_a_collection(collection);
+
+ return new PopElementComputation(origin, collection, is_from_left);
}
/**** Accessors ************************************************************/
@@ -58,9 +57,14 @@ public class PopElementComputation extends Computation
cv.visit_pop_element(this);
}
- public PopElement get_instruction ()
+ public Computation get_collection ()
{
- return instruction;
+ return collection;
+ }
+
+ public boolean is_from_left ()
+ {
+ return is_from_left;
}
/**** Misc. ****************************************************************/
@@ -69,8 +73,16 @@ public class PopElementComputation extends Computation
{
final StringBuilder sb = new StringBuilder();
- sb.append("(ComputationOf ");
- sb.append(instruction.toString());
+ if (is_from_left)
+ {
+ sb.append("(PopLeftElement ");
+ }
+ else
+ {
+ sb.append("(PopRightElement ");
+ }
+
+ sb.append(collection.toString());
sb.append(")");
diff --git a/src/core/src/tonkadur/fate/v1/lang/computation/PushElementComputation.java b/src/core/src/tonkadur/fate/v1/lang/computation/PushElementComputation.java
index 5347f0a..f13e1c7 100644
--- a/src/core/src/tonkadur/fate/v1/lang/computation/PushElementComputation.java
+++ b/src/core/src/tonkadur/fate/v1/lang/computation/PushElementComputation.java
@@ -1,22 +1,20 @@
package tonkadur.fate.v1.lang.computation;
import tonkadur.parser.Origin;
-
-import tonkadur.fate.v1.error.ConflictingTypeException;
-import tonkadur.fate.v1.error.IncomparableTypeException;
-import tonkadur.fate.v1.error.InvalidTypeException;
-
-import tonkadur.fate.v1.lang.instruction.PushElement;
+import tonkadur.parser.ParsingError;
import tonkadur.fate.v1.lang.meta.ComputationVisitor;
import tonkadur.fate.v1.lang.meta.Computation;
+import tonkadur.fate.v1.lang.meta.RecurrentChecks;
public class PushElementComputation extends Computation
{
/***************************************************************************/
/**** MEMBERS **************************************************************/
/***************************************************************************/
- protected final PushElement instruction;
+ protected final Computation element;
+ protected final Computation collection;
+ protected final boolean is_from_left;
/***************************************************************************/
/**** PROTECTED ************************************************************/
@@ -24,12 +22,17 @@ public class PushElementComputation extends Computation
/**** Constructors *********************************************************/
protected PushElementComputation
(
- final PushElement instruction
+ final Origin origin,
+ final Computation element,
+ final Computation collection,
+ final boolean is_from_left
)
{
- super(instruction.get_origin(), instruction.get_collection().get_type());
+ super(origin, collection.get_type());
- this.instruction = instruction;
+ this.collection = collection;
+ this.element = element;
+ this.is_from_left = is_from_left;
}
/***************************************************************************/
@@ -43,15 +46,15 @@ public class PushElementComputation extends Computation
final Computation collection,
final boolean is_from_left
)
- throws
- InvalidTypeException,
- ConflictingTypeException,
- IncomparableTypeException
+ throws ParsingError
{
return
new PushElementComputation
(
- PushElement.build(origin, element, collection, is_from_left)
+ origin,
+ element,
+ collection,
+ is_from_left
);
}
@@ -63,9 +66,19 @@ public class PushElementComputation extends Computation
cv.visit_push_element(this);
}
- public PushElement get_instruction ()
+ public Computation get_collection ()
{
- return instruction;
+ return collection;
+ }
+
+ public Computation get_element ()
+ {
+ return element;
+ }
+
+ public boolean is_from_left ()
+ {
+ return is_from_left;
}
/**** Misc. ****************************************************************/
@@ -74,8 +87,27 @@ public class PushElementComputation extends Computation
{
final StringBuilder sb = new StringBuilder();
- sb.append("(ComputationOf ");
- sb.append(instruction.toString());
+ if (is_from_left)
+ {
+ sb.append("(LeftPushElement");
+ }
+ else
+ {
+ sb.append("(RightPushElement");
+ }
+
+ sb.append(System.lineSeparator());
+ sb.append(System.lineSeparator());
+
+ sb.append("element:");
+ sb.append(System.lineSeparator());
+ sb.append(element.toString());
+ sb.append(System.lineSeparator());
+ sb.append(System.lineSeparator());
+
+ sb.append("collection:");
+ sb.append(System.lineSeparator());
+ sb.append(collection.toString());
sb.append(")");
diff --git a/src/core/src/tonkadur/fate/v1/lang/computation/Range.java b/src/core/src/tonkadur/fate/v1/lang/computation/Range.java
index 257a722..736ecf7 100644
--- a/src/core/src/tonkadur/fate/v1/lang/computation/Range.java
+++ b/src/core/src/tonkadur/fate/v1/lang/computation/Range.java
@@ -1,18 +1,14 @@
package tonkadur.fate.v1.lang.computation;
-import java.util.Collections;
-
-import tonkadur.error.ErrorManager;
-
import tonkadur.parser.Origin;
-
-import tonkadur.fate.v1.error.InvalidTypeException;
+import tonkadur.parser.ParsingError;
import tonkadur.fate.v1.lang.type.CollectionType;
import tonkadur.fate.v1.lang.type.Type;
import tonkadur.fate.v1.lang.meta.ComputationVisitor;
import tonkadur.fate.v1.lang.meta.Computation;
+import tonkadur.fate.v1.lang.meta.RecurrentChecks;
public class Range extends Computation
{
@@ -54,46 +50,11 @@ public class Range extends Computation
final Computation end,
final Computation increment
)
- throws InvalidTypeException
+ throws ParsingError
{
- if (!start.get_type().can_be_used_as(Type.INT))
- {
- ErrorManager.handle
- (
- new InvalidTypeException
- (
- start.get_origin(),
- start.get_type(),
- Collections.singletonList(Type.INT)
- )
- );
- }
-
- if (!end.get_type().can_be_used_as(Type.INT))
- {
- ErrorManager.handle
- (
- new InvalidTypeException
- (
- end.get_origin(),
- end.get_type(),
- Collections.singletonList(Type.INT)
- )
- );
- }
-
- if (!increment.get_type().can_be_used_as(Type.INT))
- {
- ErrorManager.handle
- (
- new InvalidTypeException
- (
- increment.get_origin(),
- increment.get_type(),
- Collections.singletonList(Type.INT)
- )
- );
- }
+ RecurrentChecks.assert_can_be_used_as(start, Type.INT);
+ RecurrentChecks.assert_can_be_used_as(end, Type.INT);
+ RecurrentChecks.assert_can_be_used_as(increment, Type.INT);
return
new Range
diff --git a/src/core/src/tonkadur/fate/v1/lang/computation/RemoveAllOfElementComputation.java b/src/core/src/tonkadur/fate/v1/lang/computation/RemoveAllOfElementComputation.java
index fb6b9da..6220875 100644
--- a/src/core/src/tonkadur/fate/v1/lang/computation/RemoveAllOfElementComputation.java
+++ b/src/core/src/tonkadur/fate/v1/lang/computation/RemoveAllOfElementComputation.java
@@ -1,23 +1,20 @@
package tonkadur.fate.v1.lang.computation;
import tonkadur.parser.Origin;
-
-import tonkadur.fate.v1.error.ConflictingTypeException;
-import tonkadur.fate.v1.error.IncomparableTypeException;
-import tonkadur.fate.v1.error.InvalidTypeException;
-
-import tonkadur.fate.v1.lang.instruction.RemoveAllOfElement;
+import tonkadur.parser.ParsingError;
import tonkadur.fate.v1.lang.meta.ComputationVisitor;
import tonkadur.fate.v1.lang.meta.Computation;
import tonkadur.fate.v1.lang.meta.Reference;
+import tonkadur.fate.v1.lang.meta.RecurrentChecks;
public class RemoveAllOfElementComputation extends Computation
{
/***************************************************************************/
/**** MEMBERS **************************************************************/
/***************************************************************************/
- protected final RemoveAllOfElement instruction;
+ protected final Computation element;
+ protected final Reference collection;
/***************************************************************************/
/**** PROTECTED ************************************************************/
@@ -25,12 +22,15 @@ public class RemoveAllOfElementComputation extends Computation
/**** Constructors *********************************************************/
protected RemoveAllOfElementComputation
(
- final RemoveAllOfElement instruction
+ final Origin origin,
+ final Computation element,
+ final Reference collection
)
{
- super(instruction.get_origin(), instruction.get_collection().get_type());
+ super(origin, collection.get_type());
- this.instruction = instruction;
+ this.collection = collection;
+ this.element = element;
}
/***************************************************************************/
/**** PUBLIC ***************************************************************/
@@ -42,16 +42,11 @@ public class RemoveAllOfElementComputation extends Computation
final Computation element,
final Reference collection
)
- throws
- InvalidTypeException,
- ConflictingTypeException,
- IncomparableTypeException
+ throws ParsingError
{
- return
- new RemoveAllOfElementComputation
- (
- RemoveAllOfElement.build(origin, element, collection)
- );
+ RecurrentChecks.assert_is_a_collection_of(collection, element);
+
+ return new RemoveAllOfElementComputation(origin, element, collection);
}
/**** Accessors ************************************************************/
@@ -62,9 +57,14 @@ public class RemoveAllOfElementComputation extends Computation
cv.visit_remove_all_of_element(this);
}
- public RemoveAllOfElement get_instruction ()
+ public Computation get_element ()
{
- return instruction;
+ return element;
+ }
+
+ public Reference get_collection ()
+ {
+ return collection;
}
/**** Misc. ****************************************************************/
@@ -73,8 +73,19 @@ public class RemoveAllOfElementComputation extends Computation
{
final StringBuilder sb = new StringBuilder();
- sb.append("(ComputationOf ");
- sb.append(instruction.toString());
+ sb.append("(RemoveAllOfElement");
+ sb.append(System.lineSeparator());
+ sb.append(System.lineSeparator());
+
+ sb.append("element:");
+ sb.append(System.lineSeparator());
+ sb.append(element.toString());
+ sb.append(System.lineSeparator());
+ sb.append(System.lineSeparator());
+
+ sb.append("collection:");
+ sb.append(System.lineSeparator());
+ sb.append(collection.toString());
sb.append(")");
diff --git a/src/core/src/tonkadur/fate/v1/lang/computation/RemoveElementAtComputation.java b/src/core/src/tonkadur/fate/v1/lang/computation/RemoveElementAtComputation.java
index 4a87a02..837af0e 100644
--- a/src/core/src/tonkadur/fate/v1/lang/computation/RemoveElementAtComputation.java
+++ b/src/core/src/tonkadur/fate/v1/lang/computation/RemoveElementAtComputation.java
@@ -1,23 +1,22 @@
package tonkadur.fate.v1.lang.computation;
import tonkadur.parser.Origin;
+import tonkadur.parser.ParsingError;
-import tonkadur.fate.v1.error.ConflictingTypeException;
-import tonkadur.fate.v1.error.IncomparableTypeException;
-import tonkadur.fate.v1.error.InvalidTypeException;
-
-import tonkadur.fate.v1.lang.instruction.RemoveElementAt;
+import tonkadur.fate.v1.lang.type.Type;
import tonkadur.fate.v1.lang.meta.ComputationVisitor;
import tonkadur.fate.v1.lang.meta.Computation;
import tonkadur.fate.v1.lang.meta.Reference;
+import tonkadur.fate.v1.lang.meta.RecurrentChecks;
public class RemoveElementAtComputation extends Computation
{
/***************************************************************************/
/**** MEMBERS **************************************************************/
/***************************************************************************/
- protected final RemoveElementAt instruction;
+ protected final Computation index;
+ protected final Reference collection;
/***************************************************************************/
/**** PROTECTED ************************************************************/
@@ -25,12 +24,15 @@ public class RemoveElementAtComputation extends Computation
/**** Constructors *********************************************************/
protected RemoveElementAtComputation
(
- final RemoveElementAt instruction
+ final Origin origin,
+ final Computation index,
+ final Reference collection
)
{
- super(instruction.get_origin(), instruction.get_collection().get_type());
+ super(origin, collection.get_type());
- this.instruction = instruction;
+ this.collection = collection;
+ this.index = index;
}
/***************************************************************************/
@@ -43,15 +45,12 @@ public class RemoveElementAtComputation extends Computation
final Computation index,
final Reference collection
)
- throws
- InvalidTypeException,
- IncomparableTypeException
+ throws ParsingError
{
- return
- new RemoveElementAtComputation
- (
- RemoveElementAt.build(origin, index, collection)
- );
+ RecurrentChecks.assert_is_a_collection(collection);
+ RecurrentChecks.assert_can_be_used_as(index, Type.INT);
+
+ return new RemoveElementAtComputation(origin, index, collection);
}
/**** Accessors ************************************************************/
@@ -62,9 +61,14 @@ public class RemoveElementAtComputation extends Computation
cv.visit_remove_element_at(this);
}
- public RemoveElementAt get_instruction ()
+ public Computation get_index ()
{
- return instruction;
+ return index;
+ }
+
+ public Reference get_collection ()
+ {
+ return collection;
}
/**** Misc. ****************************************************************/
@@ -73,8 +77,19 @@ public class RemoveElementAtComputation extends Computation
{
final StringBuilder sb = new StringBuilder();
- sb.append("(ComputationOf ");
- sb.append(instruction.toString());
+ sb.append("(RemoveElementAt");
+ sb.append(System.lineSeparator());
+ sb.append(System.lineSeparator());
+
+ sb.append("index:");
+ sb.append(System.lineSeparator());
+ sb.append(index.toString());
+ sb.append(System.lineSeparator());
+ sb.append(System.lineSeparator());
+
+ sb.append("collection:");
+ sb.append(System.lineSeparator());
+ sb.append(collection.toString());
sb.append(")");
diff --git a/src/core/src/tonkadur/fate/v1/lang/computation/RemoveElementComputation.java b/src/core/src/tonkadur/fate/v1/lang/computation/RemoveElementComputation.java
index e3acd4b..cb9c275 100644
--- a/src/core/src/tonkadur/fate/v1/lang/computation/RemoveElementComputation.java
+++ b/src/core/src/tonkadur/fate/v1/lang/computation/RemoveElementComputation.java
@@ -1,23 +1,20 @@
package tonkadur.fate.v1.lang.computation;
import tonkadur.parser.Origin;
-
-import tonkadur.fate.v1.error.ConflictingTypeException;
-import tonkadur.fate.v1.error.IncomparableTypeException;
-import tonkadur.fate.v1.error.InvalidTypeException;
-
-import tonkadur.fate.v1.lang.instruction.RemoveElement;
+import tonkadur.parser.ParsingError;
import tonkadur.fate.v1.lang.meta.ComputationVisitor;
import tonkadur.fate.v1.lang.meta.Computation;
import tonkadur.fate.v1.lang.meta.Reference;
+import tonkadur.fate.v1.lang.meta.RecurrentChecks;
public class RemoveElementComputation extends Computation
{
/***************************************************************************/
/**** MEMBERS **************************************************************/
/***************************************************************************/
- protected final RemoveElement instruction;
+ protected final Computation element;
+ protected final Computation collection;
/***************************************************************************/
/**** PROTECTED ************************************************************/
@@ -25,12 +22,15 @@ public class RemoveElementComputation extends Computation
/**** Constructors *********************************************************/
protected RemoveElementComputation
(
- final RemoveElement instruction
+ final Origin origin,
+ final Computation element,
+ final Computation collection
)
{
- super(instruction.get_origin(), instruction.get_collection().get_type());
+ super(origin, collection.get_type());
- this.instruction = instruction;
+ this.collection = collection;
+ this.element = element;
}
/***************************************************************************/
/**** PUBLIC ***************************************************************/
@@ -42,16 +42,11 @@ public class RemoveElementComputation extends Computation
final Computation element,
final Reference collection
)
- throws
- InvalidTypeException,
- ConflictingTypeException,
- IncomparableTypeException
+ throws ParsingError
{
- return
- new RemoveElementComputation
- (
- RemoveElement.build(origin, element, collection)
- );
+ RecurrentChecks.assert_is_a_collection_of(collection, element);
+
+ return new RemoveElementComputation(origin, element, collection);
}
/**** Accessors ************************************************************/
@@ -62,9 +57,14 @@ public class RemoveElementComputation extends Computation
cv.visit_remove_element(this);
}
- public RemoveElement get_instruction ()
+ public Computation get_element ()
{
- return instruction;
+ return element;
+ }
+
+ public Computation get_collection ()
+ {
+ return collection;
}
/**** Misc. ****************************************************************/
@@ -73,8 +73,19 @@ public class RemoveElementComputation extends Computation
{
final StringBuilder sb = new StringBuilder();
- sb.append("(ComputationOf ");
- sb.append(instruction.toString());
+ sb.append("(RemoveElement");
+ sb.append(System.lineSeparator());
+ sb.append(System.lineSeparator());
+
+ sb.append("element:");
+ sb.append(System.lineSeparator());
+ sb.append(element.toString());
+ sb.append(System.lineSeparator());
+ sb.append(System.lineSeparator());
+
+ sb.append("collection:");
+ sb.append(System.lineSeparator());
+ sb.append(collection.toString());
sb.append(")");
diff --git a/src/core/src/tonkadur/fate/v1/lang/computation/ReverseListComputation.java b/src/core/src/tonkadur/fate/v1/lang/computation/ReverseListComputation.java
index 022633a..2d23e5c 100644
--- a/src/core/src/tonkadur/fate/v1/lang/computation/ReverseListComputation.java
+++ b/src/core/src/tonkadur/fate/v1/lang/computation/ReverseListComputation.java
@@ -1,20 +1,21 @@
package tonkadur.fate.v1.lang.computation;
import tonkadur.parser.Origin;
+import tonkadur.parser.ParsingError;
-import tonkadur.fate.v1.error.InvalidTypeException;
-
-import tonkadur.fate.v1.lang.instruction.ReverseList;
+import tonkadur.fate.v1.lang.type.CollectionType;
+import tonkadur.fate.v1.lang.type.Type;
import tonkadur.fate.v1.lang.meta.ComputationVisitor;
import tonkadur.fate.v1.lang.meta.Computation;
+import tonkadur.fate.v1.lang.meta.RecurrentChecks;
public class ReverseListComputation extends Computation
{
/***************************************************************************/
/**** MEMBERS **************************************************************/
/***************************************************************************/
- protected final ReverseList instruction;
+ protected final Computation collection;
/***************************************************************************/
/**** PROTECTED ************************************************************/
@@ -22,12 +23,14 @@ public class ReverseListComputation extends Computation
/**** Constructors *********************************************************/
protected ReverseListComputation
(
- final ReverseList instruction
+ final Origin origin,
+ final Computation collection,
+ final Type result_type
)
{
- super(instruction.get_origin(), instruction.get_collection().get_type());
+ super(origin, result_type);
- this.instruction = instruction;
+ this.collection = collection;
}
/***************************************************************************/
@@ -39,13 +42,23 @@ public class ReverseListComputation extends Computation
final Origin origin,
final Computation collection
)
- throws InvalidTypeException
+ throws ParsingError
{
- /*
- * FIXME: this computation should accept any collection type, and return a
- * list, which is not the case of ReverseList.build
- */
- return new ReverseListComputation(ReverseList.build(origin, collection));
+ RecurrentChecks.assert_is_a_collection(collection);
+
+ return
+ new ReverseListComputation
+ (
+ origin,
+ collection,
+ CollectionType.build
+ (
+ origin,
+ (((CollectionType) collection.get_type()).get_content_type()),
+ false,
+ "auto generated"
+ )
+ );
}
/**** Accessors ************************************************************/
@@ -56,9 +69,9 @@ public class ReverseListComputation extends Computation
cv.visit_reverse_list(this);
}
- public ReverseList get_instruction ()
+ public Computation get_collection ()
{
- return instruction;
+ return collection;
}
/**** Misc. ****************************************************************/
@@ -67,8 +80,8 @@ public class ReverseListComputation extends Computation
{
final StringBuilder sb = new StringBuilder();
- sb.append("(ComputationOf ");
- sb.append(instruction.toString());
+ sb.append("(ReverseList ");
+ sb.append(collection.toString());
sb.append(")");
diff --git a/src/core/src/tonkadur/fate/v1/lang/computation/ShuffleComputation.java b/src/core/src/tonkadur/fate/v1/lang/computation/ShuffleComputation.java
index b9b42a0..41a747e 100644
--- a/src/core/src/tonkadur/fate/v1/lang/computation/ShuffleComputation.java
+++ b/src/core/src/tonkadur/fate/v1/lang/computation/ShuffleComputation.java
@@ -1,20 +1,21 @@
package tonkadur.fate.v1.lang.computation;
import tonkadur.parser.Origin;
+import tonkadur.parser.ParsingError;
-import tonkadur.fate.v1.error.InvalidTypeException;
-
-import tonkadur.fate.v1.lang.instruction.Shuffle;
+import tonkadur.fate.v1.lang.type.CollectionType;
+import tonkadur.fate.v1.lang.type.Type;
import tonkadur.fate.v1.lang.meta.ComputationVisitor;
import tonkadur.fate.v1.lang.meta.Computation;
+import tonkadur.fate.v1.lang.meta.RecurrentChecks;
public class ShuffleComputation extends Computation
{
/***************************************************************************/
/**** MEMBERS **************************************************************/
/***************************************************************************/
- protected final Shuffle instruction;
+ protected final Computation collection;
/***************************************************************************/
/**** PROTECTED ************************************************************/
@@ -22,12 +23,14 @@ public class ShuffleComputation extends Computation
/**** Constructors *********************************************************/
protected ShuffleComputation
(
- final Shuffle instruction
+ final Origin origin,
+ final Computation collection,
+ final Type result_type
)
{
- super(instruction.get_origin(), instruction.get_collection().get_type());
+ super(origin, result_type);
- this.instruction = instruction;
+ this.collection = collection;
}
/***************************************************************************/
@@ -39,13 +42,23 @@ public class ShuffleComputation extends Computation
final Origin origin,
final Computation collection
)
- throws InvalidTypeException
+ throws ParsingError
{
- /*
- * FIXME: this computation should accept any collection type, and return a
- * list, which is not the case of Shuffle.build
- */
- return new ShuffleComputation(Shuffle.build(origin, collection));
+ RecurrentChecks.assert_is_a_collection(collection);
+
+ return
+ new ShuffleComputation
+ (
+ origin,
+ collection,
+ CollectionType.build
+ (
+ origin,
+ (((CollectionType) collection.get_type()).get_content_type()),
+ false,
+ "auto generated"
+ )
+ );
}
/**** Accessors ************************************************************/
@@ -56,9 +69,9 @@ public class ShuffleComputation extends Computation
cv.visit_shuffle(this);
}
- public Shuffle get_instruction ()
+ public Computation get_collection ()
{
- return instruction;
+ return collection;
}
/**** Misc. ****************************************************************/
@@ -67,8 +80,8 @@ public class ShuffleComputation extends Computation
{
final StringBuilder sb = new StringBuilder();
- sb.append("(ComputationOf ");
- sb.append(instruction.toString());
+ sb.append("(Shuffle ");
+ sb.append(collection.toString());
sb.append(")");
diff --git a/src/core/src/tonkadur/fate/v1/lang/computation/SizeOperator.java b/src/core/src/tonkadur/fate/v1/lang/computation/SizeOperator.java
index 9882b31..a80efcf 100644
--- a/src/core/src/tonkadur/fate/v1/lang/computation/SizeOperator.java
+++ b/src/core/src/tonkadur/fate/v1/lang/computation/SizeOperator.java
@@ -1,16 +1,13 @@
package tonkadur.fate.v1.lang.computation;
-import tonkadur.error.ErrorManager;
-
import tonkadur.parser.Origin;
+import tonkadur.parser.ParsingError;
-import tonkadur.fate.v1.error.InvalidTypeException;
-
-import tonkadur.fate.v1.lang.type.CollectionType;
import tonkadur.fate.v1.lang.type.Type;
import tonkadur.fate.v1.lang.meta.ComputationVisitor;
import tonkadur.fate.v1.lang.meta.Computation;
+import tonkadur.fate.v1.lang.meta.RecurrentChecks;
public class SizeOperator extends Computation
{
@@ -43,21 +40,9 @@ public class SizeOperator extends Computation
final Origin origin,
final Computation collection
)
- throws InvalidTypeException
+ throws ParsingError
{
-
- if (!(collection.get_type() instanceof CollectionType))
- {
- ErrorManager.handle
- (
- new InvalidTypeException
- (
- collection.get_origin(),
- collection.get_type(),
- Type.COLLECTION_TYPES
- )
- );
- }
+ RecurrentChecks.assert_is_a_collection(collection);
return new SizeOperator(origin, collection);
}
diff --git a/src/core/src/tonkadur/fate/v1/lang/computation/SortComputation.java b/src/core/src/tonkadur/fate/v1/lang/computation/SortComputation.java
index fab922b..7131c8b 100644
--- a/src/core/src/tonkadur/fate/v1/lang/computation/SortComputation.java
+++ b/src/core/src/tonkadur/fate/v1/lang/computation/SortComputation.java
@@ -1,11 +1,12 @@
package tonkadur.fate.v1.lang.computation;
-import tonkadur.parser.Origin;
+import java.util.ArrayList;
+import java.util.List;
-import tonkadur.error.ErrorManager;
+import tonkadur.parser.Origin;
+import tonkadur.parser.ParsingError;
import tonkadur.fate.v1.lang.type.Type;
-import tonkadur.fate.v1.lang.type.LambdaType;
import tonkadur.fate.v1.lang.type.CollectionType;
import tonkadur.fate.v1.lang.instruction.Sort;
@@ -13,13 +14,15 @@ import tonkadur.fate.v1.lang.instruction.Sort;
import tonkadur.fate.v1.lang.meta.ComputationVisitor;
import tonkadur.fate.v1.lang.meta.Computation;
import tonkadur.fate.v1.lang.meta.Reference;
+import tonkadur.fate.v1.lang.meta.RecurrentChecks;
public class SortComputation extends Computation
{
/***************************************************************************/
/**** MEMBERS **************************************************************/
/***************************************************************************/
- protected final Sort instruction;
+ protected final Computation lambda_function;
+ protected final Reference collection;
/***************************************************************************/
/**** PROTECTED ************************************************************/
@@ -27,16 +30,15 @@ public class SortComputation extends Computation
/**** Constructors *********************************************************/
protected SortComputation
(
- final Sort instruction
+ final Origin origin,
+ final Computation lambda_function,
+ final Reference collection
)
{
- super
- (
- instruction.get_origin(),
- instruction.get_collection().get_type()
- );
+ super(origin, collection.get_type());
- this.instruction = instruction;
+ this.lambda_function = lambda_function;
+ this.collection = collection;
}
/***************************************************************************/
@@ -49,13 +51,25 @@ public class SortComputation extends Computation
final Computation lambda_function,
final Reference collection
)
- throws Throwable
+ throws ParsingError
{
- final Sort parent;
+ final List<Type> types_in;
+
+ types_in = new ArrayList<Type>();
- parent = Sort.build(origin, lambda_function, collection);
+ RecurrentChecks.assert_is_a_list(collection);
- return new SortComputation(parent);
+ types_in.add(((CollectionType) collection.get_type()).get_content_type());
+ types_in.add(types_in.get(0));
+
+ RecurrentChecks.assert_lambda_matches_types
+ (
+ lambda_function,
+ Type.INT,
+ types_in
+ );
+
+ return new SortComputation(origin, lambda_function, collection);
}
/**** Accessors ************************************************************/
@@ -66,9 +80,14 @@ public class SortComputation extends Computation
cv.visit_sort(this);
}
- public Sort get_instruction ()
+ public Computation get_lambda_function ()
{
- return instruction;
+ return lambda_function;
+ }
+
+ public Reference get_collection ()
+ {
+ return collection;
}
/**** Misc. ****************************************************************/
@@ -77,9 +96,10 @@ public class SortComputation extends Computation
{
final StringBuilder sb = new StringBuilder();
- sb.append("(ComputationOf ");
- sb.append(instruction.toString());
-
+ sb.append("(Sort ");
+ sb.append(lambda_function.toString());
+ sb.append(" ");
+ sb.append(collection.toString());
sb.append(")");
return sb.toString();
diff --git a/src/core/src/tonkadur/fate/v1/lang/computation/SubListComputation.java b/src/core/src/tonkadur/fate/v1/lang/computation/SubListComputation.java
index 39133c2..38ba1d9 100644
--- a/src/core/src/tonkadur/fate/v1/lang/computation/SubListComputation.java
+++ b/src/core/src/tonkadur/fate/v1/lang/computation/SubListComputation.java
@@ -1,24 +1,23 @@
package tonkadur.fate.v1.lang.computation;
import tonkadur.parser.Origin;
-
-import tonkadur.error.ErrorManager;
+import tonkadur.parser.ParsingError;
import tonkadur.fate.v1.lang.type.Type;
-import tonkadur.fate.v1.lang.type.CollectionType;
-
-import tonkadur.fate.v1.lang.instruction.SubList;
import tonkadur.fate.v1.lang.meta.ComputationVisitor;
import tonkadur.fate.v1.lang.meta.Computation;
import tonkadur.fate.v1.lang.meta.Reference;
+import tonkadur.fate.v1.lang.meta.RecurrentChecks;
public class SubListComputation extends Computation
{
/***************************************************************************/
/**** MEMBERS **************************************************************/
/***************************************************************************/
- protected final SubList instruction;
+ protected final Computation start;
+ protected final Computation end;
+ protected final Reference collection;
/***************************************************************************/
/**** PROTECTED ************************************************************/
@@ -26,13 +25,17 @@ public class SubListComputation extends Computation
/**** Constructors *********************************************************/
protected SubListComputation
(
- final SubList instruction,
- final Type output_type
+ final Origin origin,
+ final Computation start,
+ final Computation end,
+ final Reference collection
)
{
- super(instruction.get_origin(), output_type);
+ super(origin, collection.get_type());
- this.instruction = instruction;
+ this.start = start;
+ this.end = end;
+ this.collection = collection;
}
/***************************************************************************/
@@ -44,18 +47,15 @@ public class SubListComputation extends Computation
final Origin origin,
final Computation start,
final Computation end,
- final Reference collection_in
+ final Reference collection
)
- throws Throwable
+ throws ParsingError
{
- final Type type;
- final SubList parent;
-
- parent = SubList.build(origin, start, end, collection_in, null);
-
- type = collection_in.get_type();
+ RecurrentChecks.assert_can_be_used_as(start, Type.INT);
+ RecurrentChecks.assert_can_be_used_as(end, Type.INT);
+ RecurrentChecks.assert_is_a_collection(collection);
- return new SubListComputation(parent, type);
+ return new SubListComputation(origin, start, end, collection);
}
/**** Accessors ************************************************************/
@@ -66,9 +66,19 @@ public class SubListComputation extends Computation
cv.visit_sublist(this);
}
- public SubList get_instruction ()
+ public Reference get_collection ()
{
- return instruction;
+ return collection;
+ }
+
+ public Computation get_start_index ()
+ {
+ return start;
+ }
+
+ public Computation get_end_index ()
+ {
+ return end;
}
/**** Misc. ****************************************************************/
@@ -77,9 +87,12 @@ public class SubListComputation extends Computation
{
final StringBuilder sb = new StringBuilder();
- sb.append("(ComputationOf ");
- sb.append(instruction.toString());
-
+ sb.append("(SubList ");
+ sb.append(start.toString());
+ sb.append(" ");
+ sb.append(end.toString());
+ sb.append(" ");
+ sb.append(collection.toString());
sb.append(")");
return sb.toString();
diff --git a/src/core/src/tonkadur/fate/v1/lang/computation/SwitchValue.java b/src/core/src/tonkadur/fate/v1/lang/computation/SwitchValue.java
index 3f22e51..e49525d 100644
--- a/src/core/src/tonkadur/fate/v1/lang/computation/SwitchValue.java
+++ b/src/core/src/tonkadur/fate/v1/lang/computation/SwitchValue.java
@@ -1,22 +1,17 @@
package tonkadur.fate.v1.lang.computation;
import java.util.List;
-import java.util.Collections;
import tonkadur.functional.Cons;
-import tonkadur.error.ErrorManager;
-
import tonkadur.parser.Origin;
-
-import tonkadur.fate.v1.error.ConflictingTypeException;
-import tonkadur.fate.v1.error.IncomparableTypeException;
-import tonkadur.fate.v1.error.InvalidTypeException;
+import tonkadur.parser.ParsingError;
import tonkadur.fate.v1.lang.type.Type;
import tonkadur.fate.v1.lang.meta.ComputationVisitor;
import tonkadur.fate.v1.lang.meta.Computation;
+import tonkadur.fate.v1.lang.meta.RecurrentChecks;
public class SwitchValue extends Computation
{
@@ -58,10 +53,7 @@ public class SwitchValue extends Computation
final List<Cons<Computation, Computation>> branches,
final Computation default_value
)
- throws
- InvalidTypeException,
- ConflictingTypeException,
- IncomparableTypeException
+ throws ParsingError
{
final Type target_type;
final Type first_type;
@@ -73,97 +65,10 @@ public class SwitchValue extends Computation
for (final Cons<Computation, Computation> entry: branches)
{
- if (!entry.get_car().get_type().can_be_used_as(target_type))
- {
- ErrorManager.handle
- (
- new InvalidTypeException
- (
- entry.get_car().get_origin(),
- entry.get_car().get_type(),
- Collections.singleton(target_type)
- )
- );
- }
-
- if (entry.get_cdr().get_type().equals(hint))
- {
- continue;
- }
-
- candidate_hint = entry.get_cdr().get_type().try_merging_with(hint);
-
- if (candidate_hint != null)
- {
- hint = candidate_hint;
-
- continue;
- }
-
- ErrorManager.handle
- (
- new ConflictingTypeException
- (
- entry.get_cdr().get_origin(),
- entry.get_cdr().get_type(),
- first_type
- )
- );
-
- hint = (Type) hint.generate_comparable_to(entry.get_cdr().get_type());
-
- if (hint.equals(Type.ANY))
- {
- ErrorManager.handle
- (
- new IncomparableTypeException
- (
- entry.get_cdr().get_origin(),
- entry.get_cdr().get_type(),
- first_type
- )
- );
- }
- }
-
- if (default_value.get_type().equals(hint))
- {
- return new SwitchValue(origin, hint, target, branches, default_value);
- }
-
- candidate_hint = default_value.get_type().try_merging_with(hint);
-
- if (candidate_hint != null)
- {
- hint = candidate_hint;
-
- return new SwitchValue(origin, hint, target, branches, default_value);
+ hint = RecurrentChecks.assert_can_be_used_as(entry.get_car(), hint);
}
- ErrorManager.handle
- (
- new ConflictingTypeException
- (
- default_value.get_origin(),
- default_value.get_type(),
- first_type
- )
- );
-
- hint = (Type) hint.generate_comparable_to(default_value.get_type());
-
- if (hint.equals(Type.ANY))
- {
- ErrorManager.handle
- (
- new IncomparableTypeException
- (
- default_value.get_origin(),
- default_value.get_type(),
- first_type
- )
- );
- }
+ hint = RecurrentChecks.assert_can_be_used_as(default_value, hint);
return new SwitchValue(origin, hint, target, branches, default_value);
}
diff --git a/src/core/src/tonkadur/fate/v1/lang/computation/TextWithEffect.java b/src/core/src/tonkadur/fate/v1/lang/computation/TextWithEffect.java
index df3c324..9829d37 100644
--- a/src/core/src/tonkadur/fate/v1/lang/computation/TextWithEffect.java
+++ b/src/core/src/tonkadur/fate/v1/lang/computation/TextWithEffect.java
@@ -1,26 +1,16 @@
package tonkadur.fate.v1.lang.computation;
-import java.util.ArrayList;
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.IncompatibleTypeException;
-import tonkadur.fate.v1.error.IncomparableTypeException;
-import tonkadur.fate.v1.error.InvalidArityException;
-
import tonkadur.fate.v1.lang.TextEffect;
-import tonkadur.fate.v1.lang.type.Type;
-
import tonkadur.fate.v1.lang.meta.ComputationVisitor;
import tonkadur.fate.v1.lang.meta.RichTextNode;
import tonkadur.fate.v1.lang.meta.Computation;
+import tonkadur.fate.v1.lang.meta.RecurrentChecks;
public class TextWithEffect extends RichTextNode
{
@@ -61,79 +51,14 @@ public class TextWithEffect extends RichTextNode
final List<Computation> parameters,
final RichTextNode text
)
- throws Throwable
+ throws ParsingError
{
- final List<Type> signature;
-
- signature = effect.get_signature();
-
- if (parameters.size() != signature.size())
- {
- ErrorManager.handle
- (
- new InvalidArityException
- (
- origin,
- parameters.size(),
- signature.size(),
- signature.size()
- )
- );
- }
-
- (new Merge<Type,Computation,Boolean>()
- {
- @Override
- public Boolean risky_lambda (final Type t, final Computation p)
- throws ParsingError
- {
- if ((t == null) || (p == null))
- {
- return Boolean.FALSE;
- }
- else
- {
- final Type hint;
-
- if (p.get_type().can_be_used_as(t))
- {
- return Boolean.TRUE;
- }
-
- if (p.get_type().try_merging_with(t) != null)
- {
- return Boolean.TRUE;
- }
-
- ErrorManager.handle
- (
- new IncompatibleTypeException
- (
- p.get_origin(),
- p.get_type(),
- t
- )
- );
-
- hint = (Type) p.get_type().generate_comparable_to(t);
-
- if (hint.equals(Type.ANY))
- {
- ErrorManager.handle
- (
- new IncomparableTypeException
- (
- p.get_origin(),
- p.get_type(),
- t
- )
- );
- }
-
- return Boolean.FALSE;
- }
- }
- }).risky_merge(signature, parameters);
+ RecurrentChecks.assert_computations_matches_signature
+ (
+ origin,
+ parameters,
+ effect.get_signature()
+ );
return new TextWithEffect(origin, effect, parameters, text);
}
diff --git a/src/core/src/tonkadur/fate/v1/lang/instruction/AddElement.java b/src/core/src/tonkadur/fate/v1/lang/instruction/AddElement.java
index 791e193..e7dadb8 100644
--- a/src/core/src/tonkadur/fate/v1/lang/instruction/AddElement.java
+++ b/src/core/src/tonkadur/fate/v1/lang/instruction/AddElement.java
@@ -74,7 +74,6 @@ public class AddElement extends Instruction
{
final StringBuilder sb = new StringBuilder();
- sb.append(origin.toString());
sb.append("(AddElement");
sb.append(System.lineSeparator());
sb.append(System.lineSeparator());
diff --git a/src/core/src/tonkadur/fate/v1/lang/instruction/AddElementsOf.java b/src/core/src/tonkadur/fate/v1/lang/instruction/AddElementsOf.java
index 0b4f378..2ffde59 100644
--- a/src/core/src/tonkadur/fate/v1/lang/instruction/AddElementsOf.java
+++ b/src/core/src/tonkadur/fate/v1/lang/instruction/AddElementsOf.java
@@ -83,7 +83,6 @@ public class AddElementsOf extends Instruction
{
final StringBuilder sb = new StringBuilder();
- sb.append(origin.toString());
sb.append("(AddElementsOf");
sb.append(System.lineSeparator());
sb.append(System.lineSeparator());
diff --git a/src/core/src/tonkadur/fate/v1/lang/instruction/RemoveAllOfElement.java b/src/core/src/tonkadur/fate/v1/lang/instruction/RemoveAllOfElement.java
index b8ef9de..5384baa 100644
--- a/src/core/src/tonkadur/fate/v1/lang/instruction/RemoveAllOfElement.java
+++ b/src/core/src/tonkadur/fate/v1/lang/instruction/RemoveAllOfElement.java
@@ -75,7 +75,6 @@ public class RemoveAllOfElement extends Instruction
{
final StringBuilder sb = new StringBuilder();
- sb.append(origin.toString());
sb.append("(RemoveAllOfElement");
sb.append(System.lineSeparator());
sb.append(System.lineSeparator());
diff --git a/src/core/src/tonkadur/fate/v1/lang/instruction/RemoveElement.java b/src/core/src/tonkadur/fate/v1/lang/instruction/RemoveElement.java
index ac4d093..040ef99 100644
--- a/src/core/src/tonkadur/fate/v1/lang/instruction/RemoveElement.java
+++ b/src/core/src/tonkadur/fate/v1/lang/instruction/RemoveElement.java
@@ -74,7 +74,6 @@ public class RemoveElement extends Instruction
{
final StringBuilder sb = new StringBuilder();
- sb.append(origin.toString());
sb.append("(RemoveElement");
sb.append(System.lineSeparator());
sb.append(System.lineSeparator());
diff --git a/src/core/src/tonkadur/fate/v1/lang/instruction/RemoveElementAt.java b/src/core/src/tonkadur/fate/v1/lang/instruction/RemoveElementAt.java
index 750dafe..a036970 100644
--- a/src/core/src/tonkadur/fate/v1/lang/instruction/RemoveElementAt.java
+++ b/src/core/src/tonkadur/fate/v1/lang/instruction/RemoveElementAt.java
@@ -78,7 +78,6 @@ public class RemoveElementAt extends Instruction
{
final StringBuilder sb = new StringBuilder();
- sb.append(origin.toString());
sb.append("(RemoveElementAt");
sb.append(System.lineSeparator());
sb.append(System.lineSeparator());
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 52fe607..43ed6f6 100644
--- a/src/core/src/tonkadur/fate/v1/lang/meta/RecurrentChecks.java
+++ b/src/core/src/tonkadur/fate/v1/lang/meta/RecurrentChecks.java
@@ -420,6 +420,38 @@ public class RecurrentChecks
);
}
+ public static void assert_lambda_matches_computations
+ (
+ final Computation l,
+ final List<Computation> c
+ )
+ throws ParsingError
+ {
+ assert_is_a_lambda_function(l);
+ assert_computations_matches_signature
+ (
+ l.get_origin(),
+ c,
+ ((LambdaType) l.get_type()).get_signature()
+ );
+ }
+
+ public static void assert_lambda_matches_types
+ (
+ final Computation l,
+ final List<Type> c
+ )
+ throws ParsingError
+ {
+ assert_is_a_lambda_function(l);
+ assert_types_matches_signature
+ (
+ l.get_origin(),
+ c,
+ ((LambdaType) l.get_type()).get_signature()
+ );
+ }
+
public static void assert_lambda_matches_types
(
final Computation l,
diff --git a/src/core/src/tonkadur/fate/v1/lang/type/CollectionType.java b/src/core/src/tonkadur/fate/v1/lang/type/CollectionType.java
index 95ff963..443bc84 100644
--- a/src/core/src/tonkadur/fate/v1/lang/type/CollectionType.java
+++ b/src/core/src/tonkadur/fate/v1/lang/type/CollectionType.java
@@ -1,6 +1,7 @@
package tonkadur.fate.v1.lang.type;
import tonkadur.error.ErrorManager;
+import tonkadur.parser.ParsingError;
import tonkadur.parser.Origin;
diff --git a/src/core/src/tonkadur/fate/v1/parser/FateLexer.g4 b/src/core/src/tonkadur/fate/v1/parser/FateLexer.g4
index 1c11821..91ce261 100644
--- a/src/core/src/tonkadur/fate/v1/parser/FateLexer.g4
+++ b/src/core/src/tonkadur/fate/v1/parser/FateLexer.g4
@@ -85,7 +85,8 @@ LAMBDA_KW: L_PAREN 'lambda' SEP+;
EVAL_KW: L_PAREN 'eval'('uate'?) SEP+;
CLAMP_KW: L_PAREN ('clamp') SEP+;
MODULO_KW: L_PAREN ('modulo'|'%'|'mod') SEP+;
-MERGE_KW : L_PAREN 'merge' SEP+;
+MERGE_TO_LIST_KW : L_PAREN 'merge'US'to'US'list' SEP+;
+MERGE_TO_SET_KW : L_PAREN 'merge'US'to'US'set' SEP+;
IMP_MERGE_KW : L_PAREN 'merge!' SEP+;
NEWLINE_KW: L_PAREN 'newline)';
NEW_KW: L_PAREN ('new'|'reserve'|'create') SEP+;
diff --git a/src/core/src/tonkadur/fate/v1/parser/FateParser.g4 b/src/core/src/tonkadur/fate/v1/parser/FateParser.g4
index 43d284b..95127e5 100644
--- a/src/core/src/tonkadur/fate/v1/parser/FateParser.g4
+++ b/src/core/src/tonkadur/fate/v1/parser/FateParser.g4
@@ -3510,10 +3510,34 @@ returns [Computation result]
);
}
+ | MERGE_TO_LIST_KW
+ fun=value WS+
+ inr0=value_reference WS+
+ inr1=value_reference WS*
+ R_PAREN
+ {
+ $result =
+ MergeComputation.build
+ (
+ CONTEXT.get_origin_at
+ (
+ ($MERGE_TO_LIST_KW.getLine()),
+ ($MERGE_TO_LIST_KW.getCharPositionInLine())
+ ),
+ ($fun.result),
+ ($inr0.result),
+ null,
+ ($inr1.result),
+ null,
+ false
+ );
+ }
- | MERGE_KW
+ | MERGE_TO_LIST_KW
fun=value WS+
+ def0=value WS+
inr0=value_reference WS+
+ def1=value WS+
inr1=value_reference WS*
R_PAREN
{
@@ -3522,18 +3546,42 @@ returns [Computation result]
(
CONTEXT.get_origin_at
(
- ($MERGE_KW.getLine()),
- ($MERGE_KW.getCharPositionInLine())
+ ($MERGE_TO_LIST_KW.getLine()),
+ ($MERGE_TO_LIST_KW.getCharPositionInLine())
+ ),
+ ($fun.result),
+ ($inr0.result),
+ ($def0.result),
+ ($inr1.result),
+ ($def1.result),
+ false
+ );
+ }
+
+ | MERGE_TO_SET_KW
+ fun=value WS+
+ inr0=value_reference WS+
+ inr1=value_reference WS*
+ R_PAREN
+ {
+ $result =
+ MergeComputation.build
+ (
+ CONTEXT.get_origin_at
+ (
+ ($MERGE_TO_SET_KW.getLine()),
+ ($MERGE_TO_SET_KW.getCharPositionInLine())
),
($fun.result),
($inr0.result),
null,
($inr1.result),
- null
+ null,
+ true
);
}
- | MERGE_KW
+ | MERGE_TO_SET_KW
fun=value WS+
def0=value WS+
inr0=value_reference WS+
@@ -3546,14 +3594,15 @@ returns [Computation result]
(
CONTEXT.get_origin_at
(
- ($MERGE_KW.getLine()),
- ($MERGE_KW.getCharPositionInLine())
+ ($MERGE_TO_SET_KW.getLine()),
+ ($MERGE_TO_SET_KW.getCharPositionInLine())
),
($fun.result),
($inr0.result),
($def0.result),
($inr1.result),
- ($def1.result)
+ ($def1.result),
+ true
);
}