mirror of
https://codeberg.org/ziglings/exercises.git
synced 2024-12-27 01:46:29 +00:00
add ex074 comptime 9
This commit is contained in:
parent
f3cf67cd65
commit
060e2b9789
2 changed files with 66 additions and 0 deletions
62
exercises/074_comptime9.zig
Normal file
62
exercises/074_comptime9.zig
Normal file
|
@ -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.
|
4
patches/patches/074_comptime9.patch
Normal file
4
patches/patches/074_comptime9.patch
Normal file
|
@ -0,0 +1,4 @@
|
||||||
|
42c42
|
||||||
|
< fn makeLlamas(count: usize) [count]u8 {
|
||||||
|
---
|
||||||
|
> fn makeLlamas(comptime count: usize) [count]u8 {
|
Loading…
Reference in a new issue