summaryrefslogtreecommitdiffstatshomepage
path: root/exercises/071_comptime6.zig
diff options
context:
space:
mode:
authorDave Gauer <dave@ratfactor.com>2021-04-22 17:17:25 -0400
committerDave Gauer <dave@ratfactor.com>2021-04-22 17:17:25 -0400
commitea17a9c8cb1db6f828ae187053c799bf3cdefd4b (patch)
treed499e74aaa005ba5886576a8ffa78547bc27c23d /exercises/071_comptime6.zig
parent647f46194370eaef3f51aa4cbd38bbd57c33d79f (diff)
add 071 comptime 6 inline for
Diffstat (limited to 'exercises/071_comptime6.zig')
-rw-r--r--exercises/071_comptime6.zig56
1 files changed, 56 insertions, 0 deletions
diff --git a/exercises/071_comptime6.zig b/exercises/071_comptime6.zig
new file mode 100644
index 0000000..2efba2b
--- /dev/null
+++ b/exercises/071_comptime6.zig
@@ -0,0 +1,56 @@
+//
+// There have been several instances where it would have been
+// nice to use loops in our programs, but we couldn't because the
+// things we were trying to do could only be done at compile
+// time. We ended up having to do those things MANUALLY, like
+// NORMAL people. Bah! We are PROGRAMMERS! The computer should be
+// doing this work.
+//
+// An 'inline for' is performed at compile time, allowing you to
+// programatically loop through a series of items in situations
+// like those mentioned above where a regular runtime 'for' loop
+// wouldn't be allowed:
+//
+// inline for (.{ u8, u16, u32, u64 }) |T| {
+// print("{} ", .{@typeInfo(T).Int.bits});
+// }
+//
+// In the above example, we're looping over a list of types,
+// which are available only at compile time.
+//
+const print = @import("std").debug.print;
+
+// Remember Narcissus from exercise 065 where we used builtins
+// for reflection? He's back and loving it.
+const Narcissus = struct {
+ me: *Narcissus = undefined,
+ myself: *Narcissus = undefined,
+ echo: void = undefined,
+};
+
+pub fn main() void {
+ var narcissus: Narcissus = Narcissus {};
+
+ print("Narcissus has room in his heart for:", .{});
+
+ // Last time we examined the Narcissus struct, we had to
+ // manually access each of the three fields. Our 'if'
+ // statement was repeated three times almost verbatim. Yuck!
+ //
+ // Please use an 'inline for' to implement the block below
+ // for each field in the slice 'fields'!
+
+ const fields = @typeInfo(Narcissus).Struct.fields;
+
+ ??? {
+ if (field.field_type != void) {
+ print(" {s}", .{field.name});
+ }
+ }
+
+ // Once you've got that, go back and take a look at exercise
+ // 065 and compare what you've written to the abomination we
+ // had there!
+
+ print(".\n", .{});
+}