57 lines
1.8 KiB
Zig
57 lines
1.8 KiB
Zig
//
|
|
// 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 when: 1) a 'while' condition becomes
|
|
// false or 2) 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.
|
|
//
|
|
// const four: u8 = while (true) {
|
|
// break 4;
|
|
// }; // <-- ERROR! Implicit 'else void' here!
|
|
//
|
|
// 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", .{});
|
|
}
|
|
}
|