diff options
author | Dave Gauer <dave@ratfactor.com> | 2021-04-22 17:17:25 -0400 |
---|---|---|
committer | Dave Gauer <dave@ratfactor.com> | 2021-04-22 17:17:25 -0400 |
commit | 5a7c4d07793e7193911372ee34195dfc64dd7e70 (patch) | |
tree | d499e74aaa005ba5886576a8ffa78547bc27c23d /exercises/071_comptime6.zig | |
parent | 8859f7a1fe8215853b56c3db3a2d043ae860d405 (diff) | |
download | ziglings-5a7c4d07793e7193911372ee34195dfc64dd7e70.tar.gz ziglings-5a7c4d07793e7193911372ee34195dfc64dd7e70.tar.bz2 ziglings-5a7c4d07793e7193911372ee34195dfc64dd7e70.tar.xz ziglings-5a7c4d07793e7193911372ee34195dfc64dd7e70.zip |
add 071 comptime 6 inline for
Diffstat (limited to 'exercises/071_comptime6.zig')
-rw-r--r-- | exercises/071_comptime6.zig | 56 |
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", .{}); +} |