From 34af14ca7b9889a9226f616f5c071fd393da8dab Mon Sep 17 00:00:00 2001 From: Dave Gauer Date: Mon, 14 Jun 2021 15:39:49 -0400 Subject: [PATCH] add ex090 async 7 --- build.zig | 4 +++ exercises/090_async7.zig | 43 ++++++++++++++++++++++++++++++++ patches/patches/090_async7.patch | 4 +++ 3 files changed, 51 insertions(+) create mode 100644 exercises/090_async7.zig create mode 100644 patches/patches/090_async7.patch diff --git a/build.zig b/build.zig index ac07f4b..0f9adce 100644 --- a/build.zig +++ b/build.zig @@ -438,6 +438,10 @@ const exercises = [_]Exercise{ .main_file = "089_async6.zig", .output = ".com: Example Title, .org: Example Title.", }, + .{ + .main_file = "090_async7.zig", + .output = "beef? BEEF!", + }, }; /// Check the zig version to make sure it can compile the examples properly. diff --git a/exercises/090_async7.zig b/exercises/090_async7.zig new file mode 100644 index 0000000..89113bd --- /dev/null +++ b/exercises/090_async7.zig @@ -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; +} diff --git a/patches/patches/090_async7.patch b/patches/patches/090_async7.patch new file mode 100644 index 0000000..9ef7b92 --- /dev/null +++ b/patches/patches/090_async7.patch @@ -0,0 +1,4 @@ +32c32 +< var my_beef = getBeef(0); +--- +> var my_beef = nosuspend getBeef(0);