summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--data/unit-testing/field_access.fate10
-rw-r--r--data/unit-testing/filter.fate292
-rw-r--r--data/unit-testing/fold.fate64
-rw-r--r--src/core/src/tonkadur/fate/v1/lang/instruction/IndexedFilter.java1
-rw-r--r--src/core/src/tonkadur/fate/v1/parser/FateParser.g436
-rw-r--r--src/core/src/tonkadur/wyrd/v1/compiler/util/FilterLambda.java10
-rw-r--r--src/core/src/tonkadur/wyrd/v1/compiler/util/IndexedFilterLambda.java9
7 files changed, 403 insertions, 19 deletions
diff --git a/data/unit-testing/field_access.fate b/data/unit-testing/field_access.fate
index eba657a..4f977f8 100644
--- a/data/unit-testing/field_access.fate
+++ b/data/unit-testing/field_access.fate
@@ -85,6 +85,16 @@
ts0_1.i = (var ts0_1.i)
)
+(assert
+ (=
+ (field ts0_1 i)
+ (get_field (set_fields ts1_0 (i 420)) i)
+ (get_field (field (field ts2_0 ts1) ts0) i)
+ 420
+ )
+ [FAILED] (var test_name) Test 2.
+)
+
[COMPLETED] (var test_name)
(end)
diff --git a/data/unit-testing/filter.fate b/data/unit-testing/filter.fate
new file mode 100644
index 0000000..d71b057
--- /dev/null
+++ b/data/unit-testing/filter.fate
@@ -0,0 +1,292 @@
+(fate_version 1)
+
+(global string test_name)
+
+(set test_name ( FILTER ))
+
+(global (list int) 0to10)
+(global (list int) 0to10odd)
+(global (list int) 0to10even)
+
+(set 0to10 (range 0 10 1))
+
+(set 0to10odd
+ (filter
+ (lambda ((int i) (int two) (int one)) (= (mod i two) (var one)))
+ 0to10
+ 2
+ 1
+ )
+)
+
+(local (lambda bool (int)) filter_fun)
+
+(set filter_fun (lambda ((int i)) (= (mod i 2) 0)))
+(set 0to10even
+ (filter filter_fun 0to10)
+)
+
+(assert
+ (= 0 (var 0to10even.0))
+ [FAILED] (var test_name) Failed 0to10even.0: (var 0to10even.0).
+)
+
+(assert
+ (= 1 (var 0to10odd.0))
+ [FAILED] (var test_name) Failed 0to10odd.0: (var 0to10odd.0).
+)
+
+(assert
+ (= 2 (var 0to10even.1))
+ [FAILED] (var test_name) Failed 0to10even.1: (var 0to10even.1).
+)
+
+(assert
+ (= 3 (var 0to10odd.1))
+ [FAILED] (var test_name) Failed 0to10odd.1: (var 0to10odd.1).
+)
+
+(assert
+ (= 4 (var 0to10even.2))
+ [FAILED] (var test_name) Failed 0to10even.2: (var 0to10even.2).
+)
+
+(assert
+ (= 5 (var 0to10odd.2))
+ [FAILED] (var test_name) Failed 0to10odd.2: (var 0to10odd.2).
+)
+
+(assert
+ (= 6 (var 0to10even.3))
+ [FAILED] (var test_name) Failed 0to10even.3: (var 0to10even.3).
+)
+
+(assert
+ (= 7 (var 0to10odd.3))
+ [FAILED] (var test_name) Failed 0to10odd.3: (var 0to10odd.3).
+)
+
+(assert
+ (= 8 (var 0to10even.4))
+ [FAILED] (var test_name) Failed 0to10even.4: (var 0to10even.4).
+)
+
+(assert
+ (= 9 (var 0to10odd.4))
+ [FAILED] (var test_name) Failed 0to10odd.4: (var 0to10odd.4).
+)
+
+(assert
+ (= 10 (var 0to10even.5))
+ [FAILED] (var test_name) Failed 0to10even.5: (var 0to10even.5).
+)
+
+(global (list int) 0to10odd2)
+(global (list int) 0to10even2)
+
+(set 0to10odd2 (var 0to10))
+(set 0to10even2 (var 0to10))
+
+(filter!
+ (lambda ((int i) (int two) (int one)) (= (mod i two) (var one)))
+ 0to10odd2
+ 2
+ 1
+)
+
+(filter! filter_fun 0to10even2)
+
+(assert
+ (= 0 (var 0to10even2.0))
+ [FAILED] (var test_name) Failed 0to10even2.0: (var 0to10even2.0).
+)
+
+(assert
+ (= 1 (var 0to10odd2.0))
+ [FAILED] (var test_name) Failed 0to10odd2.0: (var 0to10odd2.0).
+)
+
+(assert
+ (= 2 (var 0to10even2.1))
+ [FAILED] (var test_name) Failed 0to10even2.1: (var 0to10even2.1).
+)
+
+(assert
+ (= 3 (var 0to10odd2.1))
+ [FAILED] (var test_name) Failed 0to10odd2.1: (var 0to10odd2.1).
+)
+
+(assert
+ (= 4 (var 0to10even2.2))
+ [FAILED] (var test_name) Failed 0to10even2.2: (var 0to10even2.2).
+)
+
+(assert
+ (= 5 (var 0to10odd2.2))
+ [FAILED] (var test_name) Failed 0to10odd2.2: (var 0to10odd2.2).
+)
+
+(assert
+ (= 6 (var 0to10even2.3))
+ [FAILED] (var test_name) Failed 0to10even2.3: (var 0to10even2.3).
+)
+
+(assert
+ (= 7 (var 0to10odd2.3))
+ [FAILED] (var test_name) Failed 0to10odd2.3: (var 0to10odd2.3).
+)
+
+(assert
+ (= 8 (var 0to10even2.4))
+ [FAILED] (var test_name) Failed 0to10even2.4: (var 0to10even2.4).
+)
+
+(assert
+ (= 9 (var 0to10odd2.4))
+ [FAILED] (var test_name) Failed 0to10odd2.4: (var 0to10odd2.4).
+)
+
+(assert
+ (= 10 (var 0to10even2.5))
+ [FAILED] (var test_name) Failed 0to10even2.5: (var 0to10even2.5).
+)
+
+(set 0to10odd
+ (indexed_filter
+ (lambda ((int ix) (int i) (int two) (int one)) (= (mod i two) (var one)))
+ 0to10
+ 2
+ 1
+ )
+)
+
+(local (lambda bool (int int)) indexed_filter_fun)
+
+(set indexed_filter_fun (lambda ((int ix) (int i)) (= (mod i 2) 0)))
+(set 0to10even (indexed_filter indexed_filter_fun 0to10))
+
+(assert
+ (= 0 (var 0to10even.0))
+ [FAILED] (var test_name) Failed indexed 0to10even.0: (var 0to10even.0).
+)
+
+(assert
+ (= 1 (var 0to10odd.0))
+ [FAILED] (var test_name) Failed indexed 0to10odd.0: (var 0to10odd.0).
+)
+
+(assert
+ (= 2 (var 0to10even.1))
+ [FAILED] (var test_name) Failed indexed 0to10even.1: (var 0to10even.1).
+)
+
+(assert
+ (= 3 (var 0to10odd.1))
+ [FAILED] (var test_name) Failed indexed 0to10odd.1: (var 0to10odd.1).
+)
+
+(assert
+ (= 4 (var 0to10even.2))
+ [FAILED] (var test_name) Failed indexed 0to10even.2: (var 0to10even.2).
+)
+
+(assert
+ (= 5 (var 0to10odd.2))
+ [FAILED] (var test_name) Failed indexed 0to10odd.2: (var 0to10odd.2).
+)
+
+(assert
+ (= 6 (var 0to10even.3))
+ [FAILED] (var test_name) Failed indexed 0to10even.3: (var 0to10even.3).
+)
+
+(assert
+ (= 7 (var 0to10odd.3))
+ [FAILED] (var test_name) Failed indexed 0to10odd.3: (var 0to10odd.3).
+)
+
+(assert
+ (= 8 (var 0to10even.4))
+ [FAILED] (var test_name) Failed indexed 0to10even.4: (var 0to10even.4).
+)
+
+(assert
+ (= 9 (var 0to10odd.4))
+ [FAILED] (var test_name) Failed indexed 0to10odd.4: (var 0to10odd.4).
+)
+
+(assert
+ (= 10 (var 0to10even.5))
+ [FAILED] (var test_name) Failed indexed 0to10even.5: (var 0to10even.5).
+)
+
+(set 0to10odd2 (var 0to10))
+(set 0to10even2 (var 0to10))
+
+(indexed_filter!
+ (lambda ((int ix) (int i) (int two) (int one)) (= (mod i two) (var one)))
+ 0to10odd2
+ 2
+ 1
+)
+
+(indexed_filter! indexed_filter_fun 0to10even2)
+
+(assert
+ (= 0 (var 0to10even2.0))
+ [FAILED] (var test_name) Failed indexed 0to10even2.0: (var 0to10even2.0).
+)
+
+(assert
+ (= 1 (var 0to10odd2.0))
+ [FAILED] (var test_name) Failed indexed 0to10odd2.0: (var 0to10odd2.0).
+)
+
+(assert
+ (= 2 (var 0to10even2.1))
+ [FAILED] (var test_name) Failed indexed 0to10even2.1: (var 0to10even2.1).
+)
+
+(assert
+ (= 3 (var 0to10odd2.1))
+ [FAILED] (var test_name) Failed indexed 0to10odd2.1: (var 0to10odd2.1).
+)
+
+(assert
+ (= 4 (var 0to10even2.2))
+ [FAILED] (var test_name) Failed indexed 0to10even2.2: (var 0to10even2.2).
+)
+
+(assert
+ (= 5 (var 0to10odd2.2))
+ [FAILED] (var test_name) Failed indexed 0to10odd2.2: (var 0to10odd2.2).
+)
+
+(assert
+ (= 6 (var 0to10even2.3))
+ [FAILED] (var test_name) Failed indexed 0to10even2.3: (var 0to10even2.3).
+)
+
+(assert
+ (= 7 (var 0to10odd2.3))
+ [FAILED] (var test_name) Failed indexed 0to10odd2.3: (var 0to10odd2.3).
+)
+
+(assert
+ (= 8 (var 0to10even2.4))
+ [FAILED] (var test_name) Failed indexed 0to10even2.4: (var 0to10even2.4).
+)
+
+(assert
+ (= 9 (var 0to10odd2.4))
+ [FAILED] (var test_name) Failed indexed 0to10odd2.4: (var 0to10odd2.4).
+)
+
+(assert
+ (= 10 (var 0to10even2.5))
+ [FAILED] (var test_name) Failed indexed 0to10even2.5: (var 0to10even2.5).
+)
+
+[COMPLETED] (var test_name)
+
+(end)
diff --git a/data/unit-testing/fold.fate b/data/unit-testing/fold.fate
new file mode 100644
index 0000000..526cbe4
--- /dev/null
+++ b/data/unit-testing/fold.fate
@@ -0,0 +1,64 @@
+(fate_version 1)
+
+(global string test_name)
+
+(set test_name ( FILTER ))
+
+(global (list int) 0to10)
+
+(set 0to10 (range 0 10 1))
+
+(assert
+ (= 55
+ (foldl
+ (lambda ((int res) (int e)) (+ res e))
+ 0
+ 0to10
+ )
+ (foldr
+ (lambda ((int res) (int e)) (+ res e))
+ 0
+ 0to10
+ )
+ )
+ [FAILED] (var test_name) Failed sum.
+ (newline)
+ foldl yielded:
+ (foldl
+ (lambda ((int res) (int e)) (+ res e))
+ 0
+ 0to10
+ )
+ (newline)
+ foldr yielded:
+ (foldr
+ (lambda ((int res) (int e)) (+ res e))
+ 0
+ 0to10
+ )
+)
+
+(global (list string) ls)
+
+(local int i)
+(for (set i 0) (=< i 10) (set i (+ i 1))
+ (add! (cast string (var i)) ls)
+)
+
+foldl:
+(foldl
+ (lambda ((text res) (string e)) (text (var res) (var e)))
+ (default text)
+ ls
+)
+(newline)
+foldr:
+(foldr
+ (lambda ((text res) (string e)) (text (var res) (var e)))
+ (default text)
+ ls
+)
+
+[COMPLETED] (var test_name)
+
+(end)
diff --git a/src/core/src/tonkadur/fate/v1/lang/instruction/IndexedFilter.java b/src/core/src/tonkadur/fate/v1/lang/instruction/IndexedFilter.java
index e05b162..6e3da57 100644
--- a/src/core/src/tonkadur/fate/v1/lang/instruction/IndexedFilter.java
+++ b/src/core/src/tonkadur/fate/v1/lang/instruction/IndexedFilter.java
@@ -74,6 +74,7 @@ public class IndexedFilter extends Instruction
{
target_signature.add(c.get_type());
}
+
RecurrentChecks.assert_lambda_matches_types
(
lambda_function,
diff --git a/src/core/src/tonkadur/fate/v1/parser/FateParser.g4 b/src/core/src/tonkadur/fate/v1/parser/FateParser.g4
index 88601f5..62f5e4b 100644
--- a/src/core/src/tonkadur/fate/v1/parser/FateParser.g4
+++ b/src/core/src/tonkadur/fate/v1/parser/FateParser.g4
@@ -4648,6 +4648,42 @@ returns [Computation result]
);
}
+ | INDEXED_FILTER_KW fun=non_text_value WS+ coll=non_text_value WS* R_PAREN
+ {
+ $result =
+ IndexedFilterComputation.build
+ (
+ CONTEXT.get_origin_at
+ (
+ ($INDEXED_FILTER_KW.getLine()),
+ ($INDEXED_FILTER_KW.getCharPositionInLine())
+ ),
+ ($fun.result),
+ ($coll.result),
+ new ArrayList()
+ );
+ }
+
+ | INDEXED_FILTER_KW
+ fun=non_text_value WS+
+ coll=non_text_value WS+
+ value_list WS*
+ R_PAREN
+ {
+ $result =
+ IndexedFilterComputation.build
+ (
+ CONTEXT.get_origin_at
+ (
+ ($INDEXED_FILTER_KW.getLine()),
+ ($INDEXED_FILTER_KW.getCharPositionInLine())
+ ),
+ ($fun.result),
+ ($coll.result),
+ ($value_list.result)
+ );
+ }
+
| PARTITION_KW fun=non_text_value WS+ coll=non_text_value WS* R_PAREN
{
$result =
diff --git a/src/core/src/tonkadur/wyrd/v1/compiler/util/FilterLambda.java b/src/core/src/tonkadur/wyrd/v1/compiler/util/FilterLambda.java
index 83c947f..6617688 100644
--- a/src/core/src/tonkadur/wyrd/v1/compiler/util/FilterLambda.java
+++ b/src/core/src/tonkadur/wyrd/v1/compiler/util/FilterLambda.java
@@ -29,7 +29,6 @@ public class FilterLambda
/* Utility Class */
private FilterLambda () {}
- /* Uses Durstenfeld's shuffling algorithm */
public static Instruction generate
(
final RegisterManager registers,
@@ -128,15 +127,6 @@ public class FilterLambda
)
);
- while_body.add
- (
- new SetValue
- (
- iterator.get_address(),
- Operation.plus(iterator.get_value(), Constant.ONE)
- )
- );
-
result.add
(
While.generate
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 29f08d4..68166a8 100644
--- a/src/core/src/tonkadur/wyrd/v1/compiler/util/IndexedFilterLambda.java
+++ b/src/core/src/tonkadur/wyrd/v1/compiler/util/IndexedFilterLambda.java
@@ -130,15 +130,6 @@ public class IndexedFilterLambda
)
);
- while_body.add
- (
- new SetValue
- (
- iterator.get_address(),
- Operation.plus(iterator.get_value(), Constant.ONE)
- )
- );
-
result.add
(
While.generate