Zig NEWS

Discussion on: Cool Zig Patterns - Paths in Build Scripts

Collapse
 
eliax1996 profile image
Elia Migliore • Edited

I'm new to the zig language so my knowledge isn't huge. But I see a lot the pattern of returning something at comptime using the break keyword + a label + a return object.

Wouldn't be in this case more readable writing something like:

fn sdkPath(comptime suffix: []const u8) []const u8 {
    if (suffix[0] != '/') @compileError("relToPath requires an absolute path!");
    return comptime {
        const root_dir = std.fs.path.dirname(@src().file) orelse ".";
        return root_dir ++ suffix;
    };
}
Enter fullscreen mode Exit fullscreen mode

Edit: TIL, Isn't duable, was working only because the return was referring to the function. The only way to return a value from a block is by labeling it and using the break syntax, doc. I think that the only way to get rid of the break labeled if we want is to do something like that:

fn concatenate(comptime suffix: []const u8) []const u8 {
    const root_dir = std.fs.path.dirname(@src().file) orelse ".";
    return root_dir ++ suffix;
}

fn sdkPath(comptime suffix: []const u8) []const u8 {
    if (suffix[0] != '/') @compileError("relToPath requires an absolute path!");
    const my_val = comptime concatenate(suffix);
    return my_val;
}
Enter fullscreen mode Exit fullscreen mode
Collapse
 
xq profile image
Felix "xq" Queißner

Yeah, it's not the only way, but the one i came up with. I guess we can return from comptime blocks, but i honestly never tried to do so, because it kinda means i'm returning at comptime.

Your second solution requires a second function to be put into the scope which is something i want to avoid, as sdkPath isn't portable between files.

Collapse
 
eliax1996 profile image
Elia Migliore

Wdym with “isn’t portable between files“?

Thread Thread
 
xq profile image
Felix "xq" Queißner

It will always return paths to the file the function is contained in. Calling it from another file will then return a path relativ to the imported file, wherever it may be

Thread Thread
 
eliax1996 profile image
Elia Migliore

Ok that’s clear, but I do not understand why creating two functions go against that intent. If they aren’t public what’s the difference between one or two?

I think is only a matter of style (and yeah, I also prefer the break, is more concise for that specific case). Please let me know if I’m wrong and is also semantically different.

Sorry for the questions I’m just trying to fill the gaps in my zig knowledge

Thread Thread
 
xq profile image
Felix "xq" Queißner

Ok that’s clear, but I do not understand why creating two functions go against that intent. If they aren’t public what’s the difference between one or two?

You will have another symbol in your scope that isn't general purpose, so you pollute your namespace. That's all. Keep symbol count low unless you really need the stuff twice is what i'm trying to do

Thread Thread
 
eliax1996 profile image
Elia Migliore

Super cool! Thanks for the reply. But by not being public couldn’t the compiler inline the function and avoid producing a symbol? By the end the compiler should know that the only point where the function is called is inside that source (if you place the pub keyword that’s a different story)
Isn’t it?

Thread Thread
 
xq profile image
Felix "xq" Queißner

I'm talking about a semantic symbol/name in a scope, not what's emitted in the binary. You cannot call something else in that file concatenate for example, even if you might need it

Thread Thread
 
eliax1996 profile image
Elia Migliore

Got it! Thank you a lot for your kind replies