mirror of
https://codeberg.org/andyscott/ziglings.git
synced 2024-12-22 14:03:10 -05:00
add 071 comptime 6 inline for
This commit is contained in:
parent
647f461943
commit
ea17a9c8cb
5 changed files with 69 additions and 1 deletions
4
TEMP_TODO
Normal file
4
TEMP_TODO
Normal file
|
@ -0,0 +1,4 @@
|
|||
071 - inline for - loop through struct fields
|
||||
072 - inline while (see lib/std/fmt.zig)
|
||||
073 - comptime block
|
||||
074 - quiz 8 - revisit 058_quiz7 and make those connections programatically?
|
|
@ -353,6 +353,10 @@ const exercises = [_]Exercise{
|
|||
.output = "\"Quack.\" ducky1: true, \"Squeek!\" ducky2: true, ducky3: false",
|
||||
.hint = "Have you kept the wizard hat on?",
|
||||
},
|
||||
.{
|
||||
.main_file = "071_comptime6.zig",
|
||||
.output = "Narcissus has room in his heart for: me myself.",
|
||||
},
|
||||
};
|
||||
|
||||
/// Check the zig version to make sure it can compile the examples properly.
|
||||
|
|
|
@ -90,7 +90,7 @@ pub fn main() void {
|
|||
// A StructFields array
|
||||
const fields = @typeInfo(Narcissus).Struct.fields;
|
||||
|
||||
// 'fields' is an array of StructFields. Here's the declaration:
|
||||
// 'fields' is a slice of StructFields. Here's the declaration:
|
||||
//
|
||||
// pub const StructField = struct {
|
||||
// name: []const u8,
|
||||
|
|
56
exercises/071_comptime6.zig
Normal file
56
exercises/071_comptime6.zig
Normal file
|
@ -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", .{});
|
||||
}
|
4
patches/patches/071_comptime6.patch
Normal file
4
patches/patches/071_comptime6.patch
Normal file
|
@ -0,0 +1,4 @@
|
|||
45c45
|
||||
< ??? {
|
||||
---
|
||||
> inline for (fields) |field| {
|
Loading…
Reference in a new issue