aboutsummaryrefslogtreecommitdiff
path: root/exercises
diff options
context:
space:
mode:
authorDave Gauer <dave@ratfactor.com>2021-04-30 20:25:59 -0400
committerDave Gauer <dave@ratfactor.com>2021-04-30 20:25:59 -0400
commit14480323a67c8c46b875761737df8fe652aa5464 (patch)
tree2e13f7483761531095f83777e3cbb5ff5684be86 /exercises
parent1bedf452946a4efb74ab83060aa534fc37f11803 (diff)
downloadziglings-14480323a67c8c46b875761737df8fe652aa5464.tar.gz
ziglings-14480323a67c8c46b875761737df8fe652aa5464.tar.bz2
ziglings-14480323a67c8c46b875761737df8fe652aa5464.tar.xz
ziglings-14480323a67c8c46b875761737df8fe652aa5464.zip
add ex074 comptime 9
Diffstat (limited to 'exercises')
-rw-r--r--exercises/074_comptime9.zig62
1 files changed, 62 insertions, 0 deletions
diff --git a/exercises/074_comptime9.zig b/exercises/074_comptime9.zig
new file mode 100644
index 0000000..b644536
--- /dev/null
+++ b/exercises/074_comptime9.zig
@@ -0,0 +1,62 @@
+//
+// In addition to knowing when to use the 'comptime' keyword,
+// it's also good to know when you DON'T need it.
+//
+// The following contexts are already IMPLICITLY evaluated at
+// compile time, and adding the 'comptime' keyword would be
+// superfluous, redundant, and smelly:
+//
+// * The global scope (outside of any function in a source file)
+// * Type declarations of:
+// * Variables
+// * Functions (types of parameters and return values)
+// * Structs
+// * Unions
+// * Enums
+// * The test expressions in inline for and while loops
+// * An expression passed to the @cImport() builtin
+//
+// Work with Zig for a while, and you'll start to develop and
+// intuition for these contexts. Let's work on that/ now.
+//
+// You have been given just one 'comptime' statement to use in
+// the program below. Here it is:
+//
+// comptime
+//
+// Just one is all it takes. Use it wisely!
+//
+const print = @import("std").debug.print;
+
+// Being in the global scope, everything about this value is
+// implicitly required to be known compile time.
+const llama_count = 5;
+
+// Again, this value's type and size must be known at compile
+// time, but we're letting the compiler infer both from the
+// return type of a function.
+const llamas = makeLlamas(llama_count);
+
+// And here's the function. Note that the return value type
+// depends on one of the input arguments!
+fn makeLlamas(count: usize) [count]u8 {
+ var temp: [count]u8 = undefined;
+ var i = 0;
+
+ // Note that this does NOT need to be an inline 'while'.
+ while (i < count) : (i += 1) {
+ temp[i] = i;
+ }
+
+ return temp;
+}
+
+pub fn main() void {
+ print("My llama value is {}.\n", .{llamas[2]});
+}
+//
+// The lesson here is to not pepper your program with 'comptime'
+// keywords unless you need them. Between the implicit compile
+// time contexts and Zig's aggressive evaluation of any
+// expression it can figure out at compile time, it's sometimes
+// surprising how few places actually need the keyword.