aboutsummaryrefslogtreecommitdiff
path: root/exercises/35_enums.zig
diff options
context:
space:
mode:
Diffstat (limited to 'exercises/35_enums.zig')
-rw-r--r--exercises/35_enums.zig49
1 files changed, 49 insertions, 0 deletions
diff --git a/exercises/35_enums.zig b/exercises/35_enums.zig
new file mode 100644
index 0000000..cf455a4
--- /dev/null
+++ b/exercises/35_enums.zig
@@ -0,0 +1,49 @@
+//
+// Remember that little mathematical virtual machine we made using the
+// "unreachable" statement? Well, there were two problems with the
+// way we were using op codes:
+//
+// 1. Having to remember op codes by number is no good.
+// 2. We had to use "unreachable" because Zig had no way of knowing
+// how many valid op codes there were.
+//
+// An "enum" is a Zig construct that lets you give names to numeric
+// values and store them in a set. They look a lot like error sets:
+//
+// const Fruit = enum{ apple, pear, orange };
+//
+// const my_fruit = Fruit.apple;
+//
+// Let's use an enum in place of the numbers we were using in the
+// previous version!
+//
+const std = @import("std");
+
+// Please complete the enum!
+const Ops = enum{ ??? };
+
+pub fn main() void {
+ const operations = [_]Ops{
+ Ops.inc,
+ Ops.inc,
+ Ops.inc,
+ Ops.pow,
+ Ops.dec,
+ Ops.dec
+ };
+
+ var current_value: u32 = 0;
+
+ for (operations) |op| {
+ switch (op) {
+ Ops.inc => { current_value += 1; },
+ Ops.dec => { current_value -= 1; },
+ Ops.pow => { current_value *= current_value; },
+ // No "else" needed! Why is that?
+ }
+
+ std.debug.print("{} ", .{current_value});
+ }
+
+ std.debug.print("\n", .{});
+}