mirror of
				https://codeberg.org/ziglings/exercises.git
				synced 2025-11-03 20:25:37 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			63 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			Zig
		
	
	
	
	
	
			
		
		
	
	
			63 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			Zig
		
	
	
	
	
	
//
 | 
						|
// 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 container-level 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 an
 | 
						|
// 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 container-level 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.
 |