Browse Source

added ex062 loop expressions

Dave Gauer 4 years ago
parent
commit
e608e41cc7
3 changed files with 61 additions and 0 deletions
  1. 4 0
      build.zig
  2. 53 0
      exercises/062_loop_expressions.zig
  3. 4 0
      patches/patches/062_loop_expressions.patch

+ 4 - 0
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.

+ 53 - 0
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", .{});
+    }
+}

+ 4 - 0
patches/patches/062_loop_expressions.patch

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