|
@@ -0,0 +1,43 @@
|
|
|
+//
|
|
|
+// Remember how a function with 'suspend' is async and calling an
|
|
|
+// async function without the 'async' keyword makes the CALLING
|
|
|
+// function async?
|
|
|
+//
|
|
|
+// fn fooThatMightSuspend(maybe: bool) void {
|
|
|
+// if (maybe) suspend {}
|
|
|
+// }
|
|
|
+//
|
|
|
+// fn bar() void {
|
|
|
+// fooThatMightSuspend(true); // Now bar() is async!
|
|
|
+// }
|
|
|
+//
|
|
|
+// But if you KNOW the function won't suspend, you can make a
|
|
|
+// promise to the compiler with the 'nosuspend' keyword:
|
|
|
+//
|
|
|
+// fn bar() void {
|
|
|
+// nosuspend fooThatMightSuspend(false);
|
|
|
+// }
|
|
|
+//
|
|
|
+// If the function does suspend and YOUR PROMISE TO THE COMPILER
|
|
|
+// IS BROKEN, the program will panic at runtime, which is
|
|
|
+// probably better than you deserve, you oathbreaker! >:-(
|
|
|
+//
|
|
|
+const print = @import("std").debug.print;
|
|
|
+
|
|
|
+pub fn main() void {
|
|
|
+
|
|
|
+ // The main() function can not be async. But we know
|
|
|
+ // getBeef() will not suspend with this particular
|
|
|
+ // invocation. Please make this okay:
|
|
|
+ var my_beef = getBeef(0);
|
|
|
+
|
|
|
+ print("beef? {X}!\n", .{my_beef});
|
|
|
+}
|
|
|
+
|
|
|
+fn getBeef(input: u32) u32 {
|
|
|
+ if (input > 0xDEAD) {
|
|
|
+ suspend {}
|
|
|
+ }
|
|
|
+
|
|
|
+ return 0xBEEF;
|
|
|
+}
|