mirror of
				https://codeberg.org/ziglings/exercises.git
				synced 2025-11-04 04:35:38 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			58 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			Zig
		
	
	
	
	
	
			
		
		
	
	
			58 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", .{});
 | 
						|
    }
 | 
						|
}
 |