summaryrefslogtreecommitdiff
path: root/src/core
diff options
context:
space:
mode:
authorNathanael Sensfelder <SpamShield0@MultiAgentSystems.org>2021-09-08 21:14:48 +0200
committerNathanael Sensfelder <SpamShield0@MultiAgentSystems.org>2021-09-08 21:14:48 +0200
commita12e2813b03cbb1253d5105f9e8d97781ad11db7 (patch)
tree08f24c78f802953962c216b0a5c3e81e1572d4c4 /src/core
parent5ae284c11fa12b7d17359096557ffc0d90229aed (diff)
Bug fixes, more shorthands, and Increment/Decrement instructions
Diffstat (limited to 'src/core')
-rw-r--r--src/core/src/tonkadur/fate/v1/lang/computation/generic/AddElementsOfComputation.java29
-rw-r--r--src/core/src/tonkadur/fate/v1/lang/computation/generic/RemoveAllOfElementComputation.java29
-rw-r--r--src/core/src/tonkadur/fate/v1/lang/computation/generic/RemoveElementComputation.java29
-rw-r--r--src/core/src/tonkadur/fate/v1/lang/computation/generic/RemoveElementsOfComputation.java29
-rw-r--r--src/core/src/tonkadur/fate/v1/lang/instruction/generic/AddElementsOf.java32
-rw-r--r--src/core/src/tonkadur/fate/v1/lang/instruction/generic/Clear.java31
-rw-r--r--src/core/src/tonkadur/fate/v1/lang/instruction/generic/Decrement.java141
-rw-r--r--src/core/src/tonkadur/fate/v1/lang/instruction/generic/Increment.java141
-rw-r--r--src/core/src/tonkadur/fate/v1/lang/instruction/generic/RemoveAllOfElement.java32
-rw-r--r--src/core/src/tonkadur/fate/v1/lang/instruction/generic/RemoveElement.java32
-rw-r--r--src/core/src/tonkadur/fate/v1/lang/instruction/generic/RemoveElementsOf.java32
-rw-r--r--src/core/src/tonkadur/fate/v1/lang/instruction/generic/ReverseList.java31
-rw-r--r--src/core/src/tonkadur/fate/v1/lang/instruction/generic/Shuffle.java31
-rw-r--r--src/core/src/tonkadur/fate/v1/lang/instruction/generic/SubList.java8
-rw-r--r--src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/instruction/generic/DecrementCompiler.java66
-rw-r--r--src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/instruction/generic/IncrementCompiler.java66
16 files changed, 736 insertions, 23 deletions
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 5057034..1f34678 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
@@ -89,7 +89,7 @@ public class AddElementsOfComputation extends GenericComputation
final Computation other_collection;
final Computation collection;
- if (call_parameters.size() != 2)
+ if (call_parameters.size() < 2)
{
ErrorManager.handle
(
@@ -99,7 +99,7 @@ public class AddElementsOfComputation extends GenericComputation
(
"("
+ alias
- + " <added_collection: (LIST X)|(SET X)>"
+ + " <added_collection: (LIST X)|(SET X)>+"
+ " <receiving_collection: (LIST X)|(SET X)>)"
)
)
@@ -107,6 +107,31 @@ public class AddElementsOfComputation extends GenericComputation
return null;
}
+ else if (call_parameters.size() > 2)
+ {
+ final int size_minus_one;
+ Computation result;
+
+ size_minus_one = call_parameters.size() - 1;
+
+ result = call_parameters.get(size_minus_one);
+
+ for (int i = 0; i < size_minus_one; ++i)
+ {
+ final List<Computation> temp_params;
+ final Computation addition;
+
+ addition = call_parameters.get(i);
+ temp_params = new ArrayList<Computation>();
+
+ temp_params.add(addition);
+ temp_params.add(result);
+
+ result = build(addition.get_origin(), alias, temp_params);
+ }
+
+ return result;
+ }
other_collection = call_parameters.get(0);
collection = call_parameters.get(1);
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 48e9658..58c1639 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
@@ -53,19 +53,44 @@ public class RemoveAllOfElementComputation extends GenericComputation
final Computation element;
final Computation collection;
- if (call_parameters.size() != 2)
+ if (call_parameters.size() < 2)
{
ErrorManager.handle
(
new WrongNumberOfParametersException
(
origin,
- "(" + alias + " <element: X> <(LIST X)|(SET X)>)"
+ "(" + alias + " <element: X>+ <(LIST X)|(SET X)>)"
)
);
return null;
}
+ else if (call_parameters.size() > 2)
+ {
+ final int size_minus_one;
+ Computation result;
+
+ size_minus_one = call_parameters.size() - 1;
+
+ result = call_parameters.get(size_minus_one);
+
+ for (int i = 0; i < size_minus_one; ++i)
+ {
+ final List<Computation> temp_params;
+ final Computation addition;
+
+ addition = call_parameters.get(i);
+ temp_params = new ArrayList<Computation>();
+
+ temp_params.add(addition);
+ temp_params.add(result);
+
+ result = build(addition.get_origin(), alias, temp_params);
+ }
+
+ return result;
+ }
element = call_parameters.get(0);
collection = call_parameters.get(1);
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 f806623..b40d637 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
@@ -54,19 +54,44 @@ public class RemoveElementComputation extends GenericComputation
final Computation element;
final Computation collection;
- if (call_parameters.size() != 1)
+ if (call_parameters.size() < 2)
{
ErrorManager.handle
(
new WrongNumberOfParametersException
(
origin,
- "(" + alias + " <element: X> <(LIST X)|(SET X)>)"
+ "(" + alias + " <element: X>+ <(LIST X)|(SET X)>)"
)
);
return null;
}
+ else if (call_parameters.size() > 2)
+ {
+ final int size_minus_one;
+ Computation result;
+
+ size_minus_one = call_parameters.size() - 1;
+
+ result = call_parameters.get(size_minus_one);
+
+ for (int i = 0; i < size_minus_one; ++i)
+ {
+ final List<Computation> temp_params;
+ final Computation addition;
+
+ addition = call_parameters.get(i);
+ temp_params = new ArrayList<Computation>();
+
+ temp_params.add(addition);
+ temp_params.add(result);
+
+ result = build(addition.get_origin(), alias, temp_params);
+ }
+
+ return result;
+ }
element = call_parameters.get(0);
collection = call_parameters.get(1);
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 000afd4..45102c7 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
@@ -48,7 +48,7 @@ public class RemoveElementsOfComputation extends GenericComputation
final Computation other_collection;
final Computation collection;
- if (call_parameters.size() != 2)
+ if (call_parameters.size() < 2)
{
ErrorManager.handle
(
@@ -58,7 +58,7 @@ public class RemoveElementsOfComputation extends GenericComputation
(
"("
+ alias
- + " <removed: (LIST X)|(SET X)>"
+ + " <removed: (LIST X)|(SET X)>+"
+ " <base_collection: (LIST X)|(SET X)>)"
)
)
@@ -66,6 +66,31 @@ public class RemoveElementsOfComputation extends GenericComputation
return null;
}
+ else if (call_parameters.size() > 2)
+ {
+ final int size_minus_one;
+ Computation result;
+
+ size_minus_one = call_parameters.size() - 1;
+
+ result = call_parameters.get(size_minus_one);
+
+ for (int i = 0; i < size_minus_one; ++i)
+ {
+ final List<Computation> temp_params;
+ final Computation addition;
+
+ addition = call_parameters.get(i);
+ temp_params = new ArrayList<Computation>();
+
+ temp_params.add(addition);
+ temp_params.add(result);
+
+ result = build(addition.get_origin(), alias, temp_params);
+ }
+
+ return result;
+ }
other_collection = call_parameters.get(0);
collection = call_parameters.get(1);
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
index b022428..964980b 100644
--- a/src/core/src/tonkadur/fate/v1/lang/instruction/generic/AddElementsOf.java
+++ b/src/core/src/tonkadur/fate/v1/lang/instruction/generic/AddElementsOf.java
@@ -19,6 +19,7 @@ import tonkadur.fate.v1.lang.meta.Computation;
import tonkadur.fate.v1.lang.meta.RecurrentChecks;
import tonkadur.fate.v1.lang.instruction.GenericInstruction;
+import tonkadur.fate.v1.lang.instruction.InstructionList;
public class AddElementsOf extends GenericInstruction
{
@@ -90,7 +91,7 @@ public class AddElementsOf extends GenericInstruction
final Computation other_collection;
final Computation collection;
- if (call_parameters.size() != 2)
+ if (call_parameters.size() < 2)
{
ErrorManager.handle
(
@@ -100,7 +101,7 @@ public class AddElementsOf extends GenericInstruction
(
"("
+ alias
- + "! <additions: (LIST X)|(SET X)>"
+ + "! <additions: (LIST X)|(SET X)>+"
+ " <base_collection: (LIST X)|(SET X)>)"
)
)
@@ -108,6 +109,33 @@ public class AddElementsOf extends GenericInstruction
return null;
}
+ else if (call_parameters.size() > 2)
+ {
+ final int size_minus_one;
+ final List<Instruction> result;
+ final List<Computation> sub_call_parameters;
+
+ size_minus_one = call_parameters.size() - 1;
+
+ result = new ArrayList<Instruction>();
+ sub_call_parameters = new ArrayList<Computation>();
+
+ sub_call_parameters.add(call_parameters.get(size_minus_one));
+ sub_call_parameters.add(sub_call_parameters.get(0));
+
+ for (int i = 0; i < size_minus_one; ++i)
+ {
+ final Computation added_element;
+
+ added_element = call_parameters.get(i);
+
+ sub_call_parameters.set(0, added_element);
+
+ result.add(build(origin, alias, sub_call_parameters));
+ }
+
+ return new InstructionList(origin, result);
+ }
other_collection = call_parameters.get(0);
collection = call_parameters.get(1);
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 bc169a0..3d60f88 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
@@ -16,6 +16,7 @@ import tonkadur.fate.v1.lang.meta.Instruction;
import tonkadur.fate.v1.lang.meta.RecurrentChecks;
import tonkadur.fate.v1.lang.instruction.GenericInstruction;
+import tonkadur.fate.v1.lang.instruction.InstructionList;
public class Clear extends GenericInstruction
{
@@ -47,7 +48,7 @@ public class Clear extends GenericInstruction
{
final Computation collection;
- if (call_parameters.size() != 1)
+ if (call_parameters.size() < 1)
{
ErrorManager.handle
(
@@ -57,13 +58,39 @@ public class Clear extends GenericInstruction
(
"("
+ alias
- + "! <(LIST X)|(SET X)>)"
+ + "! <(LIST X)|(SET X)>+)"
)
)
);
return null;
}
+ else if (call_parameters.size() > 1)
+ {
+ final int size_minus_one;
+ final List<Instruction> result;
+ final List<Computation> sub_call_parameters;
+
+ size_minus_one = call_parameters.size();
+
+ result = new ArrayList<Instruction>();
+ sub_call_parameters = new ArrayList<Computation>();
+
+ sub_call_parameters.add(sub_call_parameters.get(0));
+
+ for (int i = 0; i < size_minus_one; ++i)
+ {
+ final Computation added_element;
+
+ added_element = call_parameters.get(i);
+
+ sub_call_parameters.set(0, added_element);
+
+ result.add(build(origin, alias, sub_call_parameters));
+ }
+
+ return new InstructionList(origin, result);
+ }
collection = call_parameters.get(0);
diff --git a/src/core/src/tonkadur/fate/v1/lang/instruction/generic/Decrement.java b/src/core/src/tonkadur/fate/v1/lang/instruction/generic/Decrement.java
new file mode 100644
index 0000000..9f3be2e
--- /dev/null
+++ b/src/core/src/tonkadur/fate/v1/lang/instruction/generic/Decrement.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 tonkadur.parser.Origin;
+import tonkadur.parser.ParsingError;
+
+import tonkadur.error.ErrorManager;
+
+import tonkadur.fate.v1.error.WrongNumberOfParametersException;
+
+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;
+
+import tonkadur.fate.v1.lang.type.Type;
+
+import tonkadur.fate.v1.lang.instruction.GenericInstruction;
+import tonkadur.fate.v1.lang.instruction.InstructionList;
+
+public class Decrement extends GenericInstruction
+{
+ public static Collection<String> get_aliases ()
+ {
+ final List<String> aliases;
+
+ aliases = new ArrayList<String>();
+
+ aliases.add("decrement");
+ aliases.add("dec");
+ aliases.add("--");
+
+ return aliases;
+ }
+
+ public static Instruction build
+ (
+ final Origin origin,
+ final String alias,
+ final List<Computation> call_parameters
+ )
+ throws Throwable
+ {
+ final Computation element;
+
+ if (call_parameters.size() < 1)
+ {
+ ErrorManager.handle
+ (
+ new WrongNumberOfParametersException
+ (
+ origin,
+ "(" + alias + "! <INT REFERENCE>+)"
+ )
+ );
+
+ return null;
+ }
+ else if (call_parameters.size() > 1)
+ {
+ final int size_minus_one;
+ final List<Instruction> result;
+ final List<Computation> sub_call_parameters;
+
+ size_minus_one = call_parameters.size();
+
+ result = new ArrayList<Instruction>();
+ sub_call_parameters = new ArrayList<Computation>();
+
+ sub_call_parameters.add(call_parameters.get(size_minus_one));
+
+ for (int i = 0; i < size_minus_one; ++i)
+ {
+ final Computation added_element;
+
+ added_element = call_parameters.get(i);
+
+ sub_call_parameters.set(0, added_element);
+
+ result.add(build(origin, alias, sub_call_parameters));
+ }
+
+ return new InstructionList(origin, result);
+ }
+
+ element = call_parameters.get(0);
+
+ RecurrentChecks.assert_can_be_used_as(element, Type.INT);
+
+ element.expect_non_string();
+
+ element.use_as_reference();
+
+ return new Decrement(origin, element);
+ }
+
+ /***************************************************************************/
+ /**** MEMBERS **************************************************************/
+ /***************************************************************************/
+ protected final Computation element;
+
+ /***************************************************************************/
+ /**** PROTECTED ************************************************************/
+ /***************************************************************************/
+ /**** Constructors *********************************************************/
+ protected Decrement
+ (
+ final Origin origin,
+ final Computation element
+ )
+ {
+ super(origin);
+
+ this.element = element;
+ }
+
+ /***************************************************************************/
+ /**** PUBLIC ***************************************************************/
+ /***************************************************************************/
+ /**** Accessors ************************************************************/
+ public Computation get_reference ()
+ {
+ return element;
+ }
+
+ /**** Misc. ****************************************************************/
+ @Override
+ public String toString ()
+ {
+ final StringBuilder sb = new StringBuilder();
+
+ sb.append("(Decrement ");
+ sb.append(element.toString());
+ sb.append(")");
+
+ return sb.toString();
+ }
+}
diff --git a/src/core/src/tonkadur/fate/v1/lang/instruction/generic/Increment.java b/src/core/src/tonkadur/fate/v1/lang/instruction/generic/Increment.java
new file mode 100644
index 0000000..92e8290
--- /dev/null
+++ b/src/core/src/tonkadur/fate/v1/lang/instruction/generic/Increment.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 tonkadur.parser.Origin;
+import tonkadur.parser.ParsingError;
+
+import tonkadur.error.ErrorManager;
+
+import tonkadur.fate.v1.error.WrongNumberOfParametersException;
+
+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;
+
+import tonkadur.fate.v1.lang.type.Type;
+
+import tonkadur.fate.v1.lang.instruction.GenericInstruction;
+import tonkadur.fate.v1.lang.instruction.InstructionList;
+
+public class Increment extends GenericInstruction
+{
+ public static Collection<String> get_aliases ()
+ {
+ final List<String> aliases;
+
+ aliases = new ArrayList<String>();
+
+ aliases.add("increment");
+ aliases.add("inc");
+ aliases.add("++");
+
+ return aliases;
+ }
+
+ public static Instruction build
+ (
+ final Origin origin,
+ final String alias,
+ final List<Computation> call_parameters
+ )
+ throws Throwable
+ {
+ final Computation element;
+
+ if (call_parameters.size() < 1)
+ {
+ ErrorManager.handle
+ (
+ new WrongNumberOfParametersException
+ (
+ origin,
+ "(" + alias + "! <INT REFERENCE>+)"
+ )
+ );
+
+ return null;
+ }
+ else if (call_parameters.size() > 1)
+ {
+ final int size_minus_one;
+ final List<Instruction> result;
+ final List<Computation> sub_call_parameters;
+
+ size_minus_one = call_parameters.size();
+
+ result = new ArrayList<Instruction>();
+ sub_call_parameters = new ArrayList<Computation>();
+
+ sub_call_parameters.add(call_parameters.get(size_minus_one));
+
+ for (int i = 0; i < size_minus_one; ++i)
+ {
+ final Computation added_element;
+
+ added_element = call_parameters.get(i);
+
+ sub_call_parameters.set(0, added_element);
+
+ result.add(build(origin, alias, sub_call_parameters));
+ }
+
+ return new InstructionList(origin, result);
+ }
+
+ element = call_parameters.get(0);
+
+ RecurrentChecks.assert_can_be_used_as(element, Type.INT);
+
+ element.expect_non_string();
+
+ element.use_as_reference();
+
+ return new Increment(origin, element);
+ }
+
+ /***************************************************************************/
+ /**** MEMBERS **************************************************************/
+ /***************************************************************************/
+ protected final Computation element;
+
+ /***************************************************************************/
+ /**** PROTECTED ************************************************************/
+ /***************************************************************************/
+ /**** Constructors *********************************************************/
+ protected Increment
+ (
+ final Origin origin,
+ final Computation element
+ )
+ {
+ super(origin);
+
+ this.element = element;
+ }
+
+ /***************************************************************************/
+ /**** PUBLIC ***************************************************************/
+ /***************************************************************************/
+ /**** Accessors ************************************************************/
+ public Computation get_reference ()
+ {
+ return element;
+ }
+
+ /**** Misc. ****************************************************************/
+ @Override
+ public String toString ()
+ {
+ final StringBuilder sb = new StringBuilder();
+
+ sb.append("(Increment ");
+ sb.append(element.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
index ef02d7f..82ed470 100644
--- a/src/core/src/tonkadur/fate/v1/lang/instruction/generic/RemoveAllOfElement.java
+++ b/src/core/src/tonkadur/fate/v1/lang/instruction/generic/RemoveAllOfElement.java
@@ -17,6 +17,7 @@ import tonkadur.fate.v1.lang.meta.Computation;
import tonkadur.fate.v1.lang.meta.RecurrentChecks;
import tonkadur.fate.v1.lang.instruction.GenericInstruction;
+import tonkadur.fate.v1.lang.instruction.InstructionList;
public class RemoveAllOfElement extends GenericInstruction
{
@@ -53,19 +54,46 @@ public class RemoveAllOfElement extends GenericInstruction
final Computation element;
final Computation collection;
- if (call_parameters.size() != 2)
+ if (call_parameters.size() < 2)
{
ErrorManager.handle
(
new WrongNumberOfParametersException
(
origin,
- "(" + alias + "! <X> <(LIST X)|(SET X) REFERENCE>)"
+ "(" + alias + "! <X>+ <(LIST X)|(SET X) REFERENCE>)"
)
);
return null;
}
+ else if (call_parameters.size() > 2)
+ {
+ final int size_minus_one;
+ final List<Instruction> result;
+ final List<Computation> sub_call_parameters;
+
+ size_minus_one = call_parameters.size() - 1;
+
+ result = new ArrayList<Instruction>();
+ sub_call_parameters = new ArrayList<Computation>();
+
+ sub_call_parameters.add(call_parameters.get(size_minus_one));
+ sub_call_parameters.add(sub_call_parameters.get(0));
+
+ for (int i = 0; i < size_minus_one; ++i)
+ {
+ final Computation added_element;
+
+ added_element = call_parameters.get(i);
+
+ sub_call_parameters.set(0, added_element);
+
+ result.add(build(origin, alias, sub_call_parameters));
+ }
+
+ return new InstructionList(origin, result);
+ }
element = call_parameters.get(0);
collection = call_parameters.get(1);
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
index 226ffce..9502eb2 100644
--- a/src/core/src/tonkadur/fate/v1/lang/instruction/generic/RemoveElement.java
+++ b/src/core/src/tonkadur/fate/v1/lang/instruction/generic/RemoveElement.java
@@ -17,6 +17,7 @@ import tonkadur.fate.v1.lang.meta.Computation;
import tonkadur.fate.v1.lang.meta.RecurrentChecks;
import tonkadur.fate.v1.lang.instruction.GenericInstruction;
+import tonkadur.fate.v1.lang.instruction.InstructionList;
public class RemoveElement extends GenericInstruction
{
@@ -55,19 +56,46 @@ public class RemoveElement extends GenericInstruction
final Computation element;
final Computation collection;
- if (call_parameters.size() != 1)
+ if (call_parameters.size() < 2)
{
ErrorManager.handle
(
new WrongNumberOfParametersException
(
origin,
- "(" + alias + "! <X> <(LIST X)|(SET X) REFERENCE>)"
+ "(" + alias + "! <X>+ <(LIST X)|(SET X) REFERENCE>)"
)
);
return null;
}
+ else if (call_parameters.size() > 2)
+ {
+ final int size_minus_one;
+ final List<Instruction> result;
+ final List<Computation> sub_call_parameters;
+
+ size_minus_one = call_parameters.size() - 1;
+
+ result = new ArrayList<Instruction>();
+ sub_call_parameters = new ArrayList<Computation>();
+
+ sub_call_parameters.add(call_parameters.get(size_minus_one));
+ sub_call_parameters.add(sub_call_parameters.get(0));
+
+ for (int i = 0; i < size_minus_one; ++i)
+ {
+ final Computation added_element;
+
+ added_element = call_parameters.get(i);
+
+ sub_call_parameters.set(0, added_element);
+
+ result.add(build(origin, alias, sub_call_parameters));
+ }
+
+ return new InstructionList(origin, result);
+ }
element = call_parameters.get(0);
collection = call_parameters.get(1);
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
index 1d5a9a0..af85997 100644
--- a/src/core/src/tonkadur/fate/v1/lang/instruction/generic/RemoveElementsOf.java
+++ b/src/core/src/tonkadur/fate/v1/lang/instruction/generic/RemoveElementsOf.java
@@ -19,6 +19,7 @@ import tonkadur.fate.v1.lang.meta.Computation;
import tonkadur.fate.v1.lang.meta.RecurrentChecks;
import tonkadur.fate.v1.lang.instruction.GenericInstruction;
+import tonkadur.fate.v1.lang.instruction.InstructionList;
public class RemoveElementsOf extends GenericInstruction
{
@@ -49,19 +50,46 @@ public class RemoveElementsOf extends GenericInstruction
final Computation other_collection;
final Computation collection;
- if (call_parameters.size() != 2)
+ if (call_parameters.size() < 2)
{
ErrorManager.handle
(
new WrongNumberOfParametersException
(
origin,
- "(" + alias + "! <X> <(LIST X)|(SET X) REFERENCE>)"
+ "(" + alias + "! <X>+ <(LIST X)|(SET X) REFERENCE>)"
)
);
return null;
}
+ else if (call_parameters.size() > 2)
+ {
+ final int size_minus_one;
+ final List<Instruction> result;
+ final List<Computation> sub_call_parameters;
+
+ size_minus_one = call_parameters.size() - 1;
+
+ result = new ArrayList<Instruction>();
+ sub_call_parameters = new ArrayList<Computation>();
+
+ sub_call_parameters.add(call_parameters.get(size_minus_one));
+ sub_call_parameters.add(sub_call_parameters.get(0));
+
+ for (int i = 0; i < size_minus_one; ++i)
+ {
+ final Computation added_element;
+
+ added_element = call_parameters.get(i);
+
+ sub_call_parameters.set(0, added_element);
+
+ result.add(build(origin, alias, sub_call_parameters));
+ }
+
+ return new InstructionList(origin, result);
+ }
other_collection = call_parameters.get(0);
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
index d069381..15835e1 100644
--- a/src/core/src/tonkadur/fate/v1/lang/instruction/generic/ReverseList.java
+++ b/src/core/src/tonkadur/fate/v1/lang/instruction/generic/ReverseList.java
@@ -17,6 +17,7 @@ import tonkadur.fate.v1.lang.meta.Computation;
import tonkadur.fate.v1.lang.meta.RecurrentChecks;
import tonkadur.fate.v1.lang.instruction.GenericInstruction;
+import tonkadur.fate.v1.lang.instruction.InstructionList;
public class ReverseList extends GenericInstruction
{
@@ -42,19 +43,45 @@ public class ReverseList extends GenericInstruction
{
final Computation collection;
- if (call_parameters.size() != 1)
+ if (call_parameters.size() < 1)
{
ErrorManager.handle
(
new WrongNumberOfParametersException
(
origin,
- "(" + alias + "! <(LIST X)|(SET X) REFERENCE>)"
+ "(" + alias + "! <(LIST X)|(SET X) REFERENCE>+)"
)
);
return null;
}
+ else if (call_parameters.size() > 1)
+ {
+ final int size_minus_one;
+ final List<Instruction> result;
+ final List<Computation> sub_call_parameters;
+
+ size_minus_one = call_parameters.size();
+
+ result = new ArrayList<Instruction>();
+ sub_call_parameters = new ArrayList<Computation>();
+
+ sub_call_parameters.add(sub_call_parameters.get(0));
+
+ for (int i = 0; i < size_minus_one; ++i)
+ {
+ final Computation added_element;
+
+ added_element = call_parameters.get(i);
+
+ sub_call_parameters.set(0, added_element);
+
+ result.add(build(origin, alias, sub_call_parameters));
+ }
+
+ return new InstructionList(origin, result);
+ }
collection = call_parameters.get(0);
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
index b89b100..eac8434 100644
--- a/src/core/src/tonkadur/fate/v1/lang/instruction/generic/Shuffle.java
+++ b/src/core/src/tonkadur/fate/v1/lang/instruction/generic/Shuffle.java
@@ -17,6 +17,7 @@ import tonkadur.fate.v1.lang.meta.Computation;
import tonkadur.fate.v1.lang.meta.RecurrentChecks;
import tonkadur.fate.v1.lang.instruction.GenericInstruction;
+import tonkadur.fate.v1.lang.instruction.InstructionList;
public class Shuffle extends GenericInstruction
{
@@ -41,19 +42,45 @@ public class Shuffle extends GenericInstruction
{
final Computation collection;
- if (call_parameters.size() != 1)
+ if (call_parameters.size() < 1)
{
ErrorManager.handle
(
new WrongNumberOfParametersException
(
origin,
- "(" + alias + "! <(LIST X) REFERENCE>)"
+ "(" + alias + "! <(LIST X) REFERENCE>+)"
)
);
return null;
}
+ else if (call_parameters.size() > 1)
+ {
+ final int size_minus_one;
+ final List<Instruction> result;
+ final List<Computation> sub_call_parameters;
+
+ size_minus_one = call_parameters.size();
+
+ result = new ArrayList<Instruction>();
+ sub_call_parameters = new ArrayList<Computation>();
+
+ sub_call_parameters.add(sub_call_parameters.get(0));
+
+ for (int i = 0; i < size_minus_one; ++i)
+ {
+ final Computation added_element;
+
+ added_element = call_parameters.get(i);
+
+ sub_call_parameters.set(0, added_element);
+
+ result.add(build(origin, alias, sub_call_parameters));
+ }
+
+ return new InstructionList(origin, result);
+ }
collection = call_parameters.get(0);
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
index 7c2b6c1..7fad3a3 100644
--- a/src/core/src/tonkadur/fate/v1/lang/instruction/generic/SubList.java
+++ b/src/core/src/tonkadur/fate/v1/lang/instruction/generic/SubList.java
@@ -60,7 +60,13 @@ public class SubList extends GenericInstruction
new WrongNumberOfParametersException
(
origin,
- "(" + alias + "! <(LIST X)|(SET X) REFERENCE>)"
+ (
+ "("
+ + alias
+ + "! <start_at: INT>"
+ + " <stop_before: INT>"
+ + " <(LIST X)|(SET X) REFERENCE>)"
+ )
)
);
diff --git a/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/instruction/generic/DecrementCompiler.java b/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/instruction/generic/DecrementCompiler.java
new file mode 100644
index 0000000..a0dfeda
--- /dev/null
+++ b/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/instruction/generic/DecrementCompiler.java
@@ -0,0 +1,66 @@
+package tonkadur.wyrd.v1.compiler.fate.v1.instruction.generic;
+
+import tonkadur.fate.v1.lang.instruction.generic.Decrement;
+
+import tonkadur.wyrd.v1.compiler.fate.v1.Compiler;
+import tonkadur.wyrd.v1.compiler.fate.v1.ComputationCompiler;
+
+import tonkadur.wyrd.v1.compiler.fate.v1.instruction.GenericInstructionCompiler;
+
+import tonkadur.wyrd.v1.lang.instruction.SetValue;
+
+import tonkadur.wyrd.v1.lang.computation.Constant;
+import tonkadur.wyrd.v1.lang.computation.Operation;
+
+public class DecrementCompiler extends GenericInstructionCompiler
+{
+ public static Class get_target_class ()
+ {
+ return Decrement.class;
+ }
+
+ public DecrementCompiler (final Compiler compiler)
+ {
+ super(compiler);
+ }
+
+ /*
+ * Fate: (set_value address value)
+ * Wyrd: (set_value address value)
+ */
+ public void compile
+ (
+ final tonkadur.fate.v1.lang.instruction.GenericInstruction instruction
+ )
+ throws Throwable
+ {
+ final Decrement source;
+ final ComputationCompiler address_cc;
+
+ source = (Decrement) instruction;
+
+ address_cc = new ComputationCompiler(compiler);
+
+ source.get_reference().get_visited_by(address_cc);
+
+ if (address_cc.has_init())
+ {
+ result.add(address_cc.get_init());
+ }
+
+ result.add
+ (
+ new tonkadur.wyrd.v1.lang.instruction.SetValue
+ (
+ address_cc.get_address(),
+ Operation.minus
+ (
+ address_cc.get_computation(),
+ Constant.ONE
+ )
+ )
+ );
+
+ address_cc.release_registers(result);
+ }
+}
diff --git a/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/instruction/generic/IncrementCompiler.java b/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/instruction/generic/IncrementCompiler.java
new file mode 100644
index 0000000..27d00ea
--- /dev/null
+++ b/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/instruction/generic/IncrementCompiler.java
@@ -0,0 +1,66 @@
+package tonkadur.wyrd.v1.compiler.fate.v1.instruction.generic;
+
+import tonkadur.fate.v1.lang.instruction.generic.Increment;
+
+import tonkadur.wyrd.v1.compiler.fate.v1.Compiler;
+import tonkadur.wyrd.v1.compiler.fate.v1.ComputationCompiler;
+
+import tonkadur.wyrd.v1.compiler.fate.v1.instruction.GenericInstructionCompiler;
+
+import tonkadur.wyrd.v1.lang.instruction.SetValue;
+
+import tonkadur.wyrd.v1.lang.computation.Constant;
+import tonkadur.wyrd.v1.lang.computation.Operation;
+
+public class IncrementCompiler extends GenericInstructionCompiler
+{
+ public static Class get_target_class ()
+ {
+ return Increment.class;
+ }
+
+ public IncrementCompiler (final Compiler compiler)
+ {
+ super(compiler);
+ }
+
+ /*
+ * Fate: (set_value address value)
+ * Wyrd: (set_value address value)
+ */
+ public void compile
+ (
+ final tonkadur.fate.v1.lang.instruction.GenericInstruction instruction
+ )
+ throws Throwable
+ {
+ final Increment source;
+ final ComputationCompiler address_cc;
+
+ source = (Increment) instruction;
+
+ address_cc = new ComputationCompiler(compiler);
+
+ source.get_reference().get_visited_by(address_cc);
+
+ if (address_cc.has_init())
+ {
+ result.add(address_cc.get_init());
+ }
+
+ result.add
+ (
+ new tonkadur.wyrd.v1.lang.instruction.SetValue
+ (
+ address_cc.get_address(),
+ Operation.plus
+ (
+ address_cc.get_computation(),
+ Constant.ONE
+ )
+ )
+ );
+
+ address_cc.release_registers(result);
+ }
+}