Conditional structures: Difference between revisions

add Zig example
m (Use a proper mediawiki wikipedia link, remove over enthusiastic whitespace, reformatted slightly to match preexisting)
(add Zig example)
Line 8,121:
case(b){...}
else {...} // case a C's default, has to be at the end
}</lang>
 
=={{header|Zig}}==
<lang zig>const std = @import("std");
const builtin = @import("builtin");
 
fn printOpenSource(comptime is_open_source: bool) !void {
if (is_open_source) {
try std.io.getStdOut().writer().writeAll("Open source.\n");
} else {
try std.io.getStdOut().writer().writeAll("No open source.\n");
}
}
fn printYesOpenSource() !void {
try std.io.getStdOut().writer().writeAll("Open source.\n");
}
fn printNoOpenSource() !void {
try std.io.getStdOut().writer().writeAll("No open source.\n");
}
const fnProto = switch (builtin.zig_backend) {
.stage1 => fn () anyerror!void,
else => *const fn () anyerror!void,
};
const Vtable = struct {
fnptrs: [2]fnProto,
};
 
// dynamic dispatch: logic(this function) + vtable + data
fn printBySelectedType(data: bool, vtable: Vtable) !void {
if (data) {
try @call(.{}, vtable.fnptrs[0], .{});
} else {
try @call(.{}, vtable.fnptrs[1], .{});
}
}
 
pub fn main() !void {
// if-else
if (true) {
std.debug.assert(true);
} else {
std.debug.assert(false);
}
// comptime switch
const open_source = comptime switch (builtin.os.tag) {
.freestanding => true,
.linux => true,
.macos => false,
.windows => false,
else => unreachable,
};
// conditional compilation
std.debug.assert(builtin.zig_backend != .stage2_llvm);
// static dispatch (more complex examples work typically via comptime enums)
try printOpenSource(open_source);
// dynamic dispatch (runtime attach function pointer)
var vtable = Vtable{
.fnptrs = undefined,
};
// runtime-attach function pointers (dynamic dispatch)
vtable.fnptrs[0] = printYesOpenSource;
vtable.fnptrs[1] = printNoOpenSource;
try printBySelectedType(open_source, vtable);
 
// TODO Arithmetic if once https://github.com/ziglang/zig/issues/8220 is finished
}</lang>
 
37

edits