bat/tests/syntax-tests/source/Zig/example.zig

108 lines
2.4 KiB
Zig
Raw Normal View History

//! this is a top level doc, starts with "//!"
const std = @import("std");
pub fn main() anyerror!void {
const stdout = std.io.getStdOut().writer();
try stdout.print("Hello, {}!\n", .{"world"});
}
const expect = std.testing.expect;
test "comments" {
// comments start with "//" until newline
// foo bar baz
const x = true; // another comment
expect(x);
}
/// a doc comment starts with "///"
/// multiple lines are merged together
const Timestamp = struct {
/// number of seconds since epoch
seconds: i64,
/// number of nanoseconds past the second
nano: u32,
const Self = @This();
pub fn unixEpoch() Self {
return Self{
.seconds = 0,
.nanos = 0,
};
}
};
const my_val = switch (std.Target.current.os.tag) {
.linux => "Linux",
else => "not Linux",
};
const Book = enum {
paperback,
hardcover,
ebook,
pdf,
};
const TokenType = union(enum) {
int: isize,
float: f64,
string: []const u8,
};
const array_lit: [4]u8 = .{ 11, 22, 33, 44 };
const sentinal_lit = [_:0]u8{ 1, 2, 3, 4 };
test "address of syntax" {
// Get the address of a variable:
const x: i32 = 1234;
const x_ptr = &x;
// Dereference a pointer:
expect(x_ptr.* == 1234);
// When you get the address of a const variable, you get a const pointer to a single item.
expect(@TypeOf(x_ptr) == *const i32);
// If you want to mutate the value, you'd need an address of a mutable variable:
var y: i32 = 5678;
const y_ptr = &y;
expect(@TypeOf(y_ptr) == *i32);
y_ptr.* += 1;
expect(y_ptr.* == 5679);
}
// integer literals
const decimal_int = 98222;
const hex_int = 0xff;
const another_hex_int = 0xFF;
const octal_int = 0o755;
const binary_int = 0b11110000;
// underscores may be placed between two digits as a visual separator
const one_billion = 1_000_000_000;
const binary_mask = 0b1_1111_1111;
const permissions = 0o7_5_5;
const big_address = 0xFF80_0000_0000_0000;
// float literals
const floating_point = 123.0E+77;
const another_float = 123.0;
const yet_another = 123.0e+77;
const hex_floating_point = 0x103.70p-5;
const another_hex_float = 0x103.70;
const yet_another_hex_float = 0x103.70P-5;
// underscores may be placed between two digits as a visual separator
const lightspeed = 299_792_458.000_000;
const nanosecond = 0.000_000_001;
const more_hex = 0x1234_5678.9ABC_CDEFp-10;
fn max(comptime T: type, a: T, b: T) T {
return if (a > b) a else b;
}