added ex062 loop expressions

This commit is contained in:
Dave Gauer 2021-04-09 19:24:59 -04:00
parent 0d7c14a4b0
commit e416e85143
3 changed files with 61 additions and 0 deletions

View File

@ -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.

View File

@ -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", .{});
}
}

View File

@ -0,0 +1,4 @@
46c46
< };
---
> } else null;