aboutsummaryrefslogtreecommitdiff
path: root/test
diff options
context:
space:
mode:
Diffstat (limited to 'test')
-rw-r--r--test/defer.tm79
-rw-r--r--test/lambdas.tm2
2 files changed, 80 insertions, 1 deletions
diff --git a/test/defer.tm b/test/defer.tm
new file mode 100644
index 00000000..8f0cb3be
--- /dev/null
+++ b/test/defer.tm
@@ -0,0 +1,79 @@
+func main()
+ x := 123
+ nums : @[Int]
+ do
+ defer
+ nums.insert(x)
+ x = 999
+
+ assert nums[] == [123]
+ assert x == 999
+
+ defer
+ say("All done!")
+
+ for word in ["first", "second", "third"]
+ defer
+ say("Got $word deferred")
+
+ if word == "second"
+ say("<skipped>")
+ skip
+ else if word == "third"
+ say("<stopped>")
+ stop
+
+ for i in 3
+ defer
+ say("Inner loop deferred $i")
+
+ if i == 2
+ say("<skipped inner>")
+ skip
+ else if i == 3
+ say("<stopped inner>")
+ stop
+
+ say("Made it through inner loop")
+
+ say("Made it through the loop")
+
+ >> thunk := func(return_early=no)
+ say("Entering thunk")
+ defer
+ say("Deferred thunk cleanup")
+
+ if return_early
+ say("Returning early...")
+ return
+
+ say("Finished thunk")
+
+ >> thunk(no)
+ >> thunk(yes)
+
+ >> defer_func(yes)
+ >> defer_func(no)
+
+ >> counter := make_counter()
+ assert counter() == 1
+ assert counter() == 2
+ assert counter() == 3
+
+func defer_func(return_early=no)
+ say("Entering defer_func")
+ defer
+ say("Deferred defer_func cleanup")
+
+ if return_early
+ say("Returning early...")
+ return
+
+ say("Finished defer_func")
+
+func make_counter(->func(->Int))
+ i := 1
+ return func()
+ defer i += 1
+ return i
+
diff --git a/test/lambdas.tm b/test/lambdas.tm
index 5508dba2..1d1b2775 100644
--- a/test/lambdas.tm
+++ b/test/lambdas.tm
@@ -31,6 +31,6 @@ func main()
fn := func()
return func()
return func()
- say("$outer")
+ defer say("$outer")
return outer
assert fn()()() == "Hello"