aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/lib.rs62
-rw-r--r--tests/fun.tdy67
2 files changed, 61 insertions, 68 deletions
diff --git a/src/lib.rs b/src/lib.rs
index 971e42c..82905de 100644
--- a/src/lib.rs
+++ b/src/lib.rs
@@ -164,7 +164,67 @@ mod tests {
res <=> 1",
);
+ test_multiple!(
+ fun,
+ simplest: "f := fn {}
+ f()",
+ param_1: "f := fn a: int {}
+ f(1)",
+ return_1: "f := fn -> int {
+ ret 1
+ }
+ f() <=> 1",
+ param_and_return: "f := fn a: int -> int {
+ ret a * 2
+ }
+ f(1) <=> 2
+ f(5) <=> 10",
+ param_2: "add := fn a: int, b: int -> int {
+ ret a + b
+ }
+ add(1, 1) <=> 2
+ add(10, 20) <=> 30",
+ calls_inside_calls: "one := fn -> int {
+ ret 1
+ }
+ add := fn a: int, b: int -> int {
+ ret a + b
+ }
+ add(one(), one()) <=> 2
+ add(add(one(), one()), one()) <=> 3
+ add(one(), add(one(), one())) <=> 3",
+ passing_functions: "g := fn -> int {
+ ret 1
+ }
+ f := fn inner: fn -> int -> int {
+ ret inner()
+ }
+ f(g) <=> 1",
+ passing_functions_mixed: "g := fn a: int -> int {
+ ret a * 2
+ }
+ f := fn inner: fn int -> int, a: int -> int {
+ ret inner(a)
+ }
+ f(g, 2) <=> 4",
+ multiple_returns: "f := fn a: int -> int {
+ if a == 1 {
+ ret 2
+ } else {
+ ret 3
+ }
+ }
+ f(0) <=> 3
+ f(1) <=> 2
+ f(2) <=> 3",
+ precedence: "f := fn a: int, b: int -> int {
+ ret a + b
+ }
+ 1 + f(2, 3) <=> 6
+ 2 * f(2, 3) <=> 10
+ f(2, 3) - (2 + 3) <=> 0"
+ );
+
test_file!(scoping, "tests/scoping.tdy");
test_file!(for_, "tests/for.tdy");
- test_file!(fun, "tests/fun.tdy");
}
diff --git a/tests/fun.tdy b/tests/fun.tdy
deleted file mode 100644
index 2a7600d..0000000
--- a/tests/fun.tdy
+++ /dev/null
@@ -1,67 +0,0 @@
-// Simplest
-f := fn {}
-f()
-
-// Simple param
-f2 := fn a: int {}
-f2(1)
-
-// Return value
-f3 := fn -> int {
- ret 3
-}
-f3() <=> 3
-
-// Combined
-f4 := fn a: int -> int {
- ret a + a
-}
-f4(2) <=> 4
-
-// Multiple arguments
-adder := fn a: int, b: int -> int {
- ret a + b
-}
-adder(1, 2) <=> 3
-
-// calls inside calls
-adder(f3(), f3() + 1) <=> 7
-
-// Passing functions
-h := fn -> int {
- ret 1
-}
-g := fn f: fn -> int -> int{
- ret f()
-}
-g(h) <=> 1
-
-// multiple returns
-q := fn i: int -> int {
- if i == 1 {
- ret 2
- } else {
- ret 3
- }
-}
-q(1) <=> 2
-q(0) <=> 3
-
-// mixing function and value types
-f5 := fn a: fn -> int, b: int -> int {
- ret a() + b
-}
-f5_inner := fn -> int {
- ret 1
-}
-f5(f5_inner, 2) <=> 3
-
-// factorial := fn n: int -> int {
-// if n <= 1 {
-// ret 1
-// }
-// ret n * factorial(n - 1)
-// }
-// factorial(5) <=> 120
-// factorial(6) <=> 720
-// factorial(12) <=> 479001600