aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--build.zig4
-rw-r--r--exercises/087_async4.zig30
-rw-r--r--patches/patches/087_async4.patch10
3 files changed, 44 insertions, 0 deletions
diff --git a/build.zig b/build.zig
index 28e4682..d8c4676 100644
--- a/build.zig
+++ b/build.zig
@@ -426,6 +426,10 @@ const exercises = [_]Exercise{
.main_file = "086_async3.zig",
.output = "5 4 3 2 1",
},
+ .{
+ .main_file = "087_async4.zig",
+ .output = "1 2 3 4 5",
+ },
};
/// Check the zig version to make sure it can compile the examples properly.
diff --git a/exercises/087_async4.zig b/exercises/087_async4.zig
new file mode 100644
index 0000000..bb9c9ec
--- /dev/null
+++ b/exercises/087_async4.zig
@@ -0,0 +1,30 @@
+//
+// It has probably not escaped your attention that we are no
+// longer capturing a return value from foo() because the 'async'
+// keyword returns the frame instead.
+//
+// One way to solve this is to use a global variable.
+//
+// See if you can make this program print "1 2 3 4 5".
+//
+const print = @import("std").debug.print;
+
+var global_counter: i32 = 0;
+
+pub fn main() void {
+ var foo_frame = async foo();
+
+ while (global_counter <= 5) {
+ print("{} ", .{global_counter});
+ ???
+ }
+
+ print("\n", .{});
+}
+
+fn foo() void {
+ while (true) {
+ ???
+ ???
+ }
+}
diff --git a/patches/patches/087_async4.patch b/patches/patches/087_async4.patch
new file mode 100644
index 0000000..9ea5012
--- /dev/null
+++ b/patches/patches/087_async4.patch
@@ -0,0 +1,10 @@
+19c19
+< ???
+---
+> resume foo_frame;
+27,28c27,28
+< ???
+< ???
+---
+> global_counter += 1;
+> suspend;