ziglings/exercises/072_comptime7.zig

67 lines
2.4 KiB
Zig
Raw Permalink Normal View History

2021-04-24 14:34:46 -04:00
//
// There is also an 'inline while'. Just like 'inline for', it
2023-05-07 03:38:28 -04:00
// loops at compile time, allowing you to do all sorts of
2021-04-24 14:34:46 -04:00
// interesting things not possible at runtime. See if you can
// figure out what this rather bonkers example prints:
//
// const foo = [3]*const [5]u8{ "~{s}~", "<{s}>", "d{s}b" };
// comptime var i = 0;
//
// inline while ( i < foo.len ) : (i += 1) {
// print(foo[i] ++ "\n", .{foo[i]});
// }
//
// You haven't taken off that wizard hat yet, have you?
//
const print = @import("std").debug.print;
pub fn main() void {
// Here is a string containing a series of arithmetic
// operations and single-digit decimal values. Let's call
// each operation and digit pair an "instruction".
const instructions = "+3 *5 -2 *2";
// Here is a u32 variable that will keep track of our current
// value in the program at runtime. It starts at 0, and we
// will get the final value by performing the sequence of
// instructions above.
var value: u32 = 0;
// This "index" variable will only be used at compile time in
// our loop.
comptime var i = 0;
// Here we wish to loop over each "instruction" in the string
// at compile time.
//
// Please fix this to loop once per "instruction":
2024-06-07 07:10:44 -04:00
inline while (i < instructions.len) : (i += 3) {
2021-04-24 14:34:46 -04:00
// This gets the digit from the "instruction". Can you
// figure out why we subtract '0' from it?
const digit = instructions[i + 1] - '0';
2021-04-24 14:34:46 -04:00
// This 'switch' statement contains the actual work done
// at runtime. At first, this doesn't seem exciting...
switch (instructions[i]) {
'+' => value += digit,
'-' => value -= digit,
'*' => value *= digit,
else => unreachable,
}
2021-11-05 11:44:29 -04:00
// ...But it's quite a bit more exciting than it first appears.
2021-04-24 14:34:46 -04:00
// The 'inline while' no longer exists at runtime and neither
2021-04-26 20:34:41 -04:00
// does anything else not touched directly by runtime
2021-04-24 14:34:46 -04:00
// code. The 'instructions' string, for example, does not
// appear anywhere in the compiled program because it's
// not used by it!
//
// So in a very real sense, this loop actually converts
// the instructions contained in a string into runtime
// code at compile time. Guess we're compiler writers
// now. See? The wizard hat was justified after all.
}
2021-11-05 11:44:29 -04:00
2021-04-24 14:34:46 -04:00
print("{}\n", .{value});
}