Conditional structures: Difference between revisions
Content added Content deleted
Thundergnat (talk | contribs) m (Use a proper mediawiki wikipedia link, remove over enthusiastic whitespace, reformatted slightly to match preexisting) |
(add Zig example) |
||
Line 8,121: | Line 8,121: | ||
case(b){...} |
case(b){...} |
||
else {...} // case a C's default, has to be at the end |
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> |
}</lang> |
||