Dave Gauer 4 лет назад
Родитель
Сommit
3e5647d88c
3 измененных файлов с 42 добавлено и 0 удалено
  1. 4 0
      build.zig
  2. 29 0
      exercises/086_async3.zig
  3. 9 0
      patches/patches/086_async3.patch

+ 4 - 0
build.zig

@@ -422,6 +422,10 @@ const exercises = [_]Exercise{
         .main_file = "085_async2.zig",
         .main_file = "085_async2.zig",
         .output = "Hello async!",
         .output = "Hello async!",
     },
     },
+    .{
+        .main_file = "086_async3.zig",
+        .output = "5 4 3 2 1",
+    },
 };
 };
 
 
 /// Check the zig version to make sure it can compile the examples properly.
 /// Check the zig version to make sure it can compile the examples properly.

+ 29 - 0
exercises/086_async3.zig

@@ -0,0 +1,29 @@
+//
+// Because they can suspend and resume, async Zig functions are
+// an example of a more general programming concept called
+// "coroutines". One of the neat things about Zig async functions
+// is that they retain their state as they are suspended and
+// resumed.
+//
+// See if you can make this program print "5 4 3 2 1".
+//
+const print = @import("std").debug.print;
+
+pub fn main() void {
+    const n = 5;
+    var foo_frame = async foo(n);
+
+    ???
+
+    print("\n", .{});
+}
+
+fn foo(countdown: u32) void {
+    var current = countdown;
+
+    while (current > 0) {
+        print("{} ", .{current});
+        current -= 1;
+        suspend;
+    }
+}

+ 9 - 0
patches/patches/086_async3.patch

@@ -0,0 +1,9 @@
+16c16,21
+<     ???
+---
+>     // Silly solution. You can also use a loop.
+>     resume foo_frame;
+>     resume foo_frame;
+>     resume foo_frame;
+>     resume foo_frame;
+>     resume foo_frame;