aboutsummaryrefslogtreecommitdiff
path: root/35_enums.zig
diff options
context:
space:
mode:
authorDave Gauer <dave@ratfactor.com>2021-02-06 09:29:49 -0500
committerDave Gauer <dave@ratfactor.com>2021-02-06 09:29:49 -0500
commit2cded107cd75a4024d9d0f76055ef48432301fad (patch)
tree3c0b1240e15a60e80d1d3e0d574f06cdfd12b6d6 /35_enums.zig
parent738a9f6cda62f3570e44dc93f8e200afc2cc1b51 (diff)
downloadziglings-2cded107cd75a4024d9d0f76055ef48432301fad.tar.gz
ziglings-2cded107cd75a4024d9d0f76055ef48432301fad.tar.bz2
ziglings-2cded107cd75a4024d9d0f76055ef48432301fad.tar.xz
ziglings-2cded107cd75a4024d9d0f76055ef48432301fad.zip
Add ex 35,36 enums; updated README
I'm changing the order of some more topics. Trying to explain the value of pointers when we're mostly dealing with stack-sized values like integers feels convoluted. So I'm starting with enums (which also has a nice segue from an earlier "switch" exercise). Then structs. Then unions (just in keeping with the order of these items on ziglearn.org) and THEN pointers and multi-pointers and slices.
Diffstat (limited to '35_enums.zig')
-rw-r--r--35_enums.zig49
1 files changed, 49 insertions, 0 deletions
diff --git a/35_enums.zig b/35_enums.zig
new file mode 100644
index 0000000..cf455a4
--- /dev/null
+++ b/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", .{});
+}