summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNathanael Sensfelder <SpamShield0@MultiAgentSystems.org>2021-08-25 22:32:13 +0200
committerNathanael Sensfelder <SpamShield0@MultiAgentSystems.org>2021-08-25 22:32:13 +0200
commit7605eaa49bfdafa6d386440aa301c809245055ae (patch)
tree7f56636657309c3b59996062929942bdb552a7e3
parent248a0bffd1d96548402c70a5b181e67de59d1e14 (diff)
Reimplementing generic †Fate instructions & adds incorrect reference warning.
-rw-r--r--src/core/src/tonkadur/fate/v1/lang/computation/AmbiguousWord.java7
-rw-r--r--src/core/src/tonkadur/fate/v1/lang/computation/FieldAccess.java7
-rw-r--r--src/core/src/tonkadur/fate/v1/lang/computation/GenericComputation.java4
-rw-r--r--src/core/src/tonkadur/fate/v1/lang/computation/IfElseValue.java149
-rw-r--r--src/core/src/tonkadur/fate/v1/lang/computation/Newline.java35
-rw-r--r--src/core/src/tonkadur/fate/v1/lang/computation/Paragraph.java12
-rw-r--r--src/core/src/tonkadur/fate/v1/lang/computation/VariableReference.java8
-rw-r--r--src/core/src/tonkadur/fate/v1/lang/computation/generic/Access.java10
-rw-r--r--src/core/src/tonkadur/fate/v1/lang/computation/generic/AddElementAtComputation.java2
-rw-r--r--src/core/src/tonkadur/fate/v1/lang/computation/generic/AddElementComputation.java2
-rw-r--r--src/core/src/tonkadur/fate/v1/lang/computation/generic/AddElementsOfComputation.java2
-rw-r--r--src/core/src/tonkadur/fate/v1/lang/computation/generic/AddressOperator.java2
-rw-r--r--src/core/src/tonkadur/fate/v1/lang/computation/generic/AtReference.java13
-rw-r--r--src/core/src/tonkadur/fate/v1/lang/computation/generic/CarCdr.java9
-rw-r--r--src/core/src/tonkadur/fate/v1/lang/computation/generic/ConsComputation.java2
-rw-r--r--src/core/src/tonkadur/fate/v1/lang/computation/generic/CountOperator.java2
-rw-r--r--src/core/src/tonkadur/fate/v1/lang/computation/generic/FilterComputation.java2
-rw-r--r--src/core/src/tonkadur/fate/v1/lang/computation/generic/Fold.java2
-rw-r--r--src/core/src/tonkadur/fate/v1/lang/computation/generic/IfElseValue.java2
-rw-r--r--src/core/src/tonkadur/fate/v1/lang/computation/generic/IndexOfOperator.java2
-rw-r--r--src/core/src/tonkadur/fate/v1/lang/computation/generic/IndexedFilterComputation.java2
-rw-r--r--src/core/src/tonkadur/fate/v1/lang/computation/generic/IndexedMapComputation.java2
-rw-r--r--src/core/src/tonkadur/fate/v1/lang/computation/generic/IndexedMergeComputation.java2
-rw-r--r--src/core/src/tonkadur/fate/v1/lang/computation/generic/IndexedPartitionComputation.java2
-rw-r--r--src/core/src/tonkadur/fate/v1/lang/computation/generic/IsEmpty.java2
-rw-r--r--src/core/src/tonkadur/fate/v1/lang/computation/generic/IsMemberOperator.java2
-rw-r--r--src/core/src/tonkadur/fate/v1/lang/computation/generic/LambdaEvaluation.java2
-rw-r--r--src/core/src/tonkadur/fate/v1/lang/computation/generic/MapComputation.java2
-rw-r--r--src/core/src/tonkadur/fate/v1/lang/computation/generic/MergeComputation.java2
-rw-r--r--src/core/src/tonkadur/fate/v1/lang/computation/generic/Newline.java2
-rw-r--r--src/core/src/tonkadur/fate/v1/lang/computation/generic/Operation.java4
-rw-r--r--src/core/src/tonkadur/fate/v1/lang/computation/generic/PartitionComputation.java2
-rw-r--r--src/core/src/tonkadur/fate/v1/lang/computation/generic/PopElementComputation.java2
-rw-r--r--src/core/src/tonkadur/fate/v1/lang/computation/generic/PushElementComputation.java6
-rw-r--r--src/core/src/tonkadur/fate/v1/lang/computation/generic/Range.java2
-rw-r--r--src/core/src/tonkadur/fate/v1/lang/computation/generic/RemoveAllOfElementComputation.java8
-rw-r--r--src/core/src/tonkadur/fate/v1/lang/computation/generic/RemoveElementAtComputation.java2
-rw-r--r--src/core/src/tonkadur/fate/v1/lang/computation/generic/RemoveElementComputation.java2
-rw-r--r--src/core/src/tonkadur/fate/v1/lang/computation/generic/RemoveElementsOfComputation.java2
-rw-r--r--src/core/src/tonkadur/fate/v1/lang/computation/generic/ReverseListComputation.java2
-rw-r--r--src/core/src/tonkadur/fate/v1/lang/computation/generic/ShuffleComputation.java2
-rw-r--r--src/core/src/tonkadur/fate/v1/lang/computation/generic/SizeOperator.java2
-rw-r--r--src/core/src/tonkadur/fate/v1/lang/computation/generic/SortComputation.java2
-rw-r--r--src/core/src/tonkadur/fate/v1/lang/computation/generic/SubListComputation.java2
-rw-r--r--src/core/src/tonkadur/fate/v1/lang/computation/generic/TextJoin.java2
-rw-r--r--src/core/src/tonkadur/fate/v1/lang/instruction/GenericInstruction.java4
-rw-r--r--src/core/src/tonkadur/fate/v1/lang/instruction/SequenceVariableJump.java129
-rw-r--r--src/core/src/tonkadur/fate/v1/lang/instruction/generic/AddElement.java146
-rw-r--r--src/core/src/tonkadur/fate/v1/lang/instruction/generic/AddElementAt.java153
-rw-r--r--src/core/src/tonkadur/fate/v1/lang/instruction/generic/AddElementsOf.java180
-rw-r--r--src/core/src/tonkadur/fate/v1/lang/instruction/generic/Allocate.java5
-rw-r--r--src/core/src/tonkadur/fate/v1/lang/instruction/generic/Break.java (renamed from src/core/src/tonkadur/fate/v1/lang/instruction/Break.java)32
-rw-r--r--src/core/src/tonkadur/fate/v1/lang/instruction/generic/Clear.java2
-rw-r--r--src/core/src/tonkadur/fate/v1/lang/instruction/generic/Done.java (renamed from src/core/src/tonkadur/fate/v1/lang/instruction/Done.java)32
-rw-r--r--src/core/src/tonkadur/fate/v1/lang/instruction/generic/End.java (renamed from src/core/src/tonkadur/fate/v1/lang/instruction/End.java)32
-rw-r--r--src/core/src/tonkadur/fate/v1/lang/instruction/generic/Filter.java141
-rw-r--r--src/core/src/tonkadur/fate/v1/lang/instruction/generic/Free.java2
-rw-r--r--src/core/src/tonkadur/fate/v1/lang/instruction/generic/IndexedFilter.java160
-rw-r--r--src/core/src/tonkadur/fate/v1/lang/instruction/generic/IndexedMap.java158
-rw-r--r--src/core/src/tonkadur/fate/v1/lang/instruction/generic/IndexedMerge.java244
-rw-r--r--src/core/src/tonkadur/fate/v1/lang/instruction/generic/IndexedPartition.java184
-rw-r--r--src/core/src/tonkadur/fate/v1/lang/instruction/generic/Map.java158
-rw-r--r--src/core/src/tonkadur/fate/v1/lang/instruction/generic/Merge.java238
-rw-r--r--src/core/src/tonkadur/fate/v1/lang/instruction/generic/Partition.java183
-rw-r--r--src/core/src/tonkadur/fate/v1/lang/instruction/generic/PopElement.java166
-rw-r--r--src/core/src/tonkadur/fate/v1/lang/instruction/generic/PushElement.java162
-rw-r--r--src/core/src/tonkadur/fate/v1/lang/instruction/generic/RemoveAllOfElement.java144
-rw-r--r--src/core/src/tonkadur/fate/v1/lang/instruction/generic/RemoveElement.java145
-rw-r--r--src/core/src/tonkadur/fate/v1/lang/instruction/generic/RemoveElementAt.java137
-rw-r--r--src/core/src/tonkadur/fate/v1/lang/instruction/generic/RemoveElementsOf.java150
-rw-r--r--src/core/src/tonkadur/fate/v1/lang/instruction/generic/ReverseList.java111
-rw-r--r--src/core/src/tonkadur/fate/v1/lang/instruction/generic/SequenceVariableCall.java (renamed from src/core/src/tonkadur/fate/v1/lang/instruction/SequenceVariableCall.java)108
-rw-r--r--src/core/src/tonkadur/fate/v1/lang/instruction/generic/SequenceVariableJump.java219
-rw-r--r--src/core/src/tonkadur/fate/v1/lang/instruction/generic/SetValue.java (renamed from src/core/src/tonkadur/fate/v1/lang/instruction/SetValue.java)75
-rw-r--r--src/core/src/tonkadur/fate/v1/lang/instruction/generic/Shuffle.java111
-rw-r--r--src/core/src/tonkadur/fate/v1/lang/instruction/generic/Sort.java138
-rw-r--r--src/core/src/tonkadur/fate/v1/lang/instruction/generic/SubList.java148
-rw-r--r--src/core/src/tonkadur/fate/v1/lang/meta/Computation.java14
-rw-r--r--src/core/src/tonkadur/fate/v1/lang/meta/ComputationVisitor.java6
-rw-r--r--src/core/src/tonkadur/fate/v1/parser/FateParser.g414
-rw-r--r--src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/ComputationCompiler.java124
81 files changed, 3933 insertions, 558 deletions
diff --git a/src/core/src/tonkadur/fate/v1/lang/computation/AmbiguousWord.java b/src/core/src/tonkadur/fate/v1/lang/computation/AmbiguousWord.java
index e1098bb..b29e997 100644
--- a/src/core/src/tonkadur/fate/v1/lang/computation/AmbiguousWord.java
+++ b/src/core/src/tonkadur/fate/v1/lang/computation/AmbiguousWord.java
@@ -100,6 +100,13 @@ public class AmbiguousWord extends Computation
return as_string;
}
+ @Override
+ public void use_as_reference ()
+ throws ParsingError
+ {
+ result.use_as_reference();
+ }
+
/**** Misc. ****************************************************************/
@Override
public String toString ()
diff --git a/src/core/src/tonkadur/fate/v1/lang/computation/FieldAccess.java b/src/core/src/tonkadur/fate/v1/lang/computation/FieldAccess.java
index 2bb24fd..0b89688 100644
--- a/src/core/src/tonkadur/fate/v1/lang/computation/FieldAccess.java
+++ b/src/core/src/tonkadur/fate/v1/lang/computation/FieldAccess.java
@@ -140,6 +140,13 @@ public class FieldAccess extends Computation
return parent;
}
+ @Override
+ public void use_as_reference ()
+ throws ParsingError
+ {
+ parent.use_as_reference();
+ }
+
/**** Misc. ****************************************************************/
@Override
public String toString ()
diff --git a/src/core/src/tonkadur/fate/v1/lang/computation/GenericComputation.java b/src/core/src/tonkadur/fate/v1/lang/computation/GenericComputation.java
index 935e195..8bf5e8d 100644
--- a/src/core/src/tonkadur/fate/v1/lang/computation/GenericComputation.java
+++ b/src/core/src/tonkadur/fate/v1/lang/computation/GenericComputation.java
@@ -74,7 +74,7 @@ public abstract class GenericComputation extends Computation
}
}
- public static GenericComputation build
+ public static Computation build
(
final Origin origin,
final String name,
@@ -99,7 +99,7 @@ public abstract class GenericComputation extends Computation
}
return
- (GenericComputation) computation_class.getDeclaredMethod
+ (Computation) computation_class.getDeclaredMethod
(
"build",
Origin.class,
diff --git a/src/core/src/tonkadur/fate/v1/lang/computation/IfElseValue.java b/src/core/src/tonkadur/fate/v1/lang/computation/IfElseValue.java
deleted file mode 100644
index b1e86fb..0000000
--- a/src/core/src/tonkadur/fate/v1/lang/computation/IfElseValue.java
+++ /dev/null
@@ -1,149 +0,0 @@
-package tonkadur.fate.v1.lang.computation;
-
-import tonkadur.parser.Origin;
-import tonkadur.parser.ParsingError;
-
-import tonkadur.fate.v1.lang.type.Type;
-import tonkadur.fate.v1.lang.type.FutureType;
-
-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
-{
- /***************************************************************************/
- /**** MEMBERS **************************************************************/
- /***************************************************************************/
- protected final Computation condition;
- protected final Computation if_true;
- protected final Computation if_false;
-
- /***************************************************************************/
- /**** PROTECTED ************************************************************/
- /***************************************************************************/
- /**** Constructors *********************************************************/
- protected IfElseValue
- (
- final Origin origin,
- final Type return_type,
- final Computation condition,
- final Computation if_true,
- final Computation if_false
- )
- {
- super(origin, return_type);
-
- this.condition = condition;
- this.if_true = if_true;
- this.if_false = if_false;
- }
-
- /***************************************************************************/
- /**** PUBLIC ***************************************************************/
- /***************************************************************************/
- /**** Constructors *********************************************************/
- public static IfElseValue build
- (
- final Origin origin,
- final Computation condition,
- final Computation if_true,
- final Computation if_false
- )
- throws ParsingError
- {
- condition.expect_non_string();
-
- RecurrentChecks.assert_can_be_used_as(condition, Type.BOOL);
-
- return
- new IfElseValue
- (
- origin,
- new FutureType(origin),
- condition,
- if_true,
- if_false
- );
- }
-
- /**** Accessors ************************************************************/
- @Override
- public void expect_non_string ()
- throws ParsingError
- {
- if_true.expect_non_string();
- if_false.expect_non_string();
-
- ((FutureType) get_type()).resolve_to
- (
- RecurrentChecks.assert_can_be_used_as(if_false, if_true.get_type())
- );
- }
-
- @Override
- public void expect_string ()
- throws ParsingError
- {
- if_true.expect_string();
- if_false.expect_string();
-
- ((FutureType) get_type()).resolve_to
- (
- RecurrentChecks.assert_can_be_used_as(if_false, if_true.get_type())
- );
- }
-
- @Override
- public void get_visited_by (final ComputationVisitor cv)
- throws Throwable
- {
- cv.visit_if_else_value(this);
- }
-
- public Computation get_condition ()
- {
- return condition;
- }
-
- public Computation get_if_true ()
- {
- return if_true;
- }
-
- public Computation get_if_false ()
- {
- return if_false;
- }
-
- /**** Misc. ****************************************************************/
- @Override
- public String toString ()
- {
- final StringBuilder sb = new StringBuilder();
-
- sb.append("(IfElseValue");
- sb.append(System.lineSeparator());
- sb.append(System.lineSeparator());
-
- sb.append("Condition:");
- sb.append(System.lineSeparator());
- sb.append(condition.toString());
-
- sb.append(System.lineSeparator());
- sb.append(System.lineSeparator());
- sb.append("If true:");
- sb.append(System.lineSeparator());
- sb.append(if_true.toString());
-
- sb.append(System.lineSeparator());
- sb.append(System.lineSeparator());
- sb.append("If false:");
- sb.append(System.lineSeparator());
- sb.append(if_false.toString());
-
- sb.append(")");
-
- return sb.toString();
- }
-}
diff --git a/src/core/src/tonkadur/fate/v1/lang/computation/Newline.java b/src/core/src/tonkadur/fate/v1/lang/computation/Newline.java
deleted file mode 100644
index 2f70d3e..0000000
--- a/src/core/src/tonkadur/fate/v1/lang/computation/Newline.java
+++ /dev/null
@@ -1,35 +0,0 @@
-package tonkadur.fate.v1.lang.computation;
-
-import tonkadur.parser.Origin;
-
-import tonkadur.fate.v1.lang.meta.ComputationVisitor;
-import tonkadur.fate.v1.lang.meta.Computation;
-
-import tonkadur.fate.v1.lang.type.Type;
-
-public class Newline extends Computation
-{
- /***************************************************************************/
- /**** PUBLIC ***************************************************************/
- /***************************************************************************/
- /**** Constructors *********************************************************/
- public Newline (final Origin origin)
- {
- super(origin, Type.TEXT);
- }
-
- /**** Accessors ************************************************************/
- @Override
- public void get_visited_by (final ComputationVisitor cv)
- throws Throwable
- {
- cv.visit_newline(this);
- }
-
- /**** Misc. ****************************************************************/
- @Override
- public String toString ()
- {
- return "(Newline)";
- }
-}
diff --git a/src/core/src/tonkadur/fate/v1/lang/computation/Paragraph.java b/src/core/src/tonkadur/fate/v1/lang/computation/Paragraph.java
index 36515d1..c0392c9 100644
--- a/src/core/src/tonkadur/fate/v1/lang/computation/Paragraph.java
+++ b/src/core/src/tonkadur/fate/v1/lang/computation/Paragraph.java
@@ -6,6 +6,7 @@ import tonkadur.parser.Origin;
import tonkadur.fate.v1.lang.meta.ComputationVisitor;
import tonkadur.fate.v1.lang.meta.Computation;
+
import tonkadur.fate.v1.lang.type.Type;
public class Paragraph extends Computation
@@ -31,9 +32,18 @@ public class Paragraph extends Computation
)
throws Throwable
{
- for (final Computation c: content)
+ for (int i = content.size(); i > 0; i--)
{
+ final Computation c;
+
+ c = content.get(i);
+
c.expect_string();
+
+ if (!c.get_type().can_be_used_as(Type.TEXT))
+ {
+ content.set(i, ValueToText.build(c));
+ }
}
return new Paragraph(origin, content);
diff --git a/src/core/src/tonkadur/fate/v1/lang/computation/VariableReference.java b/src/core/src/tonkadur/fate/v1/lang/computation/VariableReference.java
index 6a8e428..98f6116 100644
--- a/src/core/src/tonkadur/fate/v1/lang/computation/VariableReference.java
+++ b/src/core/src/tonkadur/fate/v1/lang/computation/VariableReference.java
@@ -29,7 +29,6 @@ public class VariableReference extends Computation
super(origin, reported_type);
this.variable = variable;
}
- /**** Constructors *********************************************************/
/***************************************************************************/
/**** PUBLIC ***************************************************************/
@@ -58,6 +57,13 @@ public class VariableReference extends Computation
return variable;
}
+ @Override
+ public void use_as_reference ()
+ throws ParsingError
+ {
+ // This allows its use as reference.
+ }
+
/**** Misc. ****************************************************************/
@Override
public String toString ()
diff --git a/src/core/src/tonkadur/fate/v1/lang/computation/generic/Access.java b/src/core/src/tonkadur/fate/v1/lang/computation/generic/Access.java
index 11ff4d1..d1527aa 100644
--- a/src/core/src/tonkadur/fate/v1/lang/computation/generic/Access.java
+++ b/src/core/src/tonkadur/fate/v1/lang/computation/generic/Access.java
@@ -41,7 +41,7 @@ public class Access extends GenericComputation
return aliases;
}
- public static GenericComputation build
+ public static Computation build
(
final Origin origin,
final String alias,
@@ -135,7 +135,6 @@ public class Access extends GenericComputation
/***************************************************************************/
/**** PUBLIC ***************************************************************/
/***************************************************************************/
-
/**** Accessors ************************************************************/
public Computation get_index ()
{
@@ -147,6 +146,13 @@ public class Access extends GenericComputation
return parent;
}
+ @Override
+ public void use_as_reference ()
+ throws ParsingError
+ {
+ parent.use_as_reference();
+ }
+
/**** Misc. ****************************************************************/
@Override
public String toString ()
diff --git a/src/core/src/tonkadur/fate/v1/lang/computation/generic/AddElementAtComputation.java b/src/core/src/tonkadur/fate/v1/lang/computation/generic/AddElementAtComputation.java
index aa50009..e198d91 100644
--- a/src/core/src/tonkadur/fate/v1/lang/computation/generic/AddElementAtComputation.java
+++ b/src/core/src/tonkadur/fate/v1/lang/computation/generic/AddElementAtComputation.java
@@ -33,7 +33,7 @@ public class AddElementAtComputation extends GenericComputation
return aliases;
}
- public static GenericComputation build
+ public static Computation build
(
final Origin origin,
final String _alias,
diff --git a/src/core/src/tonkadur/fate/v1/lang/computation/generic/AddElementComputation.java b/src/core/src/tonkadur/fate/v1/lang/computation/generic/AddElementComputation.java
index ef52eb4..996d9b3 100644
--- a/src/core/src/tonkadur/fate/v1/lang/computation/generic/AddElementComputation.java
+++ b/src/core/src/tonkadur/fate/v1/lang/computation/generic/AddElementComputation.java
@@ -33,7 +33,7 @@ public class AddElementComputation extends GenericComputation
return aliases;
}
- public static GenericComputation build
+ public static Computation build
(
final Origin origin,
final String alias,
diff --git a/src/core/src/tonkadur/fate/v1/lang/computation/generic/AddElementsOfComputation.java b/src/core/src/tonkadur/fate/v1/lang/computation/generic/AddElementsOfComputation.java
index 4458df5..5c9a9e0 100644
--- a/src/core/src/tonkadur/fate/v1/lang/computation/generic/AddElementsOfComputation.java
+++ b/src/core/src/tonkadur/fate/v1/lang/computation/generic/AddElementsOfComputation.java
@@ -74,7 +74,7 @@ public class AddElementsOfComputation extends GenericComputation
return aliases;
}
- public static GenericComputation build
+ public static Computation build
(
final Origin origin,
final String alias,
diff --git a/src/core/src/tonkadur/fate/v1/lang/computation/generic/AddressOperator.java b/src/core/src/tonkadur/fate/v1/lang/computation/generic/AddressOperator.java
index bad9e0e..c785804 100644
--- a/src/core/src/tonkadur/fate/v1/lang/computation/generic/AddressOperator.java
+++ b/src/core/src/tonkadur/fate/v1/lang/computation/generic/AddressOperator.java
@@ -47,7 +47,7 @@ public class AddressOperator extends GenericComputation
return aliases;
}
- public static GenericComputation build
+ public static Computation build
(
final Origin origin,
final String _alias,
diff --git a/src/core/src/tonkadur/fate/v1/lang/computation/generic/AtReference.java b/src/core/src/tonkadur/fate/v1/lang/computation/generic/AtReference.java
index 58711b7..19e5c0b 100644
--- a/src/core/src/tonkadur/fate/v1/lang/computation/generic/AtReference.java
+++ b/src/core/src/tonkadur/fate/v1/lang/computation/generic/AtReference.java
@@ -37,7 +37,7 @@ public class AtReference extends GenericComputation
return aliases;
}
- public static GenericComputation build
+ public static Computation build
(
final Origin origin,
final String _alias,
@@ -89,6 +89,7 @@ public class AtReference extends GenericComputation
/***************************************************************************/
/**** PROTECTED ************************************************************/
/***************************************************************************/
+ /**** Constructors *********************************************************/
protected AtReference
(
final Origin origin,
@@ -100,19 +101,23 @@ public class AtReference extends GenericComputation
this.parent = parent;
}
- /**** Constructors *********************************************************/
/***************************************************************************/
/**** PUBLIC ***************************************************************/
/***************************************************************************/
- /**** Constructors *********************************************************/
-
/**** Accessors ************************************************************/
public Computation get_parent ()
{
return parent;
}
+ @Override
+ public void use_as_reference ()
+ throws ParsingError
+ {
+ // This allows its use as reference.
+ }
+
/**** Misc. ****************************************************************/
@Override
public String toString ()
diff --git a/src/core/src/tonkadur/fate/v1/lang/computation/generic/CarCdr.java b/src/core/src/tonkadur/fate/v1/lang/computation/generic/CarCdr.java
index aae1102..1400847 100644
--- a/src/core/src/tonkadur/fate/v1/lang/computation/generic/CarCdr.java
+++ b/src/core/src/tonkadur/fate/v1/lang/computation/generic/CarCdr.java
@@ -33,7 +33,7 @@ public class CarCdr extends GenericComputation
return aliases;
}
- public static GenericComputation build
+ public static Computation build
(
final Origin origin,
final String alias,
@@ -125,6 +125,13 @@ public class CarCdr extends GenericComputation
return is_car;
}
+ @Override
+ public void use_as_reference ()
+ throws ParsingError
+ {
+ parent.use_as_reference();
+ }
+
/**** Misc. ****************************************************************/
@Override
public String toString ()
diff --git a/src/core/src/tonkadur/fate/v1/lang/computation/generic/ConsComputation.java b/src/core/src/tonkadur/fate/v1/lang/computation/generic/ConsComputation.java
index 09488d4..6f569a8 100644
--- a/src/core/src/tonkadur/fate/v1/lang/computation/generic/ConsComputation.java
+++ b/src/core/src/tonkadur/fate/v1/lang/computation/generic/ConsComputation.java
@@ -26,7 +26,7 @@ public class ConsComputation extends GenericComputation
return aliases;
}
- public static GenericComputation build
+ public static Computation build
(
final Origin origin,
final String alias,
diff --git a/src/core/src/tonkadur/fate/v1/lang/computation/generic/CountOperator.java b/src/core/src/tonkadur/fate/v1/lang/computation/generic/CountOperator.java
index da473d3..82d105f 100644
--- a/src/core/src/tonkadur/fate/v1/lang/computation/generic/CountOperator.java
+++ b/src/core/src/tonkadur/fate/v1/lang/computation/generic/CountOperator.java
@@ -37,7 +37,7 @@ public class CountOperator extends GenericComputation
return aliases;
}
- public static GenericComputation build
+ public static Computation build
(
final Origin origin,
final String alias,
diff --git a/src/core/src/tonkadur/fate/v1/lang/computation/generic/FilterComputation.java b/src/core/src/tonkadur/fate/v1/lang/computation/generic/FilterComputation.java
index ec84cd0..9781e6f 100644
--- a/src/core/src/tonkadur/fate/v1/lang/computation/generic/FilterComputation.java
+++ b/src/core/src/tonkadur/fate/v1/lang/computation/generic/FilterComputation.java
@@ -33,7 +33,7 @@ public class FilterComputation extends GenericComputation
return aliases;
}
- public static GenericComputation build
+ public static Computation build
(
final Origin origin,
final String alias,
diff --git a/src/core/src/tonkadur/fate/v1/lang/computation/generic/Fold.java b/src/core/src/tonkadur/fate/v1/lang/computation/generic/Fold.java
index cb0f317..694bcaf 100644
--- a/src/core/src/tonkadur/fate/v1/lang/computation/generic/Fold.java
+++ b/src/core/src/tonkadur/fate/v1/lang/computation/generic/Fold.java
@@ -47,7 +47,7 @@ public class Fold extends GenericComputation
return aliases;
}
- public static GenericComputation build
+ public static Computation build
(
final Origin origin,
final String alias,
diff --git a/src/core/src/tonkadur/fate/v1/lang/computation/generic/IfElseValue.java b/src/core/src/tonkadur/fate/v1/lang/computation/generic/IfElseValue.java
index 7555849..be23f7d 100644
--- a/src/core/src/tonkadur/fate/v1/lang/computation/generic/IfElseValue.java
+++ b/src/core/src/tonkadur/fate/v1/lang/computation/generic/IfElseValue.java
@@ -31,7 +31,7 @@ public class IfElseValue extends GenericComputation
return aliases;
}
- public static GenericComputation build
+ public static Computation build
(
final Origin origin,
final String alias,
diff --git a/src/core/src/tonkadur/fate/v1/lang/computation/generic/IndexOfOperator.java b/src/core/src/tonkadur/fate/v1/lang/computation/generic/IndexOfOperator.java
index c042e18..4cff53e 100644
--- a/src/core/src/tonkadur/fate/v1/lang/computation/generic/IndexOfOperator.java
+++ b/src/core/src/tonkadur/fate/v1/lang/computation/generic/IndexOfOperator.java
@@ -33,7 +33,7 @@ public class IndexOfOperator extends GenericComputation
return aliases;
}
- public static GenericComputation build
+ public static Computation build
(
final Origin origin,
final String alias,
diff --git a/src/core/src/tonkadur/fate/v1/lang/computation/generic/IndexedFilterComputation.java b/src/core/src/tonkadur/fate/v1/lang/computation/generic/IndexedFilterComputation.java
index 1d17a99..8a2bf4f 100644
--- a/src/core/src/tonkadur/fate/v1/lang/computation/generic/IndexedFilterComputation.java
+++ b/src/core/src/tonkadur/fate/v1/lang/computation/generic/IndexedFilterComputation.java
@@ -38,7 +38,7 @@ public class IndexedFilterComputation extends GenericComputation
return aliases;
}
- public static GenericComputation build
+ public static Computation build
(
final Origin origin,
final String alias,
diff --git a/src/core/src/tonkadur/fate/v1/lang/computation/generic/IndexedMapComputation.java b/src/core/src/tonkadur/fate/v1/lang/computation/generic/IndexedMapComputation.java
index 717dc53..a0adf57 100644
--- a/src/core/src/tonkadur/fate/v1/lang/computation/generic/IndexedMapComputation.java
+++ b/src/core/src/tonkadur/fate/v1/lang/computation/generic/IndexedMapComputation.java
@@ -38,7 +38,7 @@ public class IndexedMapComputation extends GenericComputation
return aliases;
}
- public static GenericComputation build
+ public static Computation build
(
final Origin origin,
final String alias,
diff --git a/src/core/src/tonkadur/fate/v1/lang/computation/generic/IndexedMergeComputation.java b/src/core/src/tonkadur/fate/v1/lang/computation/generic/IndexedMergeComputation.java
index 021c4ce..aba8e45 100644
--- a/src/core/src/tonkadur/fate/v1/lang/computation/generic/IndexedMergeComputation.java
+++ b/src/core/src/tonkadur/fate/v1/lang/computation/generic/IndexedMergeComputation.java
@@ -38,7 +38,7 @@ public class IndexedMergeComputation extends GenericComputation
return aliases;
}
- public static GenericComputation build
+ public static Computation build
(
final Origin origin,
final String alias,
diff --git a/src/core/src/tonkadur/fate/v1/lang/computation/generic/IndexedPartitionComputation.java b/src/core/src/tonkadur/fate/v1/lang/computation/generic/IndexedPartitionComputation.java
index 46df979..d41a1e4 100644
--- a/src/core/src/tonkadur/fate/v1/lang/computation/generic/IndexedPartitionComputation.java
+++ b/src/core/src/tonkadur/fate/v1/lang/computation/generic/IndexedPartitionComputation.java
@@ -39,7 +39,7 @@ public class IndexedPartitionComputation extends GenericComputation
return aliases;
}
- public static GenericComputation build
+ public static Computation build
(
final Origin origin,
final String alias,
diff --git a/src/core/src/tonkadur/fate/v1/lang/computation/generic/IsEmpty.java b/src/core/src/tonkadur/fate/v1/lang/computation/generic/IsEmpty.java
index 6b2d177..0f0153d 100644
--- a/src/core/src/tonkadur/fate/v1/lang/computation/generic/IsEmpty.java
+++ b/src/core/src/tonkadur/fate/v1/lang/computation/generic/IsEmpty.java
@@ -44,7 +44,7 @@ public class IsEmpty extends GenericComputation
return aliases;
}
- public static GenericComputation build
+ public static Computation build
(
final Origin origin,
final String alias,
diff --git a/src/core/src/tonkadur/fate/v1/lang/computation/generic/IsMemberOperator.java b/src/core/src/tonkadur/fate/v1/lang/computation/generic/IsMemberOperator.java
index 0670d63..c82e8cf 100644
--- a/src/core/src/tonkadur/fate/v1/lang/computation/generic/IsMemberOperator.java
+++ b/src/core/src/tonkadur/fate/v1/lang/computation/generic/IsMemberOperator.java
@@ -43,7 +43,7 @@ public class IsMemberOperator extends GenericComputation
return aliases;
}
- public static GenericComputation build
+ public static Computation build
(
final Origin origin,
final String alias,
diff --git a/src/core/src/tonkadur/fate/v1/lang/computation/generic/LambdaEvaluation.java b/src/core/src/tonkadur/fate/v1/lang/computation/generic/LambdaEvaluation.java
index 9e1597f..4d67101 100644
--- a/src/core/src/tonkadur/fate/v1/lang/computation/generic/LambdaEvaluation.java
+++ b/src/core/src/tonkadur/fate/v1/lang/computation/generic/LambdaEvaluation.java
@@ -33,7 +33,7 @@ public class LambdaEvaluation extends GenericComputation
}
/**** Constructors *********************************************************/
- public static GenericComputation build
+ public static Computation build
(
final Origin origin,
final String _alias,
diff --git a/src/core/src/tonkadur/fate/v1/lang/computation/generic/MapComputation.java b/src/core/src/tonkadur/fate/v1/lang/computation/generic/MapComputation.java
index e271285..4fcf324 100644
--- a/src/core/src/tonkadur/fate/v1/lang/computation/generic/MapComputation.java
+++ b/src/core/src/tonkadur/fate/v1/lang/computation/generic/MapComputation.java
@@ -33,7 +33,7 @@ public class MapComputation extends GenericComputation
return aliases;
}
- public static GenericComputation build
+ public static Computation build
(
final Origin origin,
final String alias,
diff --git a/src/core/src/tonkadur/fate/v1/lang/computation/generic/MergeComputation.java b/src/core/src/tonkadur/fate/v1/lang/computation/generic/MergeComputation.java
index 2354ba3..171d448 100644
--- a/src/core/src/tonkadur/fate/v1/lang/computation/generic/MergeComputation.java
+++ b/src/core/src/tonkadur/fate/v1/lang/computation/generic/MergeComputation.java
@@ -32,7 +32,7 @@ public class MergeComputation extends GenericComputation
return aliases;
}
- public static GenericComputation build
+ public static Computation build
(
final Origin origin,
final String alias,
diff --git a/src/core/src/tonkadur/fate/v1/lang/computation/generic/Newline.java b/src/core/src/tonkadur/fate/v1/lang/computation/generic/Newline.java
index 664b864..5ddc742 100644
--- a/src/core/src/tonkadur/fate/v1/lang/computation/generic/Newline.java
+++ b/src/core/src/tonkadur/fate/v1/lang/computation/generic/Newline.java
@@ -26,7 +26,7 @@ public class Newline extends GenericComputation
return aliases;
}
- public static GenericComputation build
+ public static Computation build
(
final Origin origin,
final String alias,
diff --git a/src/core/src/tonkadur/fate/v1/lang/computation/generic/Operation.java b/src/core/src/tonkadur/fate/v1/lang/computation/generic/Operation.java
index 62dcaea..46effb9 100644
--- a/src/core/src/tonkadur/fate/v1/lang/computation/generic/Operation.java
+++ b/src/core/src/tonkadur/fate/v1/lang/computation/generic/Operation.java
@@ -151,7 +151,7 @@ public class Operation extends GenericComputation
return ALIASED_OPERATOR.keySet();
}
- public static GenericComputation build
+ public static Computation build
(
final Origin origin,
final String alias,
@@ -162,7 +162,7 @@ public class Operation extends GenericComputation
return build(origin, ALIASED_OPERATOR.get(alias), operands);
}
- public static GenericComputation build
+ public static Computation build
(
final Origin origin,
final Operator operator,
diff --git a/src/core/src/tonkadur/fate/v1/lang/computation/generic/PartitionComputation.java b/src/core/src/tonkadur/fate/v1/lang/computation/generic/PartitionComputation.java
index 32e655d..9444bc1 100644
--- a/src/core/src/tonkadur/fate/v1/lang/computation/generic/PartitionComputation.java
+++ b/src/core/src/tonkadur/fate/v1/lang/computation/generic/PartitionComputation.java
@@ -33,7 +33,7 @@ public class PartitionComputation extends GenericComputation
return aliases;
}
- public static GenericComputation build
+ public static Computation build
(
final Origin origin,
final String alias,
diff --git a/src/core/src/tonkadur/fate/v1/lang/computation/generic/PopElementComputation.java b/src/core/src/tonkadur/fate/v1/lang/computation/generic/PopElementComputation.java
index 667ad6b..7c1784d 100644
--- a/src/core/src/tonkadur/fate/v1/lang/computation/generic/PopElementComputation.java
+++ b/src/core/src/tonkadur/fate/v1/lang/computation/generic/PopElementComputation.java
@@ -49,7 +49,7 @@ public class PopElementComputation extends GenericComputation
return aliases;
}
- public static GenericComputation build
+ public static Computation build
(
final Origin origin,
final String alias,
diff --git a/src/core/src/tonkadur/fate/v1/lang/computation/generic/PushElementComputation.java b/src/core/src/tonkadur/fate/v1/lang/computation/generic/PushElementComputation.java
index 69c7e7f..f25a7dc 100644
--- a/src/core/src/tonkadur/fate/v1/lang/computation/generic/PushElementComputation.java
+++ b/src/core/src/tonkadur/fate/v1/lang/computation/generic/PushElementComputation.java
@@ -37,7 +37,7 @@ public class PushElementComputation extends GenericComputation
return aliases;
}
- public static GenericComputation build
+ public static Computation build
(
final Origin origin,
final String alias,
@@ -59,7 +59,7 @@ public class PushElementComputation extends GenericComputation
collection = call_parameters.get(0);
element = call_parameters.get(1);
- is_from_left = alias.contains("eft");
+ is_from_left = alias.endsWith("eft");
if (alias.startsWith("set:"))
{
@@ -77,6 +77,7 @@ public class PushElementComputation extends GenericComputation
element
);
}
+
return
new PushElementComputation
(
@@ -86,6 +87,7 @@ public class PushElementComputation extends GenericComputation
is_from_left
);
}
+
/***************************************************************************/
/**** MEMBERS **************************************************************/
/***************************************************************************/
diff --git a/src/core/src/tonkadur/fate/v1/lang/computation/generic/Range.java b/src/core/src/tonkadur/fate/v1/lang/computation/generic/Range.java
index f58cb1c..3ac9f21 100644
--- a/src/core/src/tonkadur/fate/v1/lang/computation/generic/Range.java
+++ b/src/core/src/tonkadur/fate/v1/lang/computation/generic/Range.java
@@ -29,7 +29,7 @@ public class Range extends GenericComputation
return aliases;
}
- public static GenericComputation build
+ public static Computation build
(
final Origin origin,
final String alias,
diff --git a/src/core/src/tonkadur/fate/v1/lang/computation/generic/RemoveAllOfElementComputation.java b/src/core/src/tonkadur/fate/v1/lang/computation/generic/RemoveAllOfElementComputation.java
index 858aeb5..8fc9c44 100644
--- a/src/core/src/tonkadur/fate/v1/lang/computation/generic/RemoveAllOfElementComputation.java
+++ b/src/core/src/tonkadur/fate/v1/lang/computation/generic/RemoveAllOfElementComputation.java
@@ -25,14 +25,20 @@ public class RemoveAllOfElementComputation extends GenericComputation
aliases.add("list:remove_each");
aliases.add("list:removeeach");
aliases.add("list:removeEach");
+ aliases.add("list:remove_every");
+ aliases.add("list:removeevery");
+ aliases.add("list:removeEvery");
aliases.add("set:remove_each");
aliases.add("set:removeeach");
aliases.add("set:removeEach");
+ aliases.add("set:remove_every");
+ aliases.add("set:removeevery");
+ aliases.add("set:removeEvery");
return aliases;
}
- public static GenericComputation build
+ public static Computation build
(
final Origin origin,
final String alias,
diff --git a/src/core/src/tonkadur/fate/v1/lang/computation/generic/RemoveElementAtComputation.java b/src/core/src/tonkadur/fate/v1/lang/computation/generic/RemoveElementAtComputation.java
index 781f4e1..ad8f7bd 100644
--- a/src/core/src/tonkadur/fate/v1/lang/computation/generic/RemoveElementAtComputation.java
+++ b/src/core/src/tonkadur/fate/v1/lang/computation/generic/RemoveElementAtComputation.java
@@ -34,7 +34,7 @@ public class RemoveElementAtComputation extends GenericComputation
return aliases;
}
- public static GenericComputation build
+ public static Computation build
(
final Origin origin,
final String alias,
diff --git a/src/core/src/tonkadur/fate/v1/lang/computation/generic/RemoveElementComputation.java b/src/core/src/tonkadur/fate/v1/lang/computation/generic/RemoveElementComputation.java
index a75f0cd..5c25edf 100644
--- a/src/core/src/tonkadur/fate/v1/lang/computation/generic/RemoveElementComputation.java
+++ b/src/core/src/tonkadur/fate/v1/lang/computation/generic/RemoveElementComputation.java
@@ -39,7 +39,7 @@ public class RemoveElementComputation extends GenericComputation
return aliases;
}
- public static GenericComputation build
+ public static Computation build
(
final Origin origin,
final String alias,
diff --git a/src/core/src/tonkadur/fate/v1/lang/computation/generic/RemoveElementsOfComputation.java b/src/core/src/tonkadur/fate/v1/lang/computation/generic/RemoveElementsOfComputation.java
index 66eb7a3..fdbd7ba 100644
--- a/src/core/src/tonkadur/fate/v1/lang/computation/generic/RemoveElementsOfComputation.java
+++ b/src/core/src/tonkadur/fate/v1/lang/computation/generic/RemoveElementsOfComputation.java
@@ -33,7 +33,7 @@ public class RemoveElementsOfComputation extends GenericComputation
return aliases;
}
- public static GenericComputation build
+ public static Computation build
(
final Origin origin,
final String alias,
diff --git a/src/core/src/tonkadur/fate/v1/lang/computation/generic/ReverseListComputation.java b/src/core/src/tonkadur/fate/v1/lang/computation/generic/ReverseListComputation.java
index 5df91d0..b784352 100644
--- a/src/core/src/tonkadur/fate/v1/lang/computation/generic/ReverseListComputation.java
+++ b/src/core/src/tonkadur/fate/v1/lang/computation/generic/ReverseListComputation.java
@@ -30,7 +30,7 @@ public class ReverseListComputation extends GenericComputation
return aliases;
}
- public static GenericComputation build
+ public static Computation build
(
final Origin origin,
final String alias,
diff --git a/src/core/src/tonkadur/fate/v1/lang/computation/generic/ShuffleComputation.java b/src/core/src/tonkadur/fate/v1/lang/computation/generic/ShuffleComputation.java
index f5ed5a6..163e446 100644
--- a/src/core/src/tonkadur/fate/v1/lang/computation/generic/ShuffleComputation.java
+++ b/src/core/src/tonkadur/fate/v1/lang/computation/generic/ShuffleComputation.java
@@ -30,7 +30,7 @@ public class ShuffleComputation extends GenericComputation
return aliases;
}
- public static GenericComputation build
+ public static Computation build
(
final Origin origin,
final String alias,
diff --git a/src/core/src/tonkadur/fate/v1/lang/computation/generic/SizeOperator.java b/src/core/src/tonkadur/fate/v1/lang/computation/generic/SizeOperator.java
index 92b71df..670e8f3 100644
--- a/src/core/src/tonkadur/fate/v1/lang/computation/generic/SizeOperator.java
+++ b/src/core/src/tonkadur/fate/v1/lang/computation/generic/SizeOperator.java
@@ -31,7 +31,7 @@ public class SizeOperator extends GenericComputation
return aliases;
}
- public static GenericComputation build
+ public static Computation build
(
final Origin origin,
final String alias,
diff --git a/src/core/src/tonkadur/fate/v1/lang/computation/generic/SortComputation.java b/src/core/src/tonkadur/fate/v1/lang/computation/generic/SortComputation.java
index 8e004d2..64999a7 100644
--- a/src/core/src/tonkadur/fate/v1/lang/computation/generic/SortComputation.java
+++ b/src/core/src/tonkadur/fate/v1/lang/computation/generic/SortComputation.java
@@ -30,7 +30,7 @@ public class SortComputation extends GenericComputation
return aliases;
}
- public static GenericComputation build
+ public static Computation build
(
final Origin origin,
final String alias,
diff --git a/src/core/src/tonkadur/fate/v1/lang/computation/generic/SubListComputation.java b/src/core/src/tonkadur/fate/v1/lang/computation/generic/SubListComputation.java
index f9c20bf..5243f0d 100644
--- a/src/core/src/tonkadur/fate/v1/lang/computation/generic/SubListComputation.java
+++ b/src/core/src/tonkadur/fate/v1/lang/computation/generic/SubListComputation.java
@@ -34,7 +34,7 @@ public class SubListComputation extends GenericComputation
return aliases;
}
- public static GenericComputation build
+ public static Computation build
(
final Origin origin,
final String alias,
diff --git a/src/core/src/tonkadur/fate/v1/lang/computation/generic/TextJoin.java b/src/core/src/tonkadur/fate/v1/lang/computation/generic/TextJoin.java
index 7d5d364..bc8a0b9 100644
--- a/src/core/src/tonkadur/fate/v1/lang/computation/generic/TextJoin.java
+++ b/src/core/src/tonkadur/fate/v1/lang/computation/generic/TextJoin.java
@@ -32,7 +32,7 @@ public class TextJoin extends GenericComputation
return aliases;
}
- public static GenericComputation build
+ public static Computation build
(
final Origin origin,
final String _alias,
diff --git a/src/core/src/tonkadur/fate/v1/lang/instruction/GenericInstruction.java b/src/core/src/tonkadur/fate/v1/lang/instruction/GenericInstruction.java
index 5483f5a..850dc73 100644
--- a/src/core/src/tonkadur/fate/v1/lang/instruction/GenericInstruction.java
+++ b/src/core/src/tonkadur/fate/v1/lang/instruction/GenericInstruction.java
@@ -75,7 +75,7 @@ public abstract class GenericInstruction extends Instruction
}
}
- public static GenericInstruction build
+ public static Instruction build
(
final Origin origin,
final String name,
@@ -100,7 +100,7 @@ public abstract class GenericInstruction extends Instruction
}
return
- (GenericInstruction) computation_class.getDeclaredMethod
+ (Instruction) computation_class.getDeclaredMethod
(
"build",
Origin.class,
diff --git a/src/core/src/tonkadur/fate/v1/lang/instruction/SequenceVariableJump.java b/src/core/src/tonkadur/fate/v1/lang/instruction/SequenceVariableJump.java
deleted file mode 100644
index 72bb3a2..0000000
--- a/src/core/src/tonkadur/fate/v1/lang/instruction/SequenceVariableJump.java
+++ /dev/null
@@ -1,129 +0,0 @@
-package tonkadur.fate.v1.lang.instruction;
-
-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.InvalidTypeException;
-
-import tonkadur.fate.v1.lang.type.SequenceType;
-import tonkadur.fate.v1.lang.type.Type;
-
-import tonkadur.fate.v1.lang.meta.Computation;
-import tonkadur.fate.v1.lang.meta.InstructionVisitor;
-import tonkadur.fate.v1.lang.meta.Instruction;
-import tonkadur.fate.v1.lang.meta.RecurrentChecks;
-
-public class SequenceVariableJump extends Instruction
-{
- /***************************************************************************/
- /**** MEMBERS **************************************************************/
- /***************************************************************************/
- protected final List<Computation> parameters;
- protected final Computation sequence;
-
- /***************************************************************************/
- /**** PROTECTED ************************************************************/
- /***************************************************************************/
- /**** Constructors *********************************************************/
- protected SequenceVariableJump
- (
- final Origin origin,
- final Computation sequence,
- final List<Computation> parameters
- )
- {
- super(origin);
-
- this.sequence = sequence;
- this.parameters = parameters;
- }
-
- /***************************************************************************/
- /**** PUBLIC ***************************************************************/
- /***************************************************************************/
- /**** Constructors *********************************************************/
- public static SequenceVariableJump build
- (
- final Origin origin,
- final Computation sequence,
- final List<Computation> parameters
- )
- throws ParsingError
- {
- final List<Type> signature;
-
- sequence.expect_non_string();
-
- // TODO: change this system, since we'd rather use the signature to tell
- // the parameters what to expect.
- ((SequenceType) sequence.get_type()).propose_signature_from_parameters
- (
- parameters
- );
-
- if (!sequence.get_type().get_act_as_type().equals(SequenceType.ARCHETYPE))
- {
- ErrorManager.handle
- (
- new InvalidTypeException
- (
- origin,
- sequence.get_type(),
- Collections.singleton(SequenceType.ARCHETYPE)
- )
- );
- }
-
- RecurrentChecks.propagate_expected_types_and_assert_computations_matches_signature
- (
- origin,
- parameters,
- ((SequenceType) sequence.get_type()).get_signature()
- );
-
- return new SequenceVariableJump(origin, sequence, parameters);
- }
-
- /**** Accessors ************************************************************/
- @Override
- public void get_visited_by (final InstructionVisitor iv)
- throws Throwable
- {
- iv.visit_sequence_variable_jump(this);
- }
-
- public Computation get_sequence ()
- {
- return sequence;
- }
-
- public List<Computation> get_parameters ()
- {
- return parameters;
- }
-
- /**** Misc. ****************************************************************/
- @Override
- public String toString ()
- {
- final StringBuilder sb = new StringBuilder();
-
- sb.append("(SequenceVariableJump ");
- sb.append(sequence);
-
- for (final Computation c: parameters)
- {
- sb.append(" ");
- sb.append(c.toString());
- }
-
- sb.append(")");
-
- return sb.toString();
- }
-}
diff --git a/src/core/src/tonkadur/fate/v1/lang/instruction/generic/AddElement.java b/src/core/src/tonkadur/fate/v1/lang/instruction/generic/AddElement.java
new file mode 100644
index 0000000..51296f4
--- /dev/null
+++ b/src/core/src/tonkadur/fate/v1/lang/instruction/generic/AddElement.java
@@ -0,0 +1,146 @@
+package tonkadur.fate.v1.lang.instruction.generic;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+
+import tonkadur.parser.Origin;
+import tonkadur.parser.ParsingError;
+
+import tonkadur.fate.v1.lang.meta.InstructionVisitor;
+import tonkadur.fate.v1.lang.meta.Instruction;
+import tonkadur.fate.v1.lang.meta.Computation;
+import tonkadur.fate.v1.lang.meta.RecurrentChecks;
+
+public class AddElement extends GenericInstruction
+{
+ public static Collection<String> get_aliases ()
+ {
+ final List<String> aliases;
+
+ aliases = new ArrayList<String>();
+
+ aliases.add("list:add_element");
+ aliases.add("list:addelement");
+ aliases.add("list:addElement");
+ aliases.add("list:add");
+
+ aliases.add("set:add_element");
+ aliases.add("set:addelement");
+ aliases.add("set:addElement");
+ aliases.add("set:add");
+
+ return aliases;
+ }
+
+ public static Instruction build
+ (
+ final Origin origin,
+ final String alias,
+ final List<Computation> call_parameters
+ )
+ throws Throwable
+ {
+ final Computation element;
+ final Computation collection;
+
+ if (call_parameters.size() != 2)
+ {
+ // TODO: Error.
+ System.err.print
+ (
+ "[E] Wrong number of arguments at "
+ + origin.toString()
+ );
+
+ return null;
+ }
+
+ element = call_parameters.get(0);
+ collection = call_parameters.get(1);
+
+ if (alias.startsWith("set:"))
+ {
+ RecurrentChecks.propagate_expected_types_and_assert_is_a_set_of
+ (
+ collection,
+ element
+ );
+ }
+ else
+ {
+ RecurrentChecks.propagate_expected_types_and_assert_is_a_list_of
+ (
+ collection,
+ element
+ );
+ }
+
+ collection.use_as_reference();
+
+ return new AddElement(origin, element, collection);
+ }
+
+ /***************************************************************************/
+ /**** MEMBERS **************************************************************/
+ /***************************************************************************/
+ protected final Computation element;
+ protected final Computation collection;
+
+ /***************************************************************************/
+ /**** PROTECTED ************************************************************/
+ /***************************************************************************/
+ /**** Constructors *********************************************************/
+ protected AddElement
+ (
+ final Origin origin,
+ final Computation element,
+ final Computation collection
+ )
+ {
+ super(origin);
+
+ this.collection = collection;
+ this.element = element;
+ }
+
+ /***************************************************************************/
+ /**** PUBLIC ***************************************************************/
+ /***************************************************************************/
+
+ /**** Accessors ************************************************************/
+ public Computation get_collection ()
+ {
+ return collection;
+ }
+
+ public Computation get_element ()
+ {
+ return element;
+ }
+
+ /**** Misc. ****************************************************************/
+ @Override
+ public String toString ()
+ {
+ final StringBuilder sb = new StringBuilder();
+
+ 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(")");
+
+ return sb.toString();
+ }
+}
diff --git a/src/core/src/tonkadur/fate/v1/lang/instruction/generic/AddElementAt.java b/src/core/src/tonkadur/fate/v1/lang/instruction/generic/AddElementAt.java
new file mode 100644
index 0000000..4436bea
--- /dev/null
+++ b/src/core/src/tonkadur/fate/v1/lang/instruction/generic/AddElementAt.java
@@ -0,0 +1,153 @@
+package tonkadur.fate.v1.lang.instruction.generic;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+
+import tonkadur.parser.Origin;
+import tonkadur.parser.ParsingError;
+
+import tonkadur.fate.v1.lang.type.Type;
+
+import tonkadur.fate.v1.lang.meta.InstructionVisitor;
+import tonkadur.fate.v1.lang.meta.Instruction;
+import tonkadur.fate.v1.lang.meta.Computation;
+import tonkadur.fate.v1.lang.meta.RecurrentChecks;
+
+public class AddElementAt extends GenericInstruction
+{
+ public static Collection<String> get_aliases ()
+ {
+ final List<String> aliases;
+
+ aliases = new ArrayList<String>();
+
+ aliases.add("list:add_element_at");
+ aliases.add("list:addelementat");
+ aliases.add("list:addElementAt");
+ aliases.add("list:add_at");
+ aliases.add("list:addat");
+ aliases.add("list:addAt");
+
+ return aliases;
+ }
+
+ public static Instruction build
+ (
+ final Origin origin,
+ final String _alias,
+ final List<Computation> call_parameters
+ )
+ throws Throwable
+ {
+ final Computation index;
+ final Computation element;
+ final Computation collection;
+
+ if (call_parameters.size() != 3)
+ {
+ // TODO: Error.
+ System.err.print
+ (
+ "[E] Wrong number of arguments at "
+ + origin.toString()
+ );
+
+ return null;
+ }
+
+ index = call_parameters.get(0);
+ element = call_parameters.get(1);
+ collection = call_parameters.get(2);
+
+ index.expect_non_string();
+ collection.expect_non_string();
+
+
+ RecurrentChecks.propagate_expected_types_and_assert_is_a_list_of
+ (
+ collection,
+ element
+ );
+
+ collection.use_as_reference();
+
+ return new AddElementAt(origin, index, element, collection);
+ }
+
+ /***************************************************************************/
+ /**** MEMBERS **************************************************************/
+ /***************************************************************************/
+ protected final Computation index;
+ protected final Computation element;
+ protected final Computation collection;
+
+ /***************************************************************************/
+ /**** PROTECTED ************************************************************/
+ /***************************************************************************/
+ /**** Constructors *********************************************************/
+ protected AddElementAt
+ (
+ final Origin origin,
+ final Computation index,
+ final Computation element,
+ final Computation collection
+ )
+ {
+ super(origin);
+
+ this.index = index;
+ this.collection = collection;
+ this.element = element;
+ }
+
+ /***************************************************************************/
+ /**** PUBLIC ***************************************************************/
+ /***************************************************************************/
+ /**** Accessors ************************************************************/
+ public Computation get_collection ()
+ {
+ return collection;
+ }
+
+ public Computation get_index ()
+ {
+ return index;
+ }
+
+ public Computation get_element ()
+ {
+ return element;
+ }
+
+ /**** Misc. ****************************************************************/
+ @Override
+ public String toString ()
+ {
+ final StringBuilder sb = new StringBuilder();
+
+ 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(")");
+
+ return sb.toString();
+ }
+}
diff --git a/src/core/src/tonkadur/fate/v1/lang/instruction/generic/AddElementsOf.java b/src/core/src/tonkadur/fate/v1/lang/instruction/generic/AddElementsOf.java
new file mode 100644
index 0000000..689ae35
--- /dev/null
+++ b/src/core/src/tonkadur/fate/v1/lang/instruction/generic/AddElementsOf.java
@@ -0,0 +1,180 @@
+package tonkadur.fate.v1.lang.instruction.generic;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+
+import tonkadur.parser.Origin;
+import tonkadur.parser.ParsingError;
+
+import tonkadur.fate.v1.lang.type.CollectionType;
+
+import tonkadur.fate.v1.lang.meta.InstructionVisitor;
+import tonkadur.fate.v1.lang.meta.Instruction;
+import tonkadur.fate.v1.lang.meta.Computation;
+import tonkadur.fate.v1.lang.meta.RecurrentChecks;
+
+public class AddElementsOf extends GenericInstruction
+{
+ public static Collection<String> get_aliases ()
+ {
+ final List<String> aliases;
+
+ aliases = new ArrayList<String>();
+
+ aliases.add("list:add_all");
+ aliases.add("list:addall");
+ aliases.add("list:addAll");
+
+ aliases.add("list:add_all_of");
+ aliases.add("list:addallof");
+ aliases.add("list:addAllOf");
+
+ aliases.add("list:add_elements");
+ aliases.add("list:addelements");
+ aliases.add("list:addElements");
+
+ aliases.add("list:add_elements_of");
+ aliases.add("list:addelementsof");
+ aliases.add("list:addElementsOf");
+
+ aliases.add("list:add_all_elements");
+ aliases.add("list:addallelements");
+ aliases.add("list:addAllElements");
+
+ aliases.add("list:add_all_elements_of");
+ aliases.add("list:addallelementsof");
+ aliases.add("list:addAllElementsOf");
+
+ aliases.add("set:add_all");
+ aliases.add("set:addall");
+ aliases.add("set:addAll");
+
+ aliases.add("set:add_all_of");
+ aliases.add("set:addallof");
+ aliases.add("set:addAllOf");
+
+ aliases.add("set:add_elements");
+ aliases.add("set:addelements");
+ aliases.add("set:addElements");
+
+ aliases.add("set:add_elements_of");
+ aliases.add("set:addelementsof");
+ aliases.add("set:addElementsOf");
+
+ aliases.add("set:add_all_elements");
+ aliases.add("set:addallelements");
+ aliases.add("set:addAllElements");
+
+ aliases.add("set:add_all_elements_of");
+ aliases.add("set:addallelementsof");
+ aliases.add("set:addAllElementsOf");
+
+ return aliases;
+ }
+
+ public static Instruction build
+ (
+ final Origin origin,
+ final String alias,
+ final List<Computation> call_parameters
+ )
+ throws Throwable
+ {
+ final Computation other_collection;
+ final Computation collection;
+
+ if (call_parameters.size() != 2)
+ {
+ // TODO: Error.
+ System.err.print
+ (
+ "[E] Wrong number of arguments at "
+ + origin.toString()
+ );
+
+ return null;
+ }
+
+ other_collection = call_parameters.get(0);
+ collection = call_parameters.get(1);
+
+ other_collection.expect_non_string();
+ collection.expect_non_string();
+
+ 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()
+ );
+
+ collection.use_as_reference();
+
+ return new AddElementsOf(origin, other_collection, collection);
+ }
+
+ /***************************************************************************/
+ /**** MEMBERS **************************************************************/
+ /***************************************************************************/
+ protected final Computation other_collection;
+ protected final Computation collection;
+
+ /***************************************************************************/
+ /**** PROTECTED ************************************************************/
+ /***************************************************************************/
+ /**** Constructors *********************************************************/
+ protected AddElementsOf
+ (
+ final Origin origin,
+ final Computation other_collection,
+ final Computation collection
+ )
+ {
+ super(origin);
+
+ this.collection = collection;
+ this.other_collection = other_collection;
+ }
+
+ /***************************************************************************/
+ /**** PUBLIC ***************************************************************/
+ /***************************************************************************/
+ /**** Accessors ************************************************************/
+ public Computation get_source_collection ()
+ {
+ return other_collection;
+ }
+
+ public Computation get_target_collection ()
+ {
+ return collection;
+ }
+
+ /**** Misc. ****************************************************************/
+ @Override
+ public String toString ()
+ {
+ final StringBuilder sb = new StringBuilder();
+
+ 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(")");
+
+ return sb.toString();
+ }
+}
diff --git a/src/core/src/tonkadur/fate/v1/lang/instruction/generic/Allocate.java b/src/core/src/tonkadur/fate/v1/lang/instruction/generic/Allocate.java
index feaf65b..6d42e94 100644
--- a/src/core/src/tonkadur/fate/v1/lang/instruction/generic/Allocate.java
+++ b/src/core/src/tonkadur/fate/v1/lang/instruction/generic/Allocate.java
@@ -36,7 +36,7 @@ public class Allocate extends GenericInstruction
return aliases;
}
- public static GenericInstruction build
+ public static Instruction build
(
final Origin origin,
final String _alias,
@@ -65,6 +65,8 @@ public class Allocate extends GenericInstruction
target_type = target.get_type();
+ target.use_as_reference();
+
if (target_type instanceof PointerType)
{
return
@@ -89,6 +91,7 @@ public class Allocate extends GenericInstruction
)
);
+
return new Allocate(origin, Type.ANY, target);
}
diff --git a/src/core/src/tonkadur/fate/v1/lang/instruction/Break.java b/src/core/src/tonkadur/fate/v1/lang/instruction/generic/Break.java
index 653061d..dd26d0e 100644
--- a/src/core/src/tonkadur/fate/v1/lang/instruction/Break.java
+++ b/src/core/src/tonkadur/fate/v1/lang/instruction/generic/Break.java
@@ -1,12 +1,40 @@
-package tonkadur.fate.v1.lang.instruction;
+package tonkadur.fate.v1.lang.instruction.generic;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
import tonkadur.parser.Origin;
import tonkadur.fate.v1.lang.meta.InstructionVisitor;
import tonkadur.fate.v1.lang.meta.Instruction;
-public class Break extends Instruction
+public class Break extends GenericInstruction
{
+ public static Collection<String> get_aliases ()
+ {
+ final List<String> aliases;
+
+ aliases = new ArrayList<String>();
+
+ aliases.add("list:add_element_at");
+ aliases.add("list:addelementat");
+ aliases.add("list:addElementAt");
+ aliases.add("list:add_at");
+ aliases.add("list:addat");
+ aliases.add("list:addAt");
+
+ return aliases;
+ }
+
+ public static Instruction build
+ (
+ final Origin origin,
+ final String _alias,
+ final List<Computation> call_parameters
+ )
+ throws Throwable
+ {
/***************************************************************************/
/**** MEMBERS **************************************************************/
/***************************************************************************/
diff --git a/src/core/src/tonkadur/fate/v1/lang/instruction/generic/Clear.java b/src/core/src/tonkadur/fate/v1/lang/instruction/generic/Clear.java
index 12da2cb..f228174 100644
--- a/src/core/src/tonkadur/fate/v1/lang/instruction/generic/Clear.java
+++ b/src/core/src/tonkadur/fate/v1/lang/instruction/generic/Clear.java
@@ -32,7 +32,7 @@ public class Clear extends GenericInstruction
return aliases;
}
- public static GenericInstruction build
+ public static Instruction build
(
final Origin origin,
final String alias_,
diff --git a/src/core/src/tonkadur/fate/v1/lang/instruction/Done.java b/src/core/src/tonkadur/fate/v1/lang/instruction/generic/Done.java
index ada3b7c..ec21eec 100644
--- a/src/core/src/tonkadur/fate/v1/lang/instruction/Done.java
+++ b/src/core/src/tonkadur/fate/v1/lang/instruction/generic/Done.java
@@ -1,12 +1,40 @@
-package tonkadur.fate.v1.lang.instruction;
+package tonkadur.fate.v1.lang.instruction.generic;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
import tonkadur.parser.Origin;
import tonkadur.fate.v1.lang.meta.InstructionVisitor;
import tonkadur.fate.v1.lang.meta.Instruction;
-public class Done extends Instruction
+public class Done extends GenericInstruction
{
+ public static Collection<String> get_aliases ()
+ {
+ final List<String> aliases;
+
+ aliases = new ArrayList<String>();
+
+ aliases.add("list:add_element_at");
+ aliases.add("list:addelementat");
+ aliases.add("list:addElementAt");
+ aliases.add("list:add_at");
+ aliases.add("list:addat");
+ aliases.add("list:addAt");
+
+ return aliases;
+ }
+
+ public static Instruction build
+ (
+ final Origin origin,
+ final String _alias,
+ final List<Computation> call_parameters
+ )
+ throws Throwable
+ {
/***************************************************************************/
/**** MEMBERS **************************************************************/
/***************************************************************************/
diff --git a/src/core/src/tonkadur/fate/v1/lang/instruction/End.java b/src/core/src/tonkadur/fate/v1/lang/instruction/generic/End.java
index e39f435..762f0ba 100644
--- a/src/core/src/tonkadur/fate/v1/lang/instruction/End.java
+++ b/src/core/src/tonkadur/fate/v1/lang/instruction/generic/End.java
@@ -1,12 +1,40 @@
-package tonkadur.fate.v1.lang.instruction;
+package tonkadur.fate.v1.lang.instruction.generic;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
import tonkadur.parser.Origin;
import tonkadur.fate.v1.lang.meta.InstructionVisitor;
import tonkadur.fate.v1.lang.meta.Instruction;
-public class End extends Instruction
+public class End extends GenericInstruction
{
+ public static Collection<String> get_aliases ()
+ {
+ final List<String> aliases;
+
+ aliases = new ArrayList<String>();
+
+ aliases.add("list:add_element_at");
+ aliases.add("list:addelementat");
+ aliases.add("list:addElementAt");
+ aliases.add("list:add_at");
+ aliases.add("list:addat");
+ aliases.add("list:addAt");
+
+ return aliases;
+ }
+
+ public static Instruction build
+ (
+ final Origin origin,
+ final String _alias,
+ final List<Computation> call_parameters
+ )
+ throws Throwable
+ {
/***************************************************************************/
/**** MEMBERS **************************************************************/
/***************************************************************************/
diff --git a/src/core/src/tonkadur/fate/v1/lang/instruction/generic/Filter.java b/src/core/src/tonkadur/fate/v1/lang/instruction/generic/Filter.java
new file mode 100644
index 0000000..a86be76
--- /dev/null
+++ b/src/core/src/tonkadur/fate/v1/lang/instruction/generic/Filter.java
@@ -0,0 +1,141 @@
+package tonkadur.fate.v1.lang.instruction.generic;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+
+import java.util.Collections;
+import java.util.List;
+import java.util.ArrayList;
+
+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.meta.Computation;
+import tonkadur.fate.v1.lang.meta.Instruction;
+import tonkadur.fate.v1.lang.meta.InstructionVisitor;
+import tonkadur.fate.v1.lang.meta.RecurrentChecks;
+
+public class Filter extends GenericInstruction
+{
+ public static Collection<String> get_aliases ()
+ {
+ final List<String> aliases;
+
+ aliases = new ArrayList<String>();
+
+ aliases.add("list:filter");
+ aliases.add("set:filter");
+
+ return aliases;
+ }
+
+ public static Instruction build
+ (
+ final Origin origin,
+ final String _alias,
+ final List<Computation> call_parameters
+ )
+ throws Throwable
+ {
+ // TODO: implement
+ final Computation lambda_function = null;
+ final Computation collection = null;
+ final List<Computation> extra_params = null;
+ final List<Type> target_signature;
+
+ target_signature = new ArrayList<Type>();
+
+ RecurrentChecks.assert_is_a_collection(collection);
+
+ target_signature.add
+ (
+ ((CollectionType) collection.get_type()).get_content_type()
+ );
+
+ for (final Computation c: extra_params)
+ {
+ target_signature.add(c.get_type());
+ }
+ RecurrentChecks.assert_lambda_matches_types
+ (
+ lambda_function,
+ Type.BOOL,
+ target_signature
+ );
+
+ return new Filter(origin, lambda_function, collection, extra_params);
+
+ }
+
+ /***************************************************************************/
+ /**** MEMBERS **************************************************************/
+ /***************************************************************************/
+ protected final List<Computation> extra_params;
+ protected final Computation lambda_function;
+ protected final Computation collection;
+
+ /***************************************************************************/
+ /**** PROTECTED ************************************************************/
+ /***************************************************************************/
+ /**** Constructors *********************************************************/
+ protected Filter
+ (
+ final Origin origin,
+ final Computation lambda_function,
+ final Computation collection,
+ final List<Computation> extra_params
+ )
+ {
+ super(origin);
+
+ this.lambda_function = lambda_function;
+ this.collection = collection;
+ this.extra_params = extra_params;
+ }
+
+ /***************************************************************************/
+ /**** PUBLIC ***************************************************************/
+ /***************************************************************************/
+ /**** Accessors ************************************************************/
+ public Computation get_lambda_function ()
+ {
+ return lambda_function;
+ }
+
+ public Computation get_collection ()
+ {
+ return collection;
+ }
+
+ public List<Computation> get_extra_parameters ()
+ {
+ return extra_params;
+ }
+
+ /**** Misc. ****************************************************************/
+ @Override
+ public String toString ()
+ {
+ final StringBuilder sb = new StringBuilder();
+
+ sb.append("(Filter ");
+ sb.append(lambda_function.toString());
+ sb.append(" ");
+ sb.append(collection.toString());
+
+ for (final Computation c: extra_params)
+ {
+ sb.append(" ");
+ sb.append(c.toString());
+ }
+
+ sb.append(")");
+
+ return sb.toString();
+ }
+}
diff --git a/src/core/src/tonkadur/fate/v1/lang/instruction/generic/Free.java b/src/core/src/tonkadur/fate/v1/lang/instruction/generic/Free.java
index 4fd8241..799c47d 100644
--- a/src/core/src/tonkadur/fate/v1/lang/instruction/generic/Free.java
+++ b/src/core/src/tonkadur/fate/v1/lang/instruction/generic/Free.java
@@ -32,7 +32,7 @@ public class Free extends GenericInstruction
return aliases;
}
- public static GenericInstruction build
+ public static Instruction build
(
final Origin origin,
final String alias_,
diff --git a/src/core/src/tonkadur/fate/v1/lang/instruction/generic/IndexedFilter.java b/src/core/src/tonkadur/fate/v1/lang/instruction/generic/IndexedFilter.java
new file mode 100644
index 0000000..7477df1
--- /dev/null
+++ b/src/core/src/tonkadur/fate/v1/lang/instruction/generic/IndexedFilter.java
@@ -0,0 +1,160 @@
+package tonkadur.fate.v1.lang.instruction.generic;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+
+import java.util.Collections;
+import java.util.List;
+import java.util.ArrayList;
+
+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.meta.Computation;
+import tonkadur.fate.v1.lang.meta.Instruction;
+import tonkadur.fate.v1.lang.meta.InstructionVisitor;
+import tonkadur.fate.v1.lang.meta.Computation;
+import tonkadur.fate.v1.lang.meta.RecurrentChecks;
+
+public class IndexedFilter extends GenericInstruction
+{
+ public static Collection<String> get_aliases ()
+ {
+ final List<String> aliases;
+
+ aliases = new ArrayList<String>();
+
+ aliases.add("list:add_element_at");
+ aliases.add("list:addelementat");
+ aliases.add("list:addElementAt");
+ aliases.add("list:add_at");
+ aliases.add("list:addat");
+ aliases.add("list:addAt");
+
+ return aliases;
+ }
+
+ public static Instruction build
+ (
+ final Origin origin,
+ final String _alias,
+ final List<Computation> call_parameters
+ )
+ throws Throwable
+ {
+ /***************************************************************************/
+ /**** MEMBERS **************************************************************/
+ /***************************************************************************/
+ protected final List<Computation> extra_params;
+ protected final Computation lambda_function;
+ protected final Computation collection;
+
+ /***************************************************************************/
+ /**** PROTECTED ************************************************************/
+ /***************************************************************************/
+ /**** Constructors *********************************************************/
+ protected IndexedFilter
+ (
+ final Origin origin,
+ final Computation lambda_function,
+ final Computation collection,
+ final List<Computation> extra_params
+ )
+ {
+ super(origin);
+
+ this.lambda_function = lambda_function;
+ this.collection = collection;
+ this.extra_params = extra_params;
+ }
+
+ /***************************************************************************/
+ /**** PUBLIC ***************************************************************/
+ /***************************************************************************/
+ /**** Constructors *********************************************************/
+ public static IndexedFilter build
+ (
+ final Origin origin,
+ final Computation lambda_function,
+ final Computation collection,
+ final List<Computation> extra_params
+ )
+ throws ParsingError
+ {
+ final List<Type> target_signature;
+
+ target_signature = new ArrayList<Type>();
+
+ RecurrentChecks.assert_is_a_collection(collection);
+
+ target_signature.add(Type.INT);
+ target_signature.add
+ (
+ ((CollectionType) collection.get_type()).get_content_type()
+ );
+
+ for (final Computation c: extra_params)
+ {
+ target_signature.add(c.get_type());
+ }
+
+ RecurrentChecks.assert_lambda_matches_types
+ (
+ lambda_function,
+ Type.BOOL,
+ target_signature
+ );
+
+ return new IndexedFilter(origin, lambda_function, collection, extra_params);
+ }
+
+ /**** Accessors ************************************************************/
+ @Override
+ public void get_visited_by (final InstructionVisitor iv)
+ throws Throwable
+ {
+ iv.visit_indexed_filter(this);
+ }
+
+ public Computation get_lambda_function ()
+ {
+ return lambda_function;
+ }
+
+ public Computation get_collection ()
+ {
+ return collection;
+ }
+
+ public List<Computation> get_extra_parameters ()
+ {
+ return extra_params;
+ }
+
+ /**** Misc. ****************************************************************/
+ @Override
+ public String toString ()
+ {
+ final StringBuilder sb = new StringBuilder();
+
+ sb.append("(IndexedFilter ");
+ sb.append(lambda_function.toString());
+ sb.append(" ");
+ sb.append(collection.toString());
+
+ for (final Computation c: extra_params)
+ {
+ sb.append(" ");
+ sb.append(c.toString());
+ }
+
+ sb.append(")");
+
+ return sb.toString();
+ }
+}
diff --git a/src/core/src/tonkadur/fate/v1/lang/instruction/generic/IndexedMap.java b/src/core/src/tonkadur/fate/v1/lang/instruction/generic/IndexedMap.java
new file mode 100644
index 0000000..bbb0188
--- /dev/null
+++ b/src/core/src/tonkadur/fate/v1/lang/instruction/generic/IndexedMap.java
@@ -0,0 +1,158 @@
+package tonkadur.fate.v1.lang.instruction.generic;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import tonkadur.parser.Origin;
+import tonkadur.parser.ParsingError;
+
+import tonkadur.fate.v1.lang.type.Type;
+import tonkadur.fate.v1.lang.type.CollectionType;
+
+import tonkadur.fate.v1.lang.meta.Computation;
+import tonkadur.fate.v1.lang.meta.Instruction;
+import tonkadur.fate.v1.lang.meta.InstructionVisitor;
+import tonkadur.fate.v1.lang.meta.Computation;
+import tonkadur.fate.v1.lang.meta.RecurrentChecks;
+
+public class IndexedMap extends GenericInstruction
+{
+ public static Collection<String> get_aliases ()
+ {
+ final List<String> aliases;
+
+ aliases = new ArrayList<String>();
+
+ aliases.add("list:add_element_at");
+ aliases.add("list:addelementat");
+ aliases.add("list:addElementAt");
+ aliases.add("list:add_at");
+ aliases.add("list:addat");
+ aliases.add("list:addAt");
+
+ return aliases;
+ }
+
+ public static Instruction build
+ (
+ final Origin origin,
+ final String _alias,
+ final List<Computation> call_parameters
+ )
+ throws Throwable
+ {
+ /***************************************************************************/
+ /**** MEMBERS **************************************************************/
+ /***************************************************************************/
+ protected final List<Computation> extra_params;
+ protected final Computation lambda_function;
+ protected final Computation collection;
+
+ /***************************************************************************/
+ /**** PROTECTED ************************************************************/
+ /***************************************************************************/
+ /**** Constructors *********************************************************/
+ protected IndexedMap
+ (
+ final Origin origin,
+ final Computation lambda_function,
+ final Computation collection,
+ final List<Computation> extra_params
+ )
+ {
+ super(origin);
+
+ this.lambda_function = lambda_function;
+ this.collection = collection;
+ this.extra_params = extra_params;
+ }
+
+ /***************************************************************************/
+ /**** PUBLIC ***************************************************************/
+ /***************************************************************************/
+ /**** Constructors *********************************************************/
+ public static IndexedMap build
+ (
+ final Origin origin,
+ final Computation lambda_function,
+ final Computation collection,
+ final List<Computation> extra_params
+ )
+ throws Throwable
+ {
+ final List<Type> in_types;
+
+ in_types = new ArrayList<Type>();
+
+ RecurrentChecks.assert_is_a_collection(collection);
+
+ in_types.add(Type.INT);
+ in_types.add
+ (
+ ((CollectionType) collection.get_type()).get_content_type()
+ );
+
+ for (final Computation c: extra_params)
+ {
+ in_types.add(c.get_type());
+ }
+
+ RecurrentChecks.assert_lambda_matches_types
+ (
+ lambda_function,
+ ((CollectionType) collection.get_type()).get_content_type(),
+ in_types
+ );
+
+ return new IndexedMap(origin, lambda_function, collection, extra_params);
+ }
+
+ /**** Accessors ************************************************************/
+ @Override
+ public void get_visited_by (final InstructionVisitor iv)
+ throws Throwable
+ {
+ iv.visit_indexed_map(this);
+ }
+
+ public Computation get_lambda_function ()
+ {
+ return lambda_function;
+ }
+
+ public Computation get_collection ()
+ {
+ return collection;
+ }
+
+ public List<Computation> get_extra_parameters ()
+ {
+ return extra_params;
+ }
+
+ /**** Misc. ****************************************************************/
+ @Override
+ public String toString ()
+ {
+ final StringBuilder sb = new StringBuilder();
+
+ sb.append("(IndexedMap ");
+ sb.append(lambda_function.toString());
+ sb.append(" ");
+ sb.append(collection.toString());
+
+ for (final Computation c: extra_params)
+ {
+ sb.append(" ");
+ sb.append(c.toString());
+ }
+
+ sb.append(")");
+
+ return sb.toString();
+ }
+}
diff --git a/src/core/src/tonkadur/fate/v1/lang/instruction/generic/IndexedMerge.java b/src/core/src/tonkadur/fate/v1/lang/instruction/generic/IndexedMerge.java
new file mode 100644
index 0000000..f2bab19
--- /dev/null
+++ b/src/core/src/tonkadur/fate/v1/lang/instruction/generic/IndexedMerge.java
@@ -0,0 +1,244 @@
+package tonkadur.fate.v1.lang.instruction.generic;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import tonkadur.parser.Origin;
+import tonkadur.parser.ParsingError;
+
+import tonkadur.fate.v1.lang.type.Type;
+import tonkadur.fate.v1.lang.type.CollectionType;
+
+import tonkadur.fate.v1.lang.meta.Computation;
+import tonkadur.fate.v1.lang.meta.Instruction;
+import tonkadur.fate.v1.lang.meta.InstructionVisitor;
+import tonkadur.fate.v1.lang.meta.Computation;
+import tonkadur.fate.v1.lang.meta.RecurrentChecks;
+
+public class IndexedMerge extends GenericInstruction
+{
+ public static Collection<String> get_aliases ()
+ {
+ final List<String> aliases;
+
+ aliases = new ArrayList<String>();
+
+ aliases.add("list:add_element_at");
+ aliases.add("list:addelementat");
+ aliases.add("list:addElementAt");
+ aliases.add("list:add_at");
+ aliases.add("list:addat");
+ aliases.add("list:addAt");
+
+ return aliases;
+ }
+
+ public static Instruction build
+ (
+ final Origin origin,
+ final String _alias,
+ final List<Computation> call_parameters
+ )
+ throws Throwable
+ {
+ /***************************************************************************/
+ /**** MEMBERS **************************************************************/
+ /***************************************************************************/
+ protected final List<Computation> extra_params;
+ protected final Computation lambda_function;
+ protected final Computation collection;
+ protected final Computation default_a;
+ protected final Computation collection_in_b;
+ protected final Computation default_b;
+
+ /***************************************************************************/
+ /**** PROTECTED ************************************************************/
+ /***************************************************************************/
+ /**** Constructors *********************************************************/
+ protected IndexedMerge
+ (
+ final Origin origin,
+ final Computation lambda_function,
+ final Computation collection_in_b,
+ final Computation default_b,
+ final Computation collection,
+ final Computation default_a,
+ final List<Computation> extra_params
+ )
+ {
+ super(origin);
+
+ this.lambda_function = lambda_function;
+ this.collection = collection;
+ this.default_a = default_a;
+ this.collection_in_b = collection_in_b;
+ this.default_b = default_b;
+ this.extra_params = extra_params;
+ }
+
+ /***************************************************************************/
+ /**** PUBLIC ***************************************************************/
+ /***************************************************************************/
+ /**** Constructors *********************************************************/
+ public static IndexedMerge build
+ (
+ final Origin origin,
+ final Computation lambda_function,
+ final Computation collection_in_b,
+ final Computation default_b,
+ final Computation collection,
+ final Computation default_a,
+ final List<Computation> extra_params
+ )
+ throws Throwable
+ {
+ final List<Type> types_in;
+
+ types_in = new ArrayList<Type>();
+
+ if (default_a == null)
+ {
+ RecurrentChecks.assert_is_a_collection(collection);
+ }
+ else
+ {
+ RecurrentChecks.assert_is_a_collection_of(collection, 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(Type.INT);
+ types_in.add
+ (
+ ((CollectionType) collection.get_type()).get_content_type()
+ );
+
+ if (default_b != null)
+ {
+ types_in.add(Type.INT);
+ }
+
+ types_in.add
+ (
+ ((CollectionType) collection_in_b.get_type()).get_content_type()
+ );
+
+ for (final Computation c: extra_params)
+ {
+ types_in.add(c.get_type());
+ }
+
+ RecurrentChecks.assert_lambda_matches_types
+ (
+ lambda_function,
+ ((CollectionType) collection.get_type()).get_content_type(),
+ types_in
+ );
+
+ return
+ new IndexedMerge
+ (
+ origin,
+ lambda_function,
+ collection_in_b,
+ default_b,
+ collection,
+ default_a,
+ extra_params
+ );
+ }
+
+ /**** Accessors ************************************************************/
+ @Override
+ public void get_visited_by (final InstructionVisitor iv)
+ throws Throwable
+ {
+ iv.visit_indexed_merge(this);
+ }
+
+ public Computation get_lambda_function ()
+ {
+ return lambda_function;
+ }
+
+ public Computation get_main_default ()
+ {
+ return default_a;
+ }
+
+ public Computation get_secondary_collection ()
+ {
+ return collection_in_b;
+ }
+
+ public Computation get_secondary_default ()
+ {
+ return default_b;
+ }
+
+ public Computation get_main_collection ()
+ {
+ return collection;
+ }
+
+ public List<Computation> get_extra_parameters ()
+ {
+ return extra_params;
+ }
+
+ /**** Misc. ****************************************************************/
+ @Override
+ public String toString ()
+ {
+ final StringBuilder sb = new StringBuilder();
+
+ sb.append("(IndexedMerge ");
+ sb.append(lambda_function.toString());
+ sb.append(" ");
+ sb.append(collection.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());
+ }
+
+ for (final Computation c: extra_params)
+ {
+ sb.append(" ");
+ sb.append(c.toString());
+ }
+
+ sb.append(")");
+
+ return sb.toString();
+ }
+}
diff --git a/src/core/src/tonkadur/fate/v1/lang/instruction/generic/IndexedPartition.java b/src/core/src/tonkadur/fate/v1/lang/instruction/generic/IndexedPartition.java
new file mode 100644
index 0000000..aa049ca
--- /dev/null
+++ b/src/core/src/tonkadur/fate/v1/lang/instruction/generic/IndexedPartition.java
@@ -0,0 +1,184 @@
+package tonkadur.fate.v1.lang.instruction.generic;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+
+import java.util.Collections;
+import java.util.List;
+import java.util.ArrayList;
+
+import tonkadur.parser.Origin;
+import tonkadur.parser.ParsingError;
+
+import tonkadur.fate.v1.lang.type.Type;
+import tonkadur.fate.v1.lang.type.CollectionType;
+
+import tonkadur.fate.v1.lang.meta.Computation;
+import tonkadur.fate.v1.lang.meta.Instruction;
+import tonkadur.fate.v1.lang.meta.InstructionVisitor;
+import tonkadur.fate.v1.lang.meta.Computation;
+import tonkadur.fate.v1.lang.meta.RecurrentChecks;
+
+public class IndexedPartition extends GenericInstruction
+{
+ public static Collection<String> get_aliases ()
+ {
+ final List<String> aliases;
+
+ aliases = new ArrayList<String>();
+
+ aliases.add("list:add_element_at");
+ aliases.add("list:addelementat");
+ aliases.add("list:addElementAt");
+ aliases.add("list:add_at");
+ aliases.add("list:addat");
+ aliases.add("list:addAt");
+
+ return aliases;
+ }
+
+ public static Instruction build
+ (
+ final Origin origin,
+ final String _alias,
+ final List<Computation> call_parameters
+ )
+ throws Throwable
+ {
+ /***************************************************************************/
+ /**** MEMBERS **************************************************************/
+ /***************************************************************************/
+ protected final List<Computation> extra_params;
+ protected final Computation lambda_function;
+ protected final Computation collection_in;
+ protected final Computation collection_out;
+
+ /***************************************************************************/
+ /**** PROTECTED ************************************************************/
+ /***************************************************************************/
+ /**** Constructors *********************************************************/
+ protected IndexedPartition
+ (
+ final Origin origin,
+ final Computation lambda_function,
+ final Computation collection_in,
+ final Computation collection_out,
+ final List<Computation> extra_params
+ )
+ {
+ super(origin);
+
+ this.lambda_function = lambda_function;
+ this.collection_in = collection_in;
+ this.collection_out = collection_out;
+ this.extra_params = extra_params;
+ }
+
+ /***************************************************************************/
+ /**** PUBLIC ***************************************************************/
+ /***************************************************************************/
+ /**** Constructors *********************************************************/
+ public static IndexedPartition build
+ (
+ final Origin origin,
+ final Computation lambda_function,
+ final Computation collection_in,
+ final Computation collection_out,
+ final List<Computation> extra_params
+ )
+ throws ParsingError
+ {
+ final List<Type> target_signature;
+
+ target_signature = new ArrayList<Type>();
+
+ RecurrentChecks.assert_is_a_collection(collection_in);
+ RecurrentChecks.assert_is_a_collection(collection_out);
+ RecurrentChecks.assert_can_be_used_as
+ (
+ collection_in,
+ collection_out.get_type()
+ );
+
+ target_signature.add(Type.INT);
+ target_signature.add
+ (
+ ((CollectionType) collection_in.get_type()).get_content_type()
+ );
+
+ for (final Computation c: extra_params)
+ {
+ target_signature.add(c.get_type());
+ }
+
+ RecurrentChecks.assert_lambda_matches_types
+ (
+ lambda_function,
+ Type.BOOL,
+ target_signature
+ );
+
+ return
+ new IndexedPartition
+ (
+ origin,
+ lambda_function,
+ collection_in,
+ collection_out,
+ extra_params
+ );
+ }
+
+ /**** Accessors ************************************************************/
+ @Override
+ public void get_visited_by (final InstructionVisitor iv)
+ throws Throwable
+ {
+ iv.visit_indexed_partition(this);
+ }
+
+ public Computation get_lambda_function ()
+ {
+ return lambda_function;
+ }
+
+ public Computation get_collection_in ()
+ {
+ return collection_in;
+ }
+
+ public Computation get_collection_out ()
+ {
+ return collection_out;
+ }
+
+ public List<Computation> get_extra_parameters ()
+ {
+ return extra_params;
+ }
+
+ /**** Misc. ****************************************************************/
+ @Override
+ public String toString ()
+ {
+ final StringBuilder sb = new StringBuilder();
+
+ sb.append("(IndexedPartition ");
+ sb.append(lambda_function.toString());
+ sb.append(" ");
+ sb.append(collection_in.toString());
+ sb.append(" ");
+ sb.append(collection_out.toString());
+
+ for (final Computation c: extra_params)
+ {
+ sb.append(" ");
+ sb.append(c.toString());
+ }
+
+ sb.append(")");
+
+ return sb.toString();
+ }
+}
diff --git a/src/core/src/tonkadur/fate/v1/lang/instruction/generic/Map.java b/src/core/src/tonkadur/fate/v1/lang/instruction/generic/Map.java
new file mode 100644
index 0000000..067b161
--- /dev/null
+++ b/src/core/src/tonkadur/fate/v1/lang/instruction/generic/Map.java
@@ -0,0 +1,158 @@
+package tonkadur.fate.v1.lang.instruction.generic;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+
+import java.util.Collections;
+import java.util.List;
+import java.util.ArrayList;
+
+import tonkadur.parser.Origin;
+import tonkadur.parser.ParsingError;
+
+import tonkadur.fate.v1.lang.type.Type;
+import tonkadur.fate.v1.lang.type.CollectionType;
+
+import tonkadur.fate.v1.lang.meta.Computation;
+import tonkadur.fate.v1.lang.meta.Instruction;
+import tonkadur.fate.v1.lang.meta.InstructionVisitor;
+import tonkadur.fate.v1.lang.meta.Computation;
+import tonkadur.fate.v1.lang.meta.RecurrentChecks;
+
+public class Map extends GenericInstruction
+{
+ public static Collection<String> get_aliases ()
+ {
+ final List<String> aliases;
+
+ aliases = new ArrayList<String>();
+
+ aliases.add("list:add_element_at");
+ aliases.add("list:addelementat");
+ aliases.add("list:addElementAt");
+ aliases.add("list:add_at");
+ aliases.add("list:addat");
+ aliases.add("list:addAt");
+
+ return aliases;
+ }
+
+ public static Instruction build
+ (
+ final Origin origin,
+ final String _alias,
+ final List<Computation> call_parameters
+ )
+ throws Throwable
+ {
+ /***************************************************************************/
+ /**** MEMBERS **************************************************************/
+ /***************************************************************************/
+ protected final List<Computation> extra_params;
+ protected final Computation lambda_function;
+ protected final Computation collection;
+
+ /***************************************************************************/
+ /**** PROTECTED ************************************************************/
+ /***************************************************************************/
+ /**** Constructors *********************************************************/
+ protected Map
+ (
+ final Origin origin,
+ final Computation lambda_function,
+ final Computation collection,
+ final List<Computation> extra_params
+ )
+ {
+ super(origin);
+
+ this.lambda_function = lambda_function;
+ this.collection = collection;
+ this.extra_params = extra_params;
+ }
+
+ /***************************************************************************/
+ /**** PUBLIC ***************************************************************/
+ /***************************************************************************/
+ /**** Constructors *********************************************************/
+ public static Map build
+ (
+ final Origin origin,
+ final Computation lambda_function,
+ final Computation collection,
+ final List<Computation> extra_params
+ )
+ throws ParsingError
+ {
+ final List<Type> target_signature;
+
+ target_signature = new ArrayList<Type>();
+
+ RecurrentChecks.assert_is_a_collection(collection);
+
+ target_signature.add
+ (
+ ((CollectionType) collection.get_type()).get_content_type()
+ );
+
+ for (final Computation c: extra_params)
+ {
+ target_signature.add(c.get_type());
+ }
+
+ RecurrentChecks.assert_lambda_matches_types
+ (
+ lambda_function,
+ ((CollectionType) collection.get_type()).get_content_type(),
+ target_signature
+ );
+
+ return new Map(origin, lambda_function, collection, extra_params);
+ }
+
+ /**** Accessors ************************************************************/
+ @Override
+ public void get_visited_by (final InstructionVisitor iv)
+ throws Throwable
+ {
+ iv.visit_map(this);
+ }
+
+ public Computation get_lambda_function ()
+ {
+ return lambda_function;
+ }
+
+ public Computation get_collection ()
+ {
+ return collection;
+ }
+
+ public List<Computation> get_extra_parameters ()
+ {
+ return extra_params;
+ }
+
+ /**** Misc. ****************************************************************/
+ @Override
+ public String toString ()
+ {
+ final StringBuilder sb = new StringBuilder();
+
+ sb.append("(Map ");
+ sb.append(lambda_function.toString());
+ sb.append(" ");
+ sb.append(collection.toString());
+
+ for (final Computation c: extra_params)
+ {
+ sb.append(" ");
+ sb.append(c.toString());
+ }
+
+ sb.append(")");
+
+ return sb.toString();
+ }
+}
diff --git a/src/core/src/tonkadur/fate/v1/lang/instruction/generic/Merge.java b/src/core/src/tonkadur/fate/v1/lang/instruction/generic/Merge.java
new file mode 100644
index 0000000..ddfe4b7
--- /dev/null
+++ b/src/core/src/tonkadur/fate/v1/lang/instruction/generic/Merge.java
@@ -0,0 +1,238 @@
+package tonkadur.fate.v1.lang.instruction.generic;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import tonkadur.parser.Origin;
+import tonkadur.parser.ParsingError;
+
+import tonkadur.fate.v1.lang.type.Type;
+import tonkadur.fate.v1.lang.type.CollectionType;
+
+import tonkadur.fate.v1.lang.meta.Computation;
+import tonkadur.fate.v1.lang.meta.Instruction;
+import tonkadur.fate.v1.lang.meta.InstructionVisitor;
+import tonkadur.fate.v1.lang.meta.Computation;
+import tonkadur.fate.v1.lang.meta.RecurrentChecks;
+
+public class Merge extends GenericInstruction
+{
+ public static Collection<String> get_aliases ()
+ {
+ final List<String> aliases;
+
+ aliases = new ArrayList<String>();
+
+ aliases.add("list:add_element_at");
+ aliases.add("list:addelementat");
+ aliases.add("list:addElementAt");
+ aliases.add("list:add_at");
+ aliases.add("list:addat");
+ aliases.add("list:addAt");
+
+ return aliases;
+ }
+
+ public static Instruction build
+ (
+ final Origin origin,
+ final String _alias,
+ final List<Computation> call_parameters
+ )
+ throws Throwable
+ {
+ /***************************************************************************/
+ /**** MEMBERS **************************************************************/
+ /***************************************************************************/
+ protected final List<Computation> extra_params;
+ protected final Computation lambda_function;
+ protected final Computation collection;
+ protected final Computation default_a;
+ protected final Computation collection_in_b;
+ protected final Computation default_b;
+
+ /***************************************************************************/
+ /**** PROTECTED ************************************************************/
+ /***************************************************************************/
+ /**** Constructors *********************************************************/
+ protected Merge
+ (
+ final Origin origin,
+ final Computation lambda_function,
+ final Computation collection_in_b,
+ final Computation default_b,
+ final Computation collection,
+ final Computation default_a,
+ final List<Computation> extra_params
+ )
+ {
+ super(origin);
+
+ this.lambda_function = lambda_function;
+ this.collection = collection;
+ this.default_a = default_a;
+ this.collection_in_b = collection_in_b;
+ this.default_b = default_b;
+ this.extra_params = extra_params;
+ }
+
+ /***************************************************************************/
+ /**** PUBLIC ***************************************************************/
+ /***************************************************************************/
+ /**** Constructors *********************************************************/
+ public static Merge build
+ (
+ final Origin origin,
+ final Computation lambda_function,
+ final Computation collection_in_b,
+ final Computation default_b,
+ final Computation collection,
+ final Computation default_a,
+ final List<Computation> extra_params
+ )
+ throws Throwable
+ {
+ final List<Type> types_in;
+
+ types_in = new ArrayList<Type>();
+
+ if (default_a == null)
+ {
+ RecurrentChecks.assert_is_a_collection(collection);
+ }
+ else
+ {
+ RecurrentChecks.assert_is_a_collection_of(collection, 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.get_type()).get_content_type()
+ );
+
+ types_in.add
+ (
+ ((CollectionType) collection_in_b.get_type()).get_content_type()
+ );
+
+ for (final Computation c: extra_params)
+ {
+ types_in.add(c.get_type());
+ }
+
+ RecurrentChecks.assert_lambda_matches_types
+ (
+ lambda_function,
+ ((CollectionType) collection.get_type()).get_content_type(),
+ types_in
+ );
+
+ return
+ new Merge
+ (
+ origin,
+ lambda_function,
+ collection_in_b,
+ default_b,
+ collection,
+ default_a,
+ extra_params
+ );
+ }
+
+ /**** Accessors ************************************************************/
+ @Override
+ public void get_visited_by (final InstructionVisitor iv)
+ throws Throwable
+ {
+ iv.visit_merge(this);
+ }
+
+ public Computation get_lambda_function ()
+ {
+ return lambda_function;
+ }
+
+ public Computation get_main_default ()
+ {
+ return default_a;
+ }
+
+ public Computation get_secondary_collection ()
+ {
+ return collection_in_b;
+ }
+
+ public Computation get_secondary_default ()
+ {
+ return default_b;
+ }
+
+ public Computation get_main_collection ()
+ {
+ return collection;
+ }
+
+ public List<Computation> get_extra_parameters ()
+ {
+ return extra_params;
+ }
+
+ /**** Misc. ****************************************************************/
+ @Override
+ public String toString ()
+ {
+ final StringBuilder sb = new StringBuilder();
+
+ sb.append("(Merge ");
+ sb.append(lambda_function.toString());
+ sb.append(" ");
+ sb.append(collection.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());
+ }
+
+ for (final Computation c: extra_params)
+ {
+ sb.append(" ");
+ sb.append(c.toString());
+ }
+
+ sb.append(")");
+
+ return sb.toString();
+ }
+}
diff --git a/src/core/src/tonkadur/fate/v1/lang/instruction/generic/Partition.java b/src/core/src/tonkadur/fate/v1/lang/instruction/generic/Partition.java
new file mode 100644
index 0000000..be4b733
--- /dev/null
+++ b/src/core/src/tonkadur/fate/v1/lang/instruction/generic/Partition.java
@@ -0,0 +1,183 @@
+package tonkadur.fate.v1.lang.instruction.generic;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+
+import java.util.Collections;
+import java.util.List;
+import java.util.ArrayList;
+
+import tonkadur.parser.Origin;
+import tonkadur.parser.ParsingError;
+
+import tonkadur.fate.v1.lang.type.Type;
+import tonkadur.fate.v1.lang.type.CollectionType;
+
+import tonkadur.fate.v1.lang.meta.Computation;
+import tonkadur.fate.v1.lang.meta.Instruction;
+import tonkadur.fate.v1.lang.meta.InstructionVisitor;
+import tonkadur.fate.v1.lang.meta.Computation;
+import tonkadur.fate.v1.lang.meta.RecurrentChecks;
+
+public class Partition extends GenericInstruction
+{
+ public static Collection<String> get_aliases ()
+ {
+ final List<String> aliases;
+
+ aliases = new ArrayList<String>();
+
+ aliases.add("list:add_element_at");
+ aliases.add("list:addelementat");
+ aliases.add("list:addElementAt");
+ aliases.add("list:add_at");
+ aliases.add("list:addat");
+ aliases.add("list:addAt");
+
+ return aliases;
+ }
+
+ public static Instruction build
+ (
+ final Origin origin,
+ final String _alias,
+ final List<Computation> call_parameters
+ )
+ throws Throwable
+ {
+ /***************************************************************************/
+ /**** MEMBERS **************************************************************/
+ /***************************************************************************/
+ protected final List<Computation> extra_params;
+ protected final Computation lambda_function;
+ protected final Computation collection_in;
+ protected final Computation collection_out;
+
+ /***************************************************************************/
+ /**** PROTECTED ************************************************************/
+ /***************************************************************************/
+ /**** Constructors *********************************************************/
+ protected Partition
+ (
+ final Origin origin,
+ final Computation lambda_function,
+ final Computation collection_in,
+ final Computation collection_out,
+ final List<Computation> extra_params
+ )
+ {
+ super(origin);
+
+ this.lambda_function = lambda_function;
+ this.collection_in = collection_in;
+ this.collection_out = collection_out;
+ this.extra_params = extra_params;
+ }
+
+ /***************************************************************************/
+ /**** PUBLIC ***************************************************************/
+ /***************************************************************************/
+ /**** Constructors *********************************************************/
+ public static Partition build
+ (
+ final Origin origin,
+ final Computation lambda_function,
+ final Computation collection_in,
+ final Computation collection_out,
+ final List<Computation> extra_params
+ )
+ throws ParsingError
+ {
+ final List<Type> target_signature;
+
+ target_signature = new ArrayList<Type>();
+
+ RecurrentChecks.assert_is_a_collection(collection_in);
+ RecurrentChecks.assert_is_a_collection(collection_out);
+ RecurrentChecks.assert_can_be_used_as
+ (
+ collection_in,
+ collection_out.get_type()
+ );
+
+ target_signature.add
+ (
+ ((CollectionType) collection_in.get_type()).get_content_type()
+ );
+
+ for (final Computation c: extra_params)
+ {
+ target_signature.add(c.get_type());
+ }
+
+ RecurrentChecks.assert_lambda_matches_types
+ (
+ lambda_function,
+ Type.BOOL,
+ target_signature
+ );
+
+ return
+ new Partition
+ (
+ origin,
+ lambda_function,
+ collection_in,
+ collection_out,
+ extra_params
+ );
+ }
+
+ /**** Accessors ************************************************************/
+ @Override
+ public void get_visited_by (final InstructionVisitor iv)
+ throws Throwable
+ {
+ iv.visit_partition(this);
+ }
+
+ public Computation get_lambda_function ()
+ {
+ return lambda_function;
+ }
+
+ public Computation get_collection_in ()
+ {
+ return collection_in;
+ }
+
+ public Computation get_collection_out ()
+ {
+ return collection_out;
+ }
+
+ public List<Computation> get_extra_parameters ()
+ {
+ return extra_params;
+ }
+
+ /**** Misc. ****************************************************************/
+ @Override
+ public String toString ()
+ {
+ final StringBuilder sb = new StringBuilder();
+
+ sb.append("(Partition ");
+ sb.append(lambda_function.toString());
+ sb.append(" ");
+ sb.append(collection_in.toString());
+ sb.append(" ");
+ sb.append(collection_out.toString());
+
+ for (final Computation c: extra_params)
+ {
+ sb.append(" ");
+ sb.append(c.toString());
+ }
+
+ sb.append(")");
+
+ return sb.toString();
+ }
+}
diff --git a/src/core/src/tonkadur/fate/v1/lang/instruction/generic/PopElement.java b/src/core/src/tonkadur/fate/v1/lang/instruction/generic/PopElement.java
new file mode 100644
index 0000000..2f16762
--- /dev/null
+++ b/src/core/src/tonkadur/fate/v1/lang/instruction/generic/PopElement.java
@@ -0,0 +1,166 @@
+package tonkadur.fate.v1.lang.instruction.generic;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+
+import tonkadur.parser.Origin;
+import tonkadur.parser.ParsingError;
+
+import tonkadur.fate.v1.lang.type.PointerType;
+import tonkadur.fate.v1.lang.type.CollectionType;
+
+import tonkadur.fate.v1.lang.meta.InstructionVisitor;
+import tonkadur.fate.v1.lang.meta.Instruction;
+import tonkadur.fate.v1.lang.meta.Computation;
+import tonkadur.fate.v1.lang.meta.Computation;
+import tonkadur.fate.v1.lang.meta.RecurrentChecks;
+
+public class PopElement extends GenericInstruction
+{
+ public static Collection<String> get_aliases ()
+ {
+ final List<String> aliases;
+
+ aliases = new ArrayList<String>();
+
+ aliases.add("list:popleft");
+ aliases.add("list:pop_left");
+ aliases.add("list:popLeft");
+ aliases.add("list:popleftelement");
+ aliases.add("list:pop_left_element");
+ aliases.add("list:popLeftElement");
+ aliases.add("list:popright");
+ aliases.add("list:pop_right");
+ aliases.add("list:popRight");
+ aliases.add("list:poprightelement");
+ aliases.add("list:pop_right_element");
+ aliases.add("list:popRightElement");
+ aliases.add("set:popleft");
+ aliases.add("set:pop_left");
+ aliases.add("set:popLeft");
+ aliases.add("set:popleftelement");
+ aliases.add("set:pop_left_element");
+ aliases.add("set:popLeftElement");
+ aliases.add("set:popright");
+ aliases.add("set:pop_right");
+ aliases.add("set:popRight");
+ aliases.add("set:poprightelement");
+ aliases.add("set:pop_right_element");
+ aliases.add("set:popRightElement");
+
+ return aliases;
+ }
+
+ public static Instruction build
+ (
+ final Origin origin,
+ final String _alias,
+ final List<Computation> call_parameters
+ )
+ throws Throwable
+ {
+ final Computation storage;
+ final Computation collection;
+ final boolean is_from_left;
+
+ if (call_parameters.size() != 2)
+ {
+ // TODO: Error.
+ System.err.println("Wrong number of params at " + origin.toString());
+
+ return null;
+ }
+
+ collection = call_parameters.get(0);
+ storage = call_parameters.get(1);
+
+ collection.expect_non_string();
+ storage.expect_non_string();
+
+ is_from_left = alias.contains("eft");
+
+ if (alias.startsWith("set:"))
+ {
+ RecurrentChecks.assert_is_a_set_of(collection, storage.get_type());
+ }
+ else
+ {
+ RecurrentChecks.assert_is_a_list_of(collection, storage.get_type());
+ }
+
+ collection.use_as_reference();
+ storage.use_as_reference();
+
+ return new PopElement(origin, storage, collection, is_from_left);
+ }
+
+ /***************************************************************************/
+ /**** MEMBERS **************************************************************/
+ /***************************************************************************/
+ protected final Computation storage_ptr;
+ protected final Computation collection;
+ protected final boolean is_from_left;
+
+ /***************************************************************************/
+ /**** PROTECTED ************************************************************/
+ /***************************************************************************/
+ /**** Constructors *********************************************************/
+ protected PopElement
+ (
+ final Origin origin,
+ final Computation collection,
+ final boolean is_from_left
+ )
+ {
+ super(origin);
+
+ this.storage_ptr = storage_ptr;
+ this.collection = collection;
+ this.is_from_left = is_from_left;
+ }
+
+ /***************************************************************************/
+ /**** PUBLIC ***************************************************************/
+ /***************************************************************************/
+
+ /**** Accessors ************************************************************/
+ public Computation get_collection ()
+ {
+ return collection;
+ }
+
+ public Computation get_storage ()
+ {
+ return storage;
+ }
+
+ public boolean is_from_left ()
+ {
+ return is_from_left;
+ }
+
+ /**** Misc. ****************************************************************/
+ @Override
+ public String toString ()
+ {
+ final StringBuilder sb = new StringBuilder();
+
+ if (is_from_left)
+ {
+ sb.append("(PopLeftElement ");
+ }
+ else
+ {
+ sb.append("(PopRightElement ");
+ }
+
+ sb.append(collection.toString());
+
+ sb.append(" ");
+ sb.append(storage.toString());
+ sb.append(")");
+
+ return sb.toString();
+ }
+}
diff --git a/src/core/src/tonkadur/fate/v1/lang/instruction/generic/PushElement.java b/src/core/src/tonkadur/fate/v1/lang/instruction/generic/PushElement.java
new file mode 100644
index 0000000..b4c5a29
--- /dev/null
+++ b/src/core/src/tonkadur/fate/v1/lang/instruction/generic/PushElement.java
@@ -0,0 +1,162 @@
+package tonkadur.fate.v1.lang.instruction.generic;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+
+import tonkadur.parser.Origin;
+import tonkadur.parser.ParsingError;
+
+import tonkadur.fate.v1.lang.meta.InstructionVisitor;
+import tonkadur.fate.v1.lang.meta.Instruction;
+import tonkadur.fate.v1.lang.meta.Computation;
+import tonkadur.fate.v1.lang.meta.RecurrentChecks;
+
+public class PushElement extends GenericInstruction
+{
+ public static Collection<String> get_aliases ()
+ {
+ final List<String> aliases;
+
+ aliases = new ArrayList<String>();
+
+ aliases.add("list:push_left");
+ aliases.add("list:pushleft");
+ aliases.add("list:pushLeft");
+ aliases.add("list:push_right");
+ aliases.add("list:pushright");
+ aliases.add("list:pushRight");
+ aliases.add("set:push_left");
+ aliases.add("set:pushleft");
+ aliases.add("set:pushLeft");
+ aliases.add("set:push_right");
+ aliases.add("set:pushright");
+ aliases.add("set:pushRight");
+
+ return aliases;
+ }
+
+ public static Instruction build
+ (
+ final Origin origin,
+ final String alias,
+ final List<Computation> call_parameters
+ )
+ throws Throwable
+ {
+ final Computation element;
+ final Computation collection;
+ final boolean is_from_left;
+
+ if (call_parameters.size() != 2)
+ {
+ // TODO: Error.
+ System.err.println("Wrong number of params at " + origin.toString());
+
+ return null;
+ }
+
+ collection = call_parameters.get(0);
+ element = call_parameters.get(1);
+ is_from_left = alias.endsWith("eft");
+
+ if (alias.startsWith("set:"))
+ {
+ RecurrentChecks.propagate_expected_types_and_assert_is_a_set_of
+ (
+ collection,
+ element
+ );
+ }
+ else
+ {
+ RecurrentChecks.propagate_expected_types_and_assert_is_a_list_of
+ (
+ collection,
+ element
+ );
+ }
+
+ collection.use_as_reference();
+
+ return new PushElement(origin, element, collection, is_from_left);
+ }
+
+ /***************************************************************************/
+ /**** MEMBERS **************************************************************/
+ /***************************************************************************/
+ protected final Computation element;
+ protected final Computation collection;
+ protected final boolean is_from_left;
+
+ /***************************************************************************/
+ /**** PROTECTED ************************************************************/
+ /***************************************************************************/
+ /**** Constructors *********************************************************/
+ protected PushElement
+ (
+ final Origin origin,
+ final Computation element,
+ final Computation collection,
+ final boolean is_from_left
+ )
+ {
+ super(origin);
+
+ this.collection = collection;
+ this.element = element;
+ this.is_from_left = is_from_left;
+ }
+
+ /***************************************************************************/
+ /**** PUBLIC ***************************************************************/
+ /***************************************************************************/
+ /**** Accessors ************************************************************/
+ public Computation get_collection ()
+ {
+ return collection;
+ }
+
+ public Computation get_element ()
+ {
+ return element;
+ }
+
+ public boolean is_from_left ()
+ {
+ return is_from_left;
+ }
+
+ /**** Misc. ****************************************************************/
+ @Override
+ public String toString ()
+ {
+ final StringBuilder sb = new StringBuilder();
+
+ 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(")");
+
+ return sb.toString();
+ }
+}
diff --git a/src/core/src/tonkadur/fate/v1/lang/instruction/generic/RemoveAllOfElement.java b/src/core/src/tonkadur/fate/v1/lang/instruction/generic/RemoveAllOfElement.java
new file mode 100644
index 0000000..79d5bc1
--- /dev/null
+++ b/src/core/src/tonkadur/fate/v1/lang/instruction/generic/RemoveAllOfElement.java
@@ -0,0 +1,144 @@
+package tonkadur.fate.v1.lang.instruction.generic;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+
+import tonkadur.parser.Origin;
+import tonkadur.parser.ParsingError;
+
+import tonkadur.fate.v1.lang.meta.InstructionVisitor;
+import tonkadur.fate.v1.lang.meta.Instruction;
+import tonkadur.fate.v1.lang.meta.Computation;
+import tonkadur.fate.v1.lang.meta.RecurrentChecks;
+
+public class RemoveAllOfElement extends GenericInstruction
+{
+ public static Collection<String> get_aliases ()
+ {
+ final List<String> aliases;
+
+ aliases = new ArrayList<String>();
+
+ aliases.add("list:remove_each");
+ aliases.add("list:removeeach");
+ aliases.add("list:removeEach");
+ aliases.add("list:remove_every");
+ aliases.add("list:removeevery");
+ aliases.add("list:removeEvery");
+ aliases.add("set:remove_each");
+ aliases.add("set:removeeach");
+ aliases.add("set:removeEach");
+ aliases.add("set:remove_every");
+ aliases.add("set:removeevery");
+ aliases.add("set:removeEvery");
+
+ return aliases;
+ }
+
+ public static Instruction build
+ (
+ final Origin origin,
+ final String alias,
+ final List<Computation> call_parameters
+ )
+ throws Throwable
+ {
+ final Computation element;
+ final Computation collection;
+
+ if (call_parameters.size() != 2)
+ {
+ // TODO: Error.
+ System.err.println("Wrong number of params at " + origin.toString());
+
+ return null;
+ }
+
+ element = call_parameters.get(0);
+ collection = call_parameters.get(1);
+
+ if (alias.startsWith("set:"))
+ {
+ RecurrentChecks.propagate_expected_types_and_assert_is_a_set_of
+ (
+ collection,
+ element
+ );
+ }
+ else
+ {
+ RecurrentChecks.propagate_expected_types_and_assert_is_a_list_of
+ (
+ collection,
+ element
+ );
+ }
+
+ collection.use_as_reference();
+
+ return new RemoveAllOfElement(origin, element, collection);
+ }
+
+ /***************************************************************************/
+ /**** MEMBERS **************************************************************/
+ /***************************************************************************/
+ protected final Computation element;
+ protected final Computation collection;
+
+ /***************************************************************************/
+ /**** PROTECTED ************************************************************/
+ /***************************************************************************/
+ /**** Constructors *********************************************************/
+ protected RemoveAllOfElement
+ (
+ final Origin origin,
+ final Computation element,
+ final Computation collection
+ )
+ {
+ super(origin);
+
+ this.collection = collection;
+ this.element = element;
+ }
+
+ /***************************************************************************/
+ /**** PUBLIC ***************************************************************/
+ /***************************************************************************/
+ /**** Accessors ************************************************************/
+ public Computation get_element ()
+ {
+ return element;
+ }
+
+ public Computation get_collection ()
+ {
+ return collection;
+ }
+
+ /**** Misc. ****************************************************************/
+ @Override
+ public String toString ()
+ {
+ final StringBuilder sb = new StringBuilder();
+
+ 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(")");
+
+ return sb.toString();
+ }
+}
diff --git a/src/core/src/tonkadur/fate/v1/lang/instruction/generic/RemoveElement.java b/src/core/src/tonkadur/fate/v1/lang/instruction/generic/RemoveElement.java
new file mode 100644
index 0000000..667b489
--- /dev/null
+++ b/src/core/src/tonkadur/fate/v1/lang/instruction/generic/RemoveElement.java
@@ -0,0 +1,145 @@
+package tonkadur.fate.v1.lang.instruction.generic;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+
+import tonkadur.parser.Origin;
+import tonkadur.parser.ParsingError;
+
+import tonkadur.fate.v1.lang.meta.InstructionVisitor;
+import tonkadur.fate.v1.lang.meta.Instruction;
+import tonkadur.fate.v1.lang.meta.Computation;
+import tonkadur.fate.v1.lang.meta.RecurrentChecks;
+
+public class RemoveElement extends GenericInstruction
+{
+ public static Collection<String> get_aliases ()
+ {
+ final List<String> aliases;
+
+ aliases = new ArrayList<String>();
+
+ aliases.add("list:remove");
+ aliases.add("list:remove_one");
+ aliases.add("list:remove_once");
+ aliases.add("list:removeone");
+ aliases.add("list:removeonce");
+ aliases.add("list:removeOne");
+ aliases.add("list:removeOnce");
+ aliases.add("set:remove");
+ aliases.add("set:remove_one");
+ aliases.add("set:remove_once");
+ aliases.add("set:removeone");
+ aliases.add("set:removeonce");
+ aliases.add("set:removeOne");
+ aliases.add("set:removeOnce");
+
+ return aliases;
+ }
+
+ public static Instruction build
+ (
+ final Origin origin,
+ final String alias,
+ final List<Computation> call_parameters
+ )
+ throws Throwable
+ {
+ final Computation element;
+ final Computation collection;
+
+ if (call_parameters.size() != 1)
+ {
+ // TODO: Error.
+ System.err.println("Wrong number of params at " + origin.toString());
+
+ return null;
+ }
+
+ element = call_parameters.get(0);
+ collection = call_parameters.get(1);
+
+ if (alias.startsWith("set:"))
+ {
+ RecurrentChecks.propagate_expected_types_and_assert_is_a_set_of
+ (
+ collection,
+ element
+ );
+ }
+ else
+ {
+ RecurrentChecks.propagate_expected_types_and_assert_is_a_list_of
+ (
+ collection,
+ element
+ );
+ }
+
+ collection.use_as_reference();
+
+ return new RemoveElement(origin, element, collection);
+ }
+ /***************************************************************************/
+ /**** MEMBERS **************************************************************/
+ /***************************************************************************/
+ protected final Computation element;
+ protected final Computation collection;
+
+ /***************************************************************************/
+ /**** PROTECTED ************************************************************/
+ /***************************************************************************/
+ /**** Constructors *********************************************************/
+ protected RemoveElement
+ (
+ final Origin origin,
+ final Computation element,
+ final Computation collection
+ )
+ {
+ super(origin);
+
+ this.collection = collection;
+ this.element = element;
+ }
+
+ /***************************************************************************/
+ /**** PUBLIC ***************************************************************/
+ /***************************************************************************/
+ /**** Accessors ************************************************************/
+ public Computation get_element ()
+ {
+ return element;
+ }
+
+ public Computation get_collection ()
+ {
+ return collection;
+ }
+
+ /**** Misc. ****************************************************************/
+ @Override
+ public String toString ()
+ {
+ final StringBuilder sb = new StringBuilder();
+
+ 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(")");
+
+ return sb.toString();
+ }
+}
diff --git a/src/core/src/tonkadur/fate/v1/lang/instruction/generic/RemoveElementAt.java b/src/core/src/tonkadur/fate/v1/lang/instruction/generic/RemoveElementAt.java
new file mode 100644
index 0000000..a7e83e1
--- /dev/null
+++ b/src/core/src/tonkadur/fate/v1/lang/instruction/generic/RemoveElementAt.java
@@ -0,0 +1,137 @@
+package tonkadur.fate.v1.lang.instruction.generic;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+
+import tonkadur.parser.Origin;
+import tonkadur.parser.ParsingError;
+
+import tonkadur.fate.v1.lang.type.Type;
+
+import tonkadur.fate.v1.lang.meta.InstructionVisitor;
+import tonkadur.fate.v1.lang.meta.Instruction;
+import tonkadur.fate.v1.lang.meta.Computation;
+import tonkadur.fate.v1.lang.meta.RecurrentChecks;
+
+public class RemoveElementAt extends GenericInstruction
+{
+ public static Collection<String> get_aliases ()
+ {
+ final List<String> aliases;
+
+ aliases = new ArrayList<String>();
+
+ aliases.add("list:remove_at");
+ aliases.add("list:removeat");
+ aliases.add("list:removeAt");
+ aliases.add("set:remove_at");
+ aliases.add("set:removeat");
+ aliases.add("set:removeAt");
+
+ return aliases;
+ }
+
+ public static Instruction build
+ (
+ final Origin origin,
+ final String alias,
+ final List<Computation> call_parameters
+ )
+ throws Throwable
+ {
+ final Computation index;
+ final Computation collection;
+
+ if (call_parameters.size() != 2)
+ {
+ // TODO: Error.
+ System.err.println("Wrong number of params at " + origin.toString());
+
+ return null;
+ }
+
+ index = call_parameters.get(0);
+ collection = call_parameters.get(1);
+
+ index.expect_non_string();
+ collection.expect_non_string();
+
+ if (alias.startsWith("set:"))
+ {
+ RecurrentChecks.assert_is_a_set(collection);
+ }
+ else
+ {
+ RecurrentChecks.assert_is_a_list(collection);
+ }
+
+ RecurrentChecks.assert_can_be_used_as(index, Type.INT);
+
+ collection.use_as_reference();
+
+ return new RemoveElementAt(origin, index, collection);
+ }
+
+ /***************************************************************************/
+ /**** MEMBERS **************************************************************/
+ /***************************************************************************/
+ protected final Computation index;
+ protected final Computation collection;
+
+ /***************************************************************************/
+ /**** PROTECTED ************************************************************/
+ /***************************************************************************/
+ /**** Constructors *********************************************************/
+ protected RemoveElementAt
+ (
+ final Origin origin,
+ final Computation index,
+ final Computation collection
+ )
+ {
+ super(origin);
+
+ this.collection = collection;
+ this.index = index;
+ }
+
+ /***************************************************************************/
+ /**** PUBLIC ***************************************************************/
+ /***************************************************************************/
+ /**** Accessors ************************************************************/
+ public Computation get_index ()
+ {
+ return index;
+ }
+
+ public Computation get_collection ()
+ {
+ return collection;
+ }
+
+ /**** Misc. ****************************************************************/
+ @Override
+ public String toString ()
+ {
+ final StringBuilder sb = new StringBuilder();
+
+ 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(")");
+
+ return sb.toString();
+ }
+}
diff --git a/src/core/src/tonkadur/fate/v1/lang/instruction/generic/RemoveElementsOf.java b/src/core/src/tonkadur/fate/v1/lang/instruction/generic/RemoveElementsOf.java
new file mode 100644
index 0000000..e37601d
--- /dev/null
+++ b/src/core/src/tonkadur/fate/v1/lang/instruction/generic/RemoveElementsOf.java
@@ -0,0 +1,150 @@
+package tonkadur.fate.v1.lang.instruction.generic;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+
+import tonkadur.parser.Origin;
+import tonkadur.parser.ParsingError;
+
+import tonkadur.fate.v1.lang.type.CollectionType;
+
+import tonkadur.fate.v1.lang.meta.InstructionVisitor;
+import tonkadur.fate.v1.lang.meta.Instruction;
+import tonkadur.fate.v1.lang.meta.Computation;
+import tonkadur.fate.v1.lang.meta.RecurrentChecks;
+
+public class RemoveElementsOf extends GenericInstruction
+{
+ public static Collection<String> get_aliases ()
+ {
+ final List<String> aliases;
+
+ aliases = new ArrayList<String>();
+
+ aliases.add("list:remove_all");
+ aliases.add("list:removeall");
+ aliases.add("list:removeAll");
+ aliases.add("set:remove_all");
+ aliases.add("set:removeall");
+ aliases.add("set:removeAll");
+
+ return aliases;
+ }
+
+ public static Instruction build
+ (
+ final Origin origin,
+ final String alias,
+ final List<Computation> call_parameters
+ )
+ throws Throwable
+ {
+ final Computation other_collection;
+ final Computation collection;
+
+ if (call_parameters.size() != 2)
+ {
+ // TODO: Error.
+ System.err.print
+ (
+ "[E] Wrong number of arguments at "
+ + origin.toString()
+ );
+
+ return null;
+ }
+
+
+ other_collection = call_parameters.get(0);
+ collection = call_parameters.get(1);
+
+ other_collection.expect_non_string();
+ collection.expect_non_string();
+
+ RecurrentChecks.assert_is_a_collection(other_collection);
+
+ if (alias.startsWith("set:"))
+ {
+ RecurrentChecks.assert_is_a_set(collection);
+ }
+ else
+ {
+ RecurrentChecks.assert_is_a_list(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()
+ );
+
+ collection.use_as_reference();
+
+ return new RemoveElementsOf(origin, other_collection, collection);
+ }
+
+ /***************************************************************************/
+ /**** MEMBERS **************************************************************/
+ /***************************************************************************/
+ protected final Computation other_collection;
+ protected final Computation collection;
+
+ /***************************************************************************/
+ /**** PROTECTED ************************************************************/
+ /***************************************************************************/
+ /**** Constructors *********************************************************/
+ protected RemoveElementsOf
+ (
+ final Origin origin,
+ final Computation other_collection,
+ final Computation collection
+ )
+ {
+ super(origin);
+
+ this.collection = collection;
+ this.other_collection = other_collection;
+ }
+
+ /***************************************************************************/
+ /**** PUBLIC ***************************************************************/
+ /***************************************************************************/
+ /**** Accessors ************************************************************/
+
+ public Computation get_source_collection ()
+ {
+ return other_collection;
+ }
+
+ public Computation get_target_collection ()
+ {
+ return collection;
+ }
+
+ /**** Misc. ****************************************************************/
+ @Override
+ public String toString ()
+ {
+ final StringBuilder sb = new StringBuilder();
+
+ sb.append("(RemoveElementsOf");
+ 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(")");
+
+ return sb.toString();
+ }
+}
diff --git a/src/core/src/tonkadur/fate/v1/lang/instruction/generic/ReverseList.java b/src/core/src/tonkadur/fate/v1/lang/instruction/generic/ReverseList.java
new file mode 100644
index 0000000..3281c5e
--- /dev/null
+++ b/src/core/src/tonkadur/fate/v1/lang/instruction/generic/ReverseList.java
@@ -0,0 +1,111 @@
+package tonkadur.fate.v1.lang.instruction.generic;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+
+import tonkadur.parser.Origin;
+import tonkadur.parser.ParsingError;
+
+import tonkadur.fate.v1.lang.meta.InstructionVisitor;
+import tonkadur.fate.v1.lang.meta.Instruction;
+import tonkadur.fate.v1.lang.meta.Computation;
+import tonkadur.fate.v1.lang.meta.RecurrentChecks;
+
+public class ReverseList extends GenericInstruction
+{
+ public static Collection<String> get_aliases ()
+ {
+ final List<String> aliases;
+
+ aliases = new ArrayList<String>();
+
+ aliases.add("list:reverse");
+ aliases.add("set:reverse");
+
+ return aliases;
+ }
+
+ public static Instruction build
+ (
+ final Origin origin,
+ final String alias,
+ final List<Computation> call_parameters
+ )
+ throws Throwable
+ {
+ final Computation collection;
+
+ if (call_parameters.size() != 1)
+ {
+ // TODO: Error.
+ System.err.print
+ (
+ "[E] Wrong number of arguments at "
+ + origin.toString()
+ );
+
+ return null;
+ }
+
+ collection = call_parameters.get(0);
+
+ collection.expect_non_string();
+
+ if (alias.startsWith("set:"))
+ {
+ RecurrentChecks.assert_is_a_set(collection);
+ }
+ else
+ {
+ RecurrentChecks.assert_is_a_list(collection);
+ }
+
+ collection.use_as_reference();
+
+ return new ReverseList(origin, collection);
+ }
+
+ /***************************************************************************/
+ /**** MEMBERS **************************************************************/
+ /***************************************************************************/
+ protected final Computation collection;
+
+ /***************************************************************************/
+ /**** PROTECTED ************************************************************/
+ /***************************************************************************/
+ /**** Constructors *********************************************************/
+ protected ReverseList
+ (
+ final Origin origin,
+ final Computation collection
+ )
+ {
+ super(origin);
+
+ this.collection = collection;
+ }
+
+ /***************************************************************************/
+ /**** PUBLIC ***************************************************************/
+ /***************************************************************************/
+ /**** Accessors ************************************************************/
+ public Computation get_collection ()
+ {
+ return collection;
+ }
+
+ /**** Misc. ****************************************************************/
+ @Override
+ public String toString ()
+ {
+ final StringBuilder sb = new StringBuilder();
+
+ sb.append("(ReverseList ");
+ sb.append(collection.toString());
+
+ sb.append(")");
+
+ return sb.toString();
+ }
+}
diff --git a/src/core/src/tonkadur/fate/v1/lang/instruction/SequenceVariableCall.java b/src/core/src/tonkadur/fate/v1/lang/instruction/generic/SequenceVariableCall.java
index 7fb0d1c..f09dcdd 100644
--- a/src/core/src/tonkadur/fate/v1/lang/instruction/SequenceVariableCall.java
+++ b/src/core/src/tonkadur/fate/v1/lang/instruction/generic/SequenceVariableCall.java
@@ -1,5 +1,7 @@
-package tonkadur.fate.v1.lang.instruction;
+package tonkadur.fate.v1.lang.instruction.generic;
+import java.util.ArrayList;
+import java.util.Collection;
import java.util.Collections;
import java.util.List;
@@ -18,43 +20,60 @@ import tonkadur.fate.v1.lang.meta.InstructionVisitor;
import tonkadur.fate.v1.lang.meta.Instruction;
import tonkadur.fate.v1.lang.meta.RecurrentChecks;
-public class SequenceVariableCall extends Instruction
+public class SequenceVariableCall extends GenericInstruction
{
- /***************************************************************************/
- /**** MEMBERS **************************************************************/
- /***************************************************************************/
- protected final List<Computation> parameters;
- protected final Computation sequence;
-
- /***************************************************************************/
- /**** PROTECTED ************************************************************/
- /***************************************************************************/
- /**** Constructors *********************************************************/
- protected SequenceVariableCall
- (
- final Origin origin,
- final Computation sequence,
- final List<Computation> parameters
- )
+ public static Collection<String> get_aliases ()
{
- super(origin);
-
- this.sequence = sequence;
- this.parameters = parameters;
+ // ISSUE: how can the parser distinguish these from (call! <STRING>)
+ final List<String> aliases;
+
+ aliases = new ArrayList<String>();
+
+ aliases.add("call");
+ aliases.add("call_sequence");
+ aliases.add("call_procedure");
+ aliases.add("call_seq");
+ aliases.add("call_proc");
+ aliases.add("callsequence");
+ aliases.add("callprocedure");
+ aliases.add("callseq");
+ aliases.add("callproc");
+ aliases.add("callSequence");
+ aliases.add("callProcedure");
+ aliases.add("callSeq");
+ aliases.add("callProc");
+ aliases.add("visit");
+ aliases.add("visit_sequence");
+ aliases.add("visit_procedure");
+ aliases.add("visit_seq");
+ aliases.add("visit_proc");
+ aliases.add("visitsequence");
+ aliases.add("visitprocedure");
+ aliases.add("visitseq");
+ aliases.add("visitproc");
+ aliases.add("visitSequence");
+ aliases.add("visitProcedure");
+ aliases.add("visitSeq");
+ aliases.add("visitProc");
+
+ return aliases;
}
- /***************************************************************************/
- /**** PUBLIC ***************************************************************/
- /***************************************************************************/
- /**** Constructors *********************************************************/
- public static SequenceVariableCall build
+ public static Instruction build
(
final Origin origin,
- final Computation sequence,
- final List<Computation> parameters
+ final String _alias,
+ final List<Computation> call_parameters
)
- throws ParsingError
+ throws Throwable
{
+ // TODO: implement
+ // Quite a troublesome one, since we need to handle:
+ // * If first argument is a string, this is a reference to a sequence.
+ // * In that case, the expected type of each other parameter is to be
+ // determined in the future.
+ final Computation sequence = null;
+ final List<Computation> parameters = null;
final List<Type> signature;
sequence.expect_non_string();
@@ -89,14 +108,33 @@ public class SequenceVariableCall extends Instruction
return new SequenceVariableCall(origin, sequence, parameters);
}
- /**** Accessors ************************************************************/
- @Override
- public void get_visited_by (final InstructionVisitor iv)
- throws Throwable
+ /***************************************************************************/
+ /**** MEMBERS **************************************************************/
+ /***************************************************************************/
+ protected final List<Computation> parameters;
+ protected final Computation sequence;
+
+ /***************************************************************************/
+ /**** PROTECTED ************************************************************/
+ /***************************************************************************/
+ /**** Constructors *********************************************************/
+ protected SequenceVariableCall
+ (
+ final Origin origin,
+ final Computation sequence,
+ final List<Computation> parameters
+ )
{
- iv.visit_sequence_variable_call(this);
+ super(origin);
+
+ this.sequence = sequence;
+ this.parameters = parameters;
}
+ /***************************************************************************/
+ /**** PUBLIC ***************************************************************/
+ /***************************************************************************/
+ /**** Accessors ************************************************************/
public Computation get_sequence ()
{
return sequence;
diff --git a/src/core/src/tonkadur/fate/v1/lang/instruction/generic/SequenceVariableJump.java b/src/core/src/tonkadur/fate/v1/lang/instruction/generic/SequenceVariableJump.java
new file mode 100644
index 0000000..87365c4
--- /dev/null
+++ b/src/core/src/tonkadur/fate/v1/lang/instruction/generic/SequenceVariableJump.java
@@ -0,0 +1,219 @@
+package tonkadur.fate.v1.lang.instruction.generic;
+
+import java.util.ArrayList;
+import java.util.Collection;
+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.InvalidTypeException;
+
+import tonkadur.fate.v1.lang.type.SequenceType;
+import tonkadur.fate.v1.lang.type.Type;
+
+import tonkadur.fate.v1.lang.meta.Computation;
+import tonkadur.fate.v1.lang.meta.InstructionVisitor;
+import tonkadur.fate.v1.lang.meta.Instruction;
+import tonkadur.fate.v1.lang.meta.RecurrentChecks;
+
+public class SequenceVariableJump extends GenericInstruction
+{
+ public static Collection<String> get_aliases ()
+ {
+ final List<String> aliases;
+
+ aliases = new ArrayList<String>();
+
+ aliases.add("jump");
+ aliases.add("jump_to");
+ aliases.add("jump_to_sequence");
+ aliases.add("jump_to_procedure");
+ aliases.add("jump_to_seq");
+ aliases.add("jump_to_proc");
+ aliases.add("continue_as");
+ aliases.add("continue_as_sequence");
+ aliases.add("continue_as_procedure");
+ aliases.add("continue_as_seq");
+ aliases.add("continue_as_proc");
+ aliases.add("continue_to");
+ aliases.add("continue_to_sequence");
+ aliases.add("continue_to_procedure");
+ aliases.add("continue_to_seq");
+ aliases.add("continue_to_proc");
+ aliases.add("continue_with");
+ aliases.add("continue_with_sequence");
+ aliases.add("continue_with_procedure");
+ aliases.add("continue_with_seq");
+ aliases.add("continue_with_proc");
+ aliases.add("go_to");
+ aliases.add("go_to_sequence");
+ aliases.add("go_to_procedure");
+ aliases.add("go_to_seq");
+ aliases.add("go_to_proc");
+
+ aliases.add("jumpto");
+ aliases.add("jumptosequence");
+ aliases.add("jumptoprocedure");
+ aliases.add("jumptoseq");
+ aliases.add("jumptoproc");
+ aliases.add("continueas");
+ aliases.add("continueassequence");
+ aliases.add("continueasprocedure");
+ aliases.add("continueasseq");
+ aliases.add("continueasproc");
+ aliases.add("continueto");
+ aliases.add("continuetosequence");
+ aliases.add("continuetoprocedure");
+ aliases.add("continuetoseq");
+ aliases.add("continuetoproc");
+ aliases.add("continuewith");
+ aliases.add("continuewithsequence");
+ aliases.add("continuewithprocedure");
+ aliases.add("continuewithseq");
+ aliases.add("continuewithproc");
+ aliases.add("goto");
+ aliases.add("gotosequence");
+ aliases.add("gotoprocedure");
+ aliases.add("gotoseq");
+ aliases.add("gotoproc");
+
+ aliases.add("jumpTo");
+ aliases.add("jumpToSequence");
+ aliases.add("jumpToProcedure");
+ aliases.add("jumpToSeq");
+ aliases.add("jumpToProc");
+ aliases.add("continueAs");
+ aliases.add("continueAsSequence");
+ aliases.add("continueAsProcedure");
+ aliases.add("continueAsSeq");
+ aliases.add("continueAsProc");
+ aliases.add("continueTo");
+ aliases.add("continueToSequence");
+ aliases.add("continueToProcedure");
+ aliases.add("continueToSeq");
+ aliases.add("continueToProc");
+ aliases.add("continueWith");
+ aliases.add("continueWithSequence");
+ aliases.add("continueWithProcedure");
+ aliases.add("continueWithSeq");
+ aliases.add("continueWithProc");
+ aliases.add("goTo");
+ aliases.add("goToSequence");
+ aliases.add("goToProcedure");
+ aliases.add("goToSeq");
+ aliases.add("goToProc");
+
+ return aliases;
+ }
+
+ public static Instruction build
+ (
+ final Origin origin,
+ final String _alias,
+ final List<Computation> call_parameters
+ )
+ throws Throwable
+ {
+ // TODO: implement
+ // Quite a troublesome one, since we need to handle:
+ // * If first argument is a string, this is a reference to a sequence.
+ // * In that case, the expected type of each other parameter is to be
+ // determined in the future.
+ final Computation sequence = null;
+ final List<Computation> parameters = null;
+
+ final List<Type> signature;
+
+ sequence.expect_non_string();
+
+ // TODO: change this system, since we'd rather use the signature to tell
+ // the parameters what to expect.
+ ((SequenceType) sequence.get_type()).propose_signature_from_parameters
+ (
+ parameters
+ );
+
+ if (!sequence.get_type().get_act_as_type().equals(SequenceType.ARCHETYPE))
+ {
+ ErrorManager.handle
+ (
+ new InvalidTypeException
+ (
+ origin,
+ sequence.get_type(),
+ Collections.singleton(SequenceType.ARCHETYPE)
+ )
+ );
+ }
+
+ RecurrentChecks.propagate_expected_types_and_assert_computations_matches_signature
+ (
+ origin,
+ parameters,
+ ((SequenceType) sequence.get_type()).get_signature()
+ );
+
+ return new SequenceVariableJump(origin, sequence, parameters);
+ }
+
+ /***************************************************************************/
+ /**** MEMBERS **************************************************************/
+ /***************************************************************************/
+ protected final List<Computation> parameters;
+ protected final Computation sequence;
+
+ /***************************************************************************/
+ /**** PROTECTED ************************************************************/
+ /***************************************************************************/
+ /**** Constructors *********************************************************/
+ protected SequenceVariableJump
+ (
+ final Origin origin,
+ final Computation sequence,
+ final List<Computation> parameters
+ )
+ {
+ super(origin);
+
+ this.sequence = sequence;
+ this.parameters = parameters;
+ }
+
+ /***************************************************************************/
+ /**** PUBLIC ***************************************************************/
+ /***************************************************************************/
+ /**** Accessors ************************************************************/
+ public Computation get_sequence ()
+ {
+ return sequence;
+ }
+
+ public List<Computation> get_parameters ()
+ {
+ return parameters;
+ }
+
+ /**** Misc. ****************************************************************/
+ @Override
+ public String toString ()
+ {
+ final StringBuilder sb = new StringBuilder();
+
+ sb.append("(SequenceVariableJump ");
+ sb.append(sequence);
+
+ for (final Computation c: parameters)
+ {
+ sb.append(" ");
+ sb.append(c.toString());
+ }
+
+ sb.append(")");
+
+ return sb.toString();
+ }
+}
diff --git a/src/core/src/tonkadur/fate/v1/lang/instruction/SetValue.java b/src/core/src/tonkadur/fate/v1/lang/instruction/generic/SetValue.java
index d077c26..324694d 100644
--- a/src/core/src/tonkadur/fate/v1/lang/instruction/SetValue.java
+++ b/src/core/src/tonkadur/fate/v1/lang/instruction/generic/SetValue.java
@@ -1,16 +1,62 @@
-package tonkadur.fate.v1.lang.instruction;
+package tonkadur.fate.v1.lang.instruction.generic;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
import tonkadur.parser.Origin;
import tonkadur.parser.ParsingError;
-
import tonkadur.fate.v1.lang.meta.InstructionVisitor;
import tonkadur.fate.v1.lang.meta.Instruction;
import tonkadur.fate.v1.lang.meta.Computation;
import tonkadur.fate.v1.lang.meta.RecurrentChecks;
-public class SetValue extends Instruction
+public class SetValue extends GenericInstruction
{
+ public static Collection<String> get_aliases ()
+ {
+ final List<String> aliases;
+
+ aliases = new ArrayList<String>();
+
+ aliases.add("set");
+ aliases.add("set_value");
+ aliases.add("set_value_of");
+ aliases.add("setvalue");
+ aliases.add("setvalueof");
+ aliases.add("setValue");
+ aliases.add("setValueOf");
+
+ return aliases;
+ }
+
+ public static Instruction build
+ (
+ final Origin origin,
+ final String alias,
+ final List<Computation> call_parameters
+ )
+ throws Throwable
+ {
+ final Computation reference;
+ final Computation value;
+
+ reference.expect_non_string();
+
+ RecurrentChecks.propagate_expected_type
+ (
+ value,
+ reference.get_type()
+ );
+
+ RecurrentChecks.assert_can_be_used_as(value, reference);
+
+ reference.use_as_reference();
+
+ return new SetValue(origin, value, reference);
+ }
+
/***************************************************************************/
/**** MEMBERS **************************************************************/
/***************************************************************************/
@@ -37,30 +83,7 @@ public class SetValue extends Instruction
/***************************************************************************/
/**** PUBLIC ***************************************************************/
/***************************************************************************/
- /**** Constructors *********************************************************/
- public static SetValue build
- (
- final Origin origin,
- final Computation element,
- final Computation value_reference
- )
- throws ParsingError
- {
- value_reference.expect_non_string();
-
- RecurrentChecks.assert_can_be_used_as(element, value_reference);
-
- return new SetValue(origin, element, value_reference);
- }
-
/**** Accessors ************************************************************/
- @Override
- public void get_visited_by (final InstructionVisitor iv)
- throws Throwable
- {
- iv.visit_set_value(this);
- }
-
public Computation get_value ()
{
return element;
diff --git a/src/core/src/tonkadur/fate/v1/lang/instruction/generic/Shuffle.java b/src/core/src/tonkadur/fate/v1/lang/instruction/generic/Shuffle.java
new file mode 100644
index 0000000..ca9e5d7
--- /dev/null
+++ b/src/core/src/tonkadur/fate/v1/lang/instruction/generic/Shuffle.java
@@ -0,0 +1,111 @@
+package tonkadur.fate.v1.lang.instruction.generic;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+
+import tonkadur.parser.Origin;
+import tonkadur.parser.ParsingError;
+
+import tonkadur.fate.v1.lang.meta.InstructionVisitor;
+import tonkadur.fate.v1.lang.meta.Instruction;
+import tonkadur.fate.v1.lang.meta.Computation;
+import tonkadur.fate.v1.lang.meta.RecurrentChecks;
+
+public class Shuffle extends GenericInstruction
+{
+ public static Collection<String> get_aliases ()
+ {
+ final List<String> aliases;
+
+ aliases = new ArrayList<String>();
+
+ aliases.add("list:shuffle");
+ aliases.add("set:shuffle");
+
+ return aliases;
+ }
+
+ public static Instruction build
+ (
+ final Origin origin,
+ final String alias,
+ final List<Computation> call_parameters
+ )
+ throws Throwable
+ {
+ final Computation collection;
+
+ if (call_parameters.size() != 1)
+ {
+ // TODO: Error.
+ System.err.print
+ (
+ "[E] Wrong number of arguments at "
+ + origin.toString()
+ );
+
+ return null;
+ }
+
+ collection = call_parameters.get(0);
+
+ collection.expect_non_string();
+
+ if (alias.startsWith("set:"))
+ {
+ RecurrentChecks.assert_is_a_set(collection);
+ }
+ else
+ {
+ RecurrentChecks.assert_is_a_list(collection);
+ }
+
+ collection.use_as_reference();
+
+ return new Shuffle(origin, collection);
+ }
+
+ /***************************************************************************/
+ /**** MEMBERS **************************************************************/
+ /***************************************************************************/
+ protected final Computation collection;
+
+ /***************************************************************************/
+ /**** PROTECTED ************************************************************/
+ /***************************************************************************/
+ /**** Constructors *********************************************************/
+ protected Shuffle
+ (
+ final Origin origin,
+ final Computation collection
+ )
+ {
+ super(origin);
+
+ this.collection = collection;
+ }
+
+ /***************************************************************************/
+ /**** PUBLIC ***************************************************************/
+ /***************************************************************************/
+ /**** Accessors ************************************************************/
+ public Computation get_collection ()
+ {
+ return collection;
+ }
+
+ /**** Misc. ****************************************************************/
+ @Override
+ public String toString ()
+ {
+ final StringBuilder sb = new StringBuilder();
+
+ sb.append("(Shuffle ");
+ sb.append(collection.toString());
+
+ sb.append(")");
+
+ return sb.toString();
+ }
+}
diff --git a/src/core/src/tonkadur/fate/v1/lang/instruction/generic/Sort.java b/src/core/src/tonkadur/fate/v1/lang/instruction/generic/Sort.java
new file mode 100644
index 0000000..df3cc1e
--- /dev/null
+++ b/src/core/src/tonkadur/fate/v1/lang/instruction/generic/Sort.java
@@ -0,0 +1,138 @@
+package tonkadur.fate.v1.lang.instruction.generic;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import tonkadur.parser.Origin;
+import tonkadur.parser.ParsingError;
+
+import tonkadur.fate.v1.lang.type.Type;
+import tonkadur.fate.v1.lang.type.CollectionType;
+
+import tonkadur.fate.v1.lang.meta.Computation;
+import tonkadur.fate.v1.lang.meta.Instruction;
+import tonkadur.fate.v1.lang.meta.InstructionVisitor;
+import tonkadur.fate.v1.lang.meta.RecurrentChecks;
+
+public class Sort extends GenericInstruction
+{
+ public static Collection<String> get_aliases ()
+ {
+ final List<String> aliases;
+
+ aliases = new ArrayList<String>();
+
+ aliases.add("list:sort");
+
+ return aliases;
+ }
+
+ public static Instruction build
+ (
+ final Origin origin,
+ final String _alias,
+ final List<Computation> call_parameters
+ )
+ throws Throwable
+ {
+ // TODO: implement
+ final Computation lambda_function = null;
+ final Computation collection = null;
+ final List<Computation> extra_params = nulls;
+ final List<Type> types_in;
+
+ types_in = new ArrayList<Type>();
+
+ RecurrentChecks.assert_is_a_list(collection);
+
+ types_in.add(((CollectionType) collection.get_type()).get_content_type());
+ types_in.add(types_in.get(0));
+
+ for (final Computation c: extra_params)
+ {
+ types_in.add(c.get_type());
+ }
+
+ RecurrentChecks.assert_lambda_matches_types
+ (
+ lambda_function,
+ Type.INT,
+ types_in
+ );
+
+ collection.use_as_reference();
+
+ return new Sort(origin, lambda_function, collection, extra_params);
+ }
+
+ /***************************************************************************/
+ /**** MEMBERS **************************************************************/
+ /***************************************************************************/
+ protected final List<Computation> extra_params;
+ protected final Computation lambda_function;
+ protected final Computation collection;
+
+ /***************************************************************************/
+ /**** PROTECTED ************************************************************/
+ /***************************************************************************/
+ /**** Constructors *********************************************************/
+ protected Sort
+ (
+ final Origin origin,
+ final Computation lambda_function,
+ final Computation collection,
+ final List<Computation> extra_params
+ )
+ {
+ super(origin);
+
+ this.lambda_function = lambda_function;
+ this.collection = collection;
+ this.extra_params = extra_params;
+ }
+
+ /***************************************************************************/
+ /**** PUBLIC ***************************************************************/
+ /***************************************************************************/
+ /**** Accessors ************************************************************/
+ public Computation get_lambda_function ()
+ {
+ return lambda_function;
+ }
+
+ public Computation get_collection ()
+ {
+ return collection;
+ }
+
+ public List<Computation> get_extra_parameters ()
+ {
+ return extra_params;
+ }
+
+ /**** Misc. ****************************************************************/
+ @Override
+ public String toString ()
+ {
+ final StringBuilder sb = new StringBuilder();
+
+ sb.append("(Sort ");
+ sb.append(lambda_function.toString());
+ sb.append(" ");
+ sb.append(collection.toString());
+
+ for (final Computation c: extra_params)
+ {
+ sb.append(" ");
+ sb.append(c.toString());
+ }
+
+ sb.append(")");
+
+ return sb.toString();
+ }
+}
diff --git a/src/core/src/tonkadur/fate/v1/lang/instruction/generic/SubList.java b/src/core/src/tonkadur/fate/v1/lang/instruction/generic/SubList.java
new file mode 100644
index 0000000..933d44d
--- /dev/null
+++ b/src/core/src/tonkadur/fate/v1/lang/instruction/generic/SubList.java
@@ -0,0 +1,148 @@
+package tonkadur.fate.v1.lang.instruction.generic;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+
+import tonkadur.parser.Origin;
+import tonkadur.parser.ParsingError;
+
+import tonkadur.fate.v1.lang.type.Type;
+
+import tonkadur.fate.v1.lang.meta.Computation;
+import tonkadur.fate.v1.lang.meta.Instruction;
+import tonkadur.fate.v1.lang.meta.InstructionVisitor;
+import tonkadur.fate.v1.lang.meta.RecurrentChecks;
+
+public class SubList extends GenericInstruction
+{
+ public static Collection<String> get_aliases ()
+ {
+ final List<String> aliases;
+
+ aliases = new ArrayList<String>();
+
+ aliases.add("list:sublist");
+ aliases.add("list:sub_list");
+ aliases.add("list:subList");
+ aliases.add("set:sublist");
+ aliases.add("set:sub_list");
+ aliases.add("set:subList");
+ aliases.add("set:subset");
+ aliases.add("set:sub_set");
+ aliases.add("set:subSet");
+
+ return aliases;
+ }
+
+ public static Instruction build
+ (
+ final Origin origin,
+ final String alias,
+ final List<Computation> call_parameters
+ )
+ throws Throwable
+ {
+ final Computation start;
+ final Computation end;
+ final Computation collection;
+
+ if (call_parameters.size() != 3)
+ {
+ // TODO: Error.
+ System.err.print
+ (
+ "[E] Wrong number of arguments at "
+ + origin.toString()
+ );
+
+ return null;
+ }
+
+ start = call_parameters.get(0);
+ end = call_parameters.get(1);
+ collection = call_parameters.get(2);
+
+ start.expect_non_string();
+ end.expect_non_string();
+ collection.expect_non_string();
+
+ if (alias.startsWith("set:"))
+ {
+ RecurrentChecks.assert_is_a_set(collection);
+ }
+ else
+ {
+ RecurrentChecks.assert_is_a_list(collection);
+ }
+
+ RecurrentChecks.assert_can_be_used_as(start, Type.INT);
+ RecurrentChecks.assert_can_be_used_as(end, Type.INT);
+
+ collection.use_as_reference();
+
+ return new SubList(origin, start, end, collection);
+ }
+
+ /***************************************************************************/
+ /**** MEMBERS **************************************************************/
+ /***************************************************************************/
+ protected final Computation start;
+ protected final Computation end;
+ protected final Computation collection;
+
+ /***************************************************************************/
+ /**** PROTECTED ************************************************************/
+ /***************************************************************************/
+ /**** Constructors *********************************************************/
+ protected SubList
+ (
+ final Origin origin,
+ final Computation start,
+ final Computation end,
+ final Computation collection
+ )
+ {
+ super(origin);
+
+ this.start = start;
+ this.end = end;
+ this.collection = collection;
+ }
+
+ /***************************************************************************/
+ /**** PUBLIC ***************************************************************/
+ /***************************************************************************/
+ /**** Accessors ************************************************************/
+ public Computation get_start_index ()
+ {
+ return start;
+ }
+
+ public Computation get_end_index ()
+ {
+ return end;
+ }
+
+ public Computation get_collection ()
+ {
+ return collection;
+ }
+
+ /**** Misc. ****************************************************************/
+ @Override
+ public String toString ()
+ {
+ final StringBuilder sb = new StringBuilder();
+
+ 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/meta/Computation.java b/src/core/src/tonkadur/fate/v1/lang/meta/Computation.java
index 73b63b7..851df56 100644
--- a/src/core/src/tonkadur/fate/v1/lang/meta/Computation.java
+++ b/src/core/src/tonkadur/fate/v1/lang/meta/Computation.java
@@ -48,6 +48,20 @@ public abstract class Computation extends Node
{
}
+ public void use_as_reference ()
+ throws ParsingError
+ {
+ // TODO: proper ParsingError.
+ System.err.println
+ (
+ "[W] Computation at "
+ + origin.toString
+ + " is being used as a reference, but isn't one. The instruction will"
+ + " not be able to modify the memory you thought was targeted by this"
+ + " computation."
+ );
+ }
+
/**** Misc. ****************************************************************/
@Override
public String toString ()
diff --git a/src/core/src/tonkadur/fate/v1/lang/meta/ComputationVisitor.java b/src/core/src/tonkadur/fate/v1/lang/meta/ComputationVisitor.java
index 25cdeea..7f93acf 100644
--- a/src/core/src/tonkadur/fate/v1/lang/meta/ComputationVisitor.java
+++ b/src/core/src/tonkadur/fate/v1/lang/meta/ComputationVisitor.java
@@ -22,18 +22,12 @@ public interface ComputationVisitor
public void visit_constant (final Constant n)
throws Throwable;
- public void visit_if_else_value (final IfElseValue n)
- throws Throwable;
-
public void visit_lambda_expression (final LambdaExpression n)
throws Throwable;
public void visit_let (final Let n)
throws Throwable;
- public void visit_newline (final Newline n)
- throws Throwable;
-
public void visit_sequence_reference (final SequenceReference n)
throws Throwable;
diff --git a/src/core/src/tonkadur/fate/v1/parser/FateParser.g4 b/src/core/src/tonkadur/fate/v1/parser/FateParser.g4
index 9a6fbdf..1f70545 100644
--- a/src/core/src/tonkadur/fate/v1/parser/FateParser.g4
+++ b/src/core/src/tonkadur/fate/v1/parser/FateParser.g4
@@ -2100,6 +2100,20 @@ returns [Computation result]
);
}
+ | SEQUENCE_KW identifier WS* R_PAREN
+ {
+ $result =
+ new SequenceReference
+ (
+ PARSER.get_origin_at
+ (
+ ($SEQUENCE_KW.getLine()),
+ ($SEQUENCE_KW.getCharPositionInLine())
+ ),
+ $identifier.text
+ );
+ }
+
| LAMBDA_KW
{
previous_local_variables_stack = PARSER.get_local_variables_stack();
diff --git a/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/ComputationCompiler.java b/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/ComputationCompiler.java
index b02b600..b9f62e9 100644
--- a/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/ComputationCompiler.java
+++ b/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/ComputationCompiler.java
@@ -154,6 +154,11 @@ implements tonkadur.fate.v1.lang.meta.ComputationVisitor
reserved_registers.addAll(cc.reserved_registers);
}
+ protected void assimilate_reserved_registers (final ComputationCompiler cc)
+ {
+ reserved_registers.addAll(cc.reserved_registers);
+ }
+
protected Register reserve (final Type t)
{
final Register result;
@@ -377,125 +382,6 @@ implements tonkadur.fate.v1.lang.meta.ComputationVisitor
}
@Override
- public void visit_if_else_value
- (
- final tonkadur.fate.v1.lang.computation.IfElseValue n
- )
- throws Throwable
- {
- final ComputationCompiler cond_cc, if_true_cc, if_false_cc;
-
- cond_cc = new ComputationCompiler(compiler);
- if_true_cc = new ComputationCompiler(compiler);
- if_false_cc = new ComputationCompiler(compiler);
-
- n.get_condition().get_visited_by(cond_cc);
- n.get_if_true().get_visited_by(if_true_cc);
- n.get_if_false().get_visited_by(if_false_cc);
-
- if (if_true_cc.has_init() || if_false_cc.has_init())
- {
- /*
- * Unsafe ifelse computation: at least one of the branches needs to
- * use instructions with values *before* the condition has been
- * checked. This results in non-lazy evaluation, and is dangerous:
- * the condition might be a test to ensure that the computations of the
- * chosen branch are legal. In such cases, performing the potentially
- * illegal branch's instructions is likely to result in a runtime error
- * on the interpreter.
- *
- * Instead, we just convert the ifelse into an instruction-based
- * equivalent and store the result in an anonymous register to be used
- * here.
- */
- final Register if_else_result;
- final List<Instruction> if_true_branch;
- final List<Instruction> if_false_branch;
-
- if_else_result = reserve(if_true_cc.get_computation().get_type());
-
- if_true_branch = new ArrayList<Instruction>();
- if_false_branch = new ArrayList<Instruction>();
-
- if (if_true_cc.has_init())
- {
- if_true_branch.add(if_true_cc.get_init());
- }
-
- if (if_false_cc.has_init())
- {
- if_false_branch.add(if_false_cc.get_init());
- }
-
- if_true_branch.add
- (
- new SetValue
- (
- if_else_result.get_address(),
- if_true_cc.get_computation()
- )
- );
-
- if_false_branch.add
- (
- new SetValue
- (
- if_else_result.get_address(),
- if_false_cc.get_computation()
- )
- );
-
- if (cond_cc.has_init())
- {
- init_instructions.add(cond_cc.get_init());
- }
-
- init_instructions.add
- (
- IfElse.generate
- (
- compiler.registers(),
- compiler.assembler(),
- cond_cc.get_computation(),
- compiler.assembler().merge(if_true_branch),
- compiler.assembler().merge(if_false_branch)
- )
- );
-
- reserved_registers.addAll(cond_cc.reserved_registers);
- reserved_registers.addAll(if_true_cc.reserved_registers);
- reserved_registers.addAll(if_false_cc.reserved_registers);
-
- result_as_computation = if_else_result.get_value();
- result_as_address = if_else_result.get_address();
- }
- else
- {
- assimilate(cond_cc);
- assimilate(if_true_cc);
- assimilate(if_false_cc);
-
- result_as_computation =
- new IfElseComputation
- (
- cond_cc.get_computation(),
- if_true_cc.get_computation(),
- if_false_cc.get_computation()
- );
- }
- }
-
- @Override
- public void visit_newline
- (
- final tonkadur.fate.v1.lang.computation.Newline n
- )
- throws Throwable
- {
- result_as_computation = new Newline();
- }
-
- @Override
public void visit_extra_computation
(
final tonkadur.fate.v1.lang.computation.ExtraComputationInstance n