summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--data/unit-testing/field_access.fate10
-rw-r--r--data/unit-testing/filter.fate79
-rw-r--r--data/unit-testing/fold.fate191
-rw-r--r--src/core/src/tonkadur/fate/v1/parser/FateParser.g48
-rw-r--r--src/core/src/tonkadur/wyrd/v1/compiler/util/IndexedFilterLambda.java15
5 files changed, 277 insertions, 26 deletions
diff --git a/data/unit-testing/field_access.fate b/data/unit-testing/field_access.fate
index 4f977f8..dbc2c18 100644
--- a/data/unit-testing/field_access.fate
+++ b/data/unit-testing/field_access.fate
@@ -23,11 +23,11 @@
(test_struct_type1 ts1)
)
-(local test_struct_type0 ts0_0)
-(local test_struct_type0 ts0_1)
-(local test_struct_type1 ts1_0)
-(local test_struct_type1 ts1_1)
-(local test_struct_type2 ts2_0)
+(global test_struct_type0 ts0_0)
+(global test_struct_type0 ts0_1)
+(global test_struct_type1 ts1_0)
+(global test_struct_type1 ts1_1)
+(global test_struct_type2 ts2_0)
(set_fields! ts0_0
diff --git a/data/unit-testing/filter.fate b/data/unit-testing/filter.fate
index d71b057..8d85ee3 100644
--- a/data/unit-testing/filter.fate
+++ b/data/unit-testing/filter.fate
@@ -287,6 +287,85 @@
[FAILED] (var test_name) Failed indexed 0to10even2.5: (var 0to10even2.5).
)
+(global (list int) oli0)
+(global (list int) oli1)
+
+(set oli0 (range -10 10 1))
+(set oli1 (var oli0))
+
+(set oli0
+ (indexed_filter
+ (lambda ((int ix) (int i))
+ (exactly_one
+ (> i 0)
+ (= (mod ix 2) 1)
+ )
+ )
+ oli0
+ )
+)
+
+(indexed_filter!
+ (lambda ((int ix) (int i) ((list int) o))
+ (exactly_one
+ (> i 0)
+ (is_member (var ix) o)
+ )
+ )
+ oli1
+ (range 1 21 2)
+)
+
+(assert
+ (= -9 (var oli0.0) (var oli1.0))
+ [FAILED] (var test_name) Failed indexed filter -9: (var oli0.0), (var oli1.0)
+)
+
+(assert
+ (= -7 (var oli0.1) (var oli1.1))
+ [FAILED] (var test_name) Failed indexed filter -7: (var oli0.1), (var oli1.1)
+)
+
+(assert
+ (= -5 (var oli0.2) (var oli1.2))
+ [FAILED] (var test_name) Failed indexed filter -5: (var oli0.2), (var oli1.2)
+)
+
+(assert
+ (= -3 (var oli0.3) (var oli1.3))
+ [FAILED] (var test_name) Failed indexed filter -3: (var oli0.3), (var oli1.3)
+)
+
+(assert
+ (= -1 (var oli0.4) (var oli1.4))
+ [FAILED] (var test_name) Failed indexed filter -1: (var oli0.4), (var oli1.4)
+)
+
+(assert
+ (= 2 (var oli0.5) (var oli1.5))
+ [FAILED] (var test_name) Failed indexed filter 2: (var oli0.5), (var oli1.5)
+)
+
+(assert
+ (= 4 (var oli0.6) (var oli1.6))
+ [FAILED] (var test_name) Failed indexed filter 4: (var oli0.6), (var oli1.6)
+)
+
+(assert
+ (= 6 (var oli0.7) (var oli1.7))
+ [FAILED] (var test_name) Failed indexed filter 6: (var oli0.7), (var oli1.7)
+)
+
+(assert
+ (= 8 (var oli0.8) (var oli1.8))
+ [FAILED] (var test_name) Failed indexed filter 8: (var oli0.8), (var oli1.8)
+)
+
+(assert
+ (= 10 (var oli0.9) (var oli1.9))
+ [FAILED] (var test_name) Failed indexed filter 9: (var oli0.9), (var oli1.9)
+)
+
[COMPLETED] (var test_name)
(end)
diff --git a/data/unit-testing/fold.fate b/data/unit-testing/fold.fate
index 526cbe4..f064714 100644
--- a/data/unit-testing/fold.fate
+++ b/data/unit-testing/fold.fate
@@ -2,7 +2,7 @@
(global string test_name)
-(set test_name ( FILTER ))
+(set test_name ( FOLD ))
(global (list int) 0to10)
@@ -38,25 +38,184 @@
)
)
-(global (list string) ls)
+(global (list int) 10to0_0)
+(global (list int) 10to0_1)
-(local int i)
-(for (set i 0) (=< i 10) (set i (+ i 1))
- (add! (cast string (var i)) ls)
+(set 10to0_0
+ (foldr
+ (lambda (((list int) res) (int e))
+ (add (- e 10) res)
+ )
+ (default (list int))
+ (range 10 20 1)
+ )
+)
+
+(set 10to0_1
+ (foldr
+ (lambda (((list int) res) (int e) (int mod))
+ (add (- e mod) res)
+ )
+ (default (list int))
+ (range 10 20 1)
+ 10
+ )
+)
+
+(assert
+ (= 10 (var 10to0_0.0) (var 10to0_1.0))
+ [FAILED] (var test_name) 10to0.0:(newline)
+ (var 10to0_0.0), (var 10to0_1.0)
+)
+
+(assert
+ (= 9 (var 10to0_0.1) (var 10to0_1.1))
+ [FAILED] (var test_name) 10to0.1:(newline)
+ (var 10to0_0.1), (var 10to0_1.1)
+)
+
+(assert
+ (= 8 (var 10to0_0.2) (var 10to0_1.2))
+ [FAILED] (var test_name) 10to0.2:(newline)
+ (var 10to0_0.2), (var 10to0_1.2)
+)
+
+(assert
+ (= 7 (var 10to0_0.3) (var 10to0_1.3))
+ [FAILED] (var test_name) 10to0.3:(newline)
+ (var 10to0_0.3), (var 10to0_1.3)
+)
+
+(assert
+ (= 6 (var 10to0_0.4) (var 10to0_1.4))
+ [FAILED] (var test_name) 10to0.4:(newline)
+ (var 10to0_0.4), (var 10to0_1.4)
+)
+
+(assert
+ (= 5 (var 10to0_0.5) (var 10to0_1.5))
+ [FAILED] (var test_name) 10to0.5:(newline)
+ (var 10to0_0.5), (var 10to0_1.5)
+)
+
+(assert
+ (= 4 (var 10to0_0.6) (var 10to0_1.6))
+ [FAILED] (var test_name) 10to0.6:(newline)
+ (var 10to0_0.6), (var 10to0_1.6)
+)
+
+(assert
+ (= 3 (var 10to0_0.7) (var 10to0_1.7))
+ [FAILED] (var test_name) 10to0.7:(newline)
+ (var 10to0_0.7), (var 10to0_1.7)
+)
+
+(assert
+ (= 2 (var 10to0_0.8) (var 10to0_1.8))
+ [FAILED] (var test_name) 10to0.8:(newline)
+ (var 10to0_0.8), (var 10to0_1.8)
+)
+
+(assert
+ (= 1 (var 10to0_0.9) (var 10to0_1.9))
+ [FAILED] (var test_name) 10to0.9:(newline)
+ (var 10to0_0.9), (var 10to0_1.9)
+)
+
+(assert
+ (= 0 (var 10to0_0.10) (var 10to0_1.10))
+ [FAILED] (var test_name) 10to0.10:(newline)
+ (var 10to0_0.10), (var 10to0_1.10)
)
-foldl:
-(foldl
- (lambda ((text res) (string e)) (text (var res) (var e)))
- (default text)
- ls
+(global (list int) 10to20_0)
+(global (list int) 10to20_1)
+
+(set 10to20_0
+ (foldl
+ (lambda (((list int) res) (int e))
+ (add (- e 10) res)
+ )
+ (default (list int))
+ (range 20 30 1)
+ )
+)
+
+(set 10to20_1
+ (foldl
+ (lambda (((list int) res) (int e) (int mod))
+ (add (- e mod) res)
+ )
+ (default (list int))
+ (range 20 30 1)
+ 10
+ )
+)
+
+(assert
+ (= 10 (var 10to20_0.0) (var 10to20_1.0))
+ [FAILED] (var test_name) 10to20.0: (newline)
+ (var 10to20_0.0), (var 10to20_1.0)
+)
+
+(assert
+ (= 11 (var 10to20_0.1) (var 10to20_1.1))
+ [FAILED] (var test_name) 10to20.1: (newline)
+ (var 10to20_0.1), (var 10to20_1.1)
+)
+
+(assert
+ (= 12 (var 10to20_0.2) (var 10to20_1.2))
+ [FAILED] (var test_name) 10to20.2: (newline)
+ (var 10to20_0.2), (var 10to20_1.2)
+)
+
+(assert
+ (= 13 (var 10to20_0.3) (var 10to20_1.3))
+ [FAILED] (var test_name) 10to20.3: (newline)
+ (var 10to20_0.3), (var 10to20_1.3)
)
-(newline)
-foldr:
-(foldr
- (lambda ((text res) (string e)) (text (var res) (var e)))
- (default text)
- ls
+
+(assert
+ (= 14 (var 10to20_0.4) (var 10to20_1.4))
+ [FAILED] (var test_name) 10to20.4: (newline)
+ (var 10to20_0.4), (var 10to20_1.4)
+)
+
+(assert
+ (= 15 (var 10to20_0.5) (var 10to20_1.5))
+ [FAILED] (var test_name) 10to20.5: (newline)
+ (var 10to20_0.5), (var 10to20_1.5)
+)
+
+(assert
+ (= 16 (var 10to20_0.6) (var 10to20_1.6))
+ [FAILED] (var test_name) 10to20.6: (newline)
+ (var 10to20_0.6), (var 10to20_1.6)
+)
+
+(assert
+ (= 17 (var 10to20_0.7) (var 10to20_1.7))
+ [FAILED] (var test_name) 10to20.7: (newline)
+ (var 10to20_0.7), (var 10to20_1.7)
+)
+
+(assert
+ (= 18 (var 10to20_0.8) (var 10to20_1.8))
+ [FAILED] (var test_name) 10to20.8: (newline)
+ (var 10to20_0.8), (var 10to20_1.8)
+)
+
+(assert
+ (= 19 (var 10to20_0.9) (var 10to20_1.9))
+ [FAILED] (var test_name) 10to20.9: (newline)
+ (var 10to20_0.9), (var 10to20_1.9)
+)
+
+(assert
+ (= 20 (var 10to20_0.10) (var 10to20_1.10))
+ [FAILED] (var test_name) 10to20.10: (newline)
+ (var 10to20_0.10), (var 10to20_1.10)
)
[COMPLETED] (var test_name)
diff --git a/src/core/src/tonkadur/fate/v1/parser/FateParser.g4 b/src/core/src/tonkadur/fate/v1/parser/FateParser.g4
index 62f5e4b..2ea8bc4 100644
--- a/src/core/src/tonkadur/fate/v1/parser/FateParser.g4
+++ b/src/core/src/tonkadur/fate/v1/parser/FateParser.g4
@@ -3715,7 +3715,7 @@ returns [Computation result]
| FOLDL_KW
fun=non_text_value WS+
init=value WS+
- inr=value_reference WS*
+ inr=non_text_value WS*
R_PAREN
{
$result =
@@ -3737,7 +3737,7 @@ returns [Computation result]
| FOLDL_KW
fun=non_text_value WS+
init=value WS+
- inr=value_reference WS+
+ inr=non_text_value WS+
value_list WS*
R_PAREN
{
@@ -3760,7 +3760,7 @@ returns [Computation result]
| FOLDR_KW
fun=non_text_value WS+
init=value WS+
- inr=value_reference WS*
+ inr=non_text_value WS*
R_PAREN
{
$result =
@@ -3782,7 +3782,7 @@ returns [Computation result]
| FOLDR_KW
fun=non_text_value WS+
init=value WS+
- inr=value_reference WS+
+ inr=non_text_value WS+
value_list WS*
R_PAREN
{
diff --git a/src/core/src/tonkadur/wyrd/v1/compiler/util/IndexedFilterLambda.java b/src/core/src/tonkadur/wyrd/v1/compiler/util/IndexedFilterLambda.java
index 68166a8..620f06b 100644
--- a/src/core/src/tonkadur/wyrd/v1/compiler/util/IndexedFilterLambda.java
+++ b/src/core/src/tonkadur/wyrd/v1/compiler/util/IndexedFilterLambda.java
@@ -41,17 +41,20 @@ public class IndexedFilterLambda
{
final List<Instruction> result, while_body, remove_instructions;
final Register iterator, index_storage, collection_size, storage;
+ final Register index_counter;
result = new ArrayList<Instruction>();
while_body = new ArrayList<Instruction>();
remove_instructions = new ArrayList<Instruction>();
iterator = registers.reserve(Type.INT, result);
+ index_counter = registers.reserve(Type.INT, result);
index_storage = registers.reserve(Type.INT, result);
collection_size = registers.reserve(Type.INT, result);
storage = registers.reserve(Type.BOOL, result);
result.add(new SetValue(iterator.get_address(), Constant.ZERO));
+ result.add(new SetValue(index_counter.get_address(), Constant.ZERO));
result.add
(
new SetValue(collection_size.get_address(), new Size(collection))
@@ -71,7 +74,7 @@ public class IndexedFilterLambda
)
);
- extra_params.add(0, iterator.get_value());
+ extra_params.add(0, index_counter.get_value());
remove_instructions.add
(
@@ -130,6 +133,15 @@ public class IndexedFilterLambda
)
);
+ while_body.add
+ (
+ new SetValue
+ (
+ index_counter.get_address(),
+ Operation.plus(index_counter.get_value(), Constant.ONE)
+ )
+ );
+
result.add
(
While.generate
@@ -147,6 +159,7 @@ public class IndexedFilterLambda
registers.release(iterator, result);
registers.release(index_storage, result);
+ registers.release(index_counter, result);
registers.release(collection_size, result);
registers.release(storage, result);