diff --git a/build.zig b/build.zig index fa27a1e..2cf7ba8 100644 --- a/build.zig +++ b/build.zig @@ -314,6 +314,10 @@ const exercises = [_]Exercise{ .main_file = "061_coercions.zig", .output = "Letter: A", }, + .{ + .main_file = "062_loop_expressions.zig", + .output = "Current language: Zig", + }, }; /// Check the zig version to make sure it can compile the examples properly. diff --git a/exercises/062_loop_expressions.zig b/exercises/062_loop_expressions.zig new file mode 100644 index 0000000..8161b2e --- /dev/null +++ b/exercises/062_loop_expressions.zig @@ -0,0 +1,53 @@ +// +// Remember using if/else statements as expressions like this? +// +// var foo: u8 = if (true) 5 else 0; +// +// Zig also lets you use for and while loops as expressions. +// +// Like 'return' for functions, you can return a value from a +// loop block with break: +// +// break true; // return boolean value from block +// +// But what value is returned from a loop if a break statement is +// never reached? We need a default expression. Thankfully, Zig +// loops also have 'else' clauses! As you might have guessed, the +// else clause is evaluated once a while condition becomes false +// or a for loop runs out of items. +// +// const two: u8 = while (true) break 2 else 0; // 2 +// const three: u8 = for ([1]u8{1}) |f| break 3 else 0; // 3 +// +// If you do not provide an else clause, an empty one will be +// provided for you, which will evaluate to the void type, which +// is probably not what you want. So consider the else clause +// essential when using loops as expressions. +// +// With that in mind, see if you can fix the problem with this +// program. +// +const print = @import("std").debug.print; + +pub fn main() void { + const langs: [6][]const u8 = .{ + "Erlang", + "Algol", + "C", + "OCaml", + "Zig", + "Prolog", + }; + + // Let's find the first language with a three-letter name and + // return it from the for loop. + const current_lang: ?[]const u8 = for (langs) |lang| { + if (lang.len == 3) break lang; + }; + + if (current_lang) |cl| { + print("Current language: {s}\n", .{cl}); + } else { + print("Did not find a three-letter language name. :-(\n", .{}); + } +} diff --git a/patches/patches/062_loop_expressions.patch b/patches/patches/062_loop_expressions.patch new file mode 100644 index 0000000..85b1fd2 --- /dev/null +++ b/patches/patches/062_loop_expressions.patch @@ -0,0 +1,4 @@ +46c46 +< }; +--- +> } else null;