summaryrefslogtreecommitdiff
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
parent5ae284c11fa12b7d17359096557ffc0d90229aed (diff)
Bug fixes, more shorthands, and Increment/Decrement instructions
-rw-r--r--data/unit-testing/fold.fate24
-rw-r--r--data/unit-testing/map.fate99
-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
18 files changed, 781 insertions, 101 deletions
diff --git a/data/unit-testing/fold.fate b/data/unit-testing/fold.fate
index fdb941f..7148aa2 100644
--- a/data/unit-testing/fold.fate
+++ b/data/unit-testing/fold.fate
@@ -10,12 +10,12 @@
(assert!
(= 55
- (foldl
+ (list:foldl
(lambda ((int res) (int e)) (+ res e))
0
0to10
)
- (foldr
+ (list:foldr
(lambda ((int res) (int e)) (+ res e))
0
0to10
@@ -24,14 +24,14 @@
[FAILED] (var test_name) Failed sum.
(newline)
foldl yielded:
- (foldl
+ (list:foldl
(lambda ((int res) (int e)) (+ res e))
0
0to10
)
(newline)
foldr yielded:
- (foldr
+ (list:foldr
(lambda ((int res) (int e)) (+ res e))
0
0to10
@@ -42,9 +42,9 @@
(global (list int) 10to0_1)
(set! 10to0_0
- (foldr
+ (list:foldr
(lambda (((list int) res) (int e))
- (add (- e 10) res)
+ (list:add (- e 10) res)
)
(default (list int))
(list:range 10 20 1)
@@ -52,9 +52,9 @@
)
(set! 10to0_1
- (foldr
+ (list:foldr
(lambda (((list int) res) (int e) (int mod))
- (add (- e mod) res)
+ (list:add (- e mod) res)
)
(default (list int))
(list:range 10 20 1)
@@ -132,9 +132,9 @@
(global (list int) 10to20_1)
(set! 10to20_0
- (foldl
+ (list:foldl
(lambda (((list int) res) (int e))
- (add (- e 10) res)
+ (list:add (- e 10) res)
)
(default (list int))
(list:range 20 30 1)
@@ -142,9 +142,9 @@
)
(set! 10to20_1
- (foldl
+ (list:foldl
(lambda (((list int) res) (int e) (int mod))
- (add (- e mod) res)
+ (list:add (- e mod) res)
)
(default (list int))
(list:range 20 30 1)
diff --git a/data/unit-testing/map.fate b/data/unit-testing/map.fate
index 4659e96..1ecaf10 100644
--- a/data/unit-testing/map.fate
+++ b/data/unit-testing/map.fate
@@ -5,129 +5,95 @@
(set! test_name ( MAP ))
(global (list int) li0)
-(global (list int) li1)
(global (list int) li2)
-(global (list int) li3)
(set! li0
- (map
+ (list:map
(lambda ((int i)) (* i 2))
(list:range 0 10 1)
)
)
-(set! li1 (list:range 0 10 1))
-
-(map!
- (lambda ((int i)) (* i 2))
- li1
-)
-
(set! li2
- (map
+ (list:map
(lambda ((int i) (int mod)) (* i mod))
(list:range 0 10 1)
2
)
)
-(set! li3 (list:range 0 10 1))
-
-(map!
- (lambda ((int i) (int mod)) (* i mod))
- li3
- 2
-)
-
(assert!
- (= (var li1) (var li0) (var li2) (var li3))
+ (= (var li0) (var li2))
[FAILED] (var test_name) Equality test 0.
)
(assert!
- (= 0 (var li1.0) (var li0.0))
- [FAILED] (var test_name) Test for 0: (var li1.0), (var li0.0).
+ (= 0 (var li2.0) (var li0.0))
+ [FAILED] (var test_name) Test for 0: (var li2.0), (var li0.0).
)
(assert!
- (= 2 (var li1.1) (var li0.1))
- [FAILED] (var test_name) Test for 2: (var li1.1), (var li0.1).
+ (= 2 (var li2.1) (var li0.1))
+ [FAILED] (var test_name) Test for 2: (var li2.1), (var li0.1).
)
(assert!
- (= 4 (var li1.2) (var li0.2))
- [FAILED] (var test_name) Test for 4: (var li1.2), (var li0.2).
+ (= 4 (var li2.2) (var li0.2))
+ [FAILED] (var test_name) Test for 4: (var li2.2), (var li0.2).
)
(assert!
- (= 6 (var li1.3) (var li0.3))
- [FAILED] (var test_name) Test for 6: (var li1.3), (var li0.3).
+ (= 6 (var li2.3) (var li0.3))
+ [FAILED] (var test_name) Test for 6: (var li2.3), (var li0.3).
)
(assert!
- (= 8 (var li1.4) (var li0.4))
- [FAILED] (var test_name) Test for 8: (var li1.4), (var li0.4).
+ (= 8 (var li2.4) (var li0.4))
+ [FAILED] (var test_name) Test for 8: (var li2.4), (var li0.4).
)
(assert!
- (= 10 (var li1.5) (var li0.5))
- [FAILED] (var test_name) Test for 10: (var li1.5), (var li0.5).
+ (= 10 (var li2.5) (var li0.5))
+ [FAILED] (var test_name) Test for 10: (var li2.5), (var li0.5).
)
(assert!
- (= 12 (var li1.6) (var li0.6))
- [FAILED] (var test_name) Test for 12: (var li1.6), (var li0.6).
+ (= 12 (var li2.6) (var li0.6))
+ [FAILED] (var test_name) Test for 12: (var li2.6), (var li0.6).
)
(assert!
- (= 14 (var li1.7) (var li0.7))
- [FAILED] (var test_name) Test for 14: (var li1.7), (var li0.7).
+ (= 14 (var li2.7) (var li0.7))
+ [FAILED] (var test_name) Test for 14: (var li2.7), (var li0.7).
)
(assert!
- (= 16 (var li1.8) (var li0.8))
- [FAILED] (var test_name) Test for 16: (var li1.8), (var li0.8).
+ (= 16 (var li2.8) (var li0.8))
+ [FAILED] (var test_name) Test for 16: (var li2.8), (var li0.8).
)
(assert!
- (= 18 (var li1.9) (var li0.9))
- [FAILED] (var test_name) Test for 18: (var li1.9), (var li0.9).
+ (= 18 (var li2.9) (var li0.9))
+ [FAILED] (var test_name) Test for 18: (var li2.9), (var li0.9).
)
(assert!
- (= 20 (var li1.10) (var li0.10))
- [FAILED] (var test_name) Test for 20: (var li1.10), (var li0.10).
+ (= 20 (var li2.10) (var li0.10))
+ [FAILED] (var test_name) Test for 20: (var li2.10), (var li0.10).
)
-(clear! li0)
-(clear! li1)
-(clear! li2)
-(clear! li3)
+(list:clear! li0)
+(list:clear! li2)
(set! li0
- (indexed_map
+ (list:indexed_map
(lambda ((int ix) (int i)) (+ (* i ix) 1000))
(list:range 10 20 1)
)
)
-(set! li1 (list:range 10 20 1))
-
-(indexed_map!
- (lambda ((int ix) (int i)) (+ (* i ix) 1000))
- li1
-)
-
(set! li2
- (indexed_map
+ (list:indexed_map
(lambda ((int ix) (int i) (int mod)) (+ (* i ix) mod))
(list:range 10 20 1)
1000
)
)
-(set! li3 (list:range 10 20 1))
-
-(indexed_map!
- (lambda ((int ix) (int i) (int mod)) (+ (* i ix) mod))
- li3
- 1000
-)
-
(assert!
- (= (var li1) (var li0) (var li2) (var li3))
+ (= (var li0) (var li2))
[FAILED] (var test_name) Equality test 1.
)
@@ -136,11 +102,12 @@
(for (set! i 0) (=< i 10) (set! i (+ i 1))
(assert!
(=
- (access i li1) (access i li0) (access i li2) (access i li3)
+ (list:access i li0)
+ (list:access i li2)
(+ (* i (+ 10 i)) 1000)
)
[FAILED] (var test_name) Indexed map at (var i):
- (access i li1), (access i li0), (access i li2), (access i li3)
+ (list:access i li0), (list:access i li2)
)
)
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);
+ }
+}