- Zig berbasis sintaks berbasis kurung kurawal yang mirip Rust, tetapi ditingkatkan dengan semantik bahasa yang lebih sederhana dan pilihan sintaks yang lebih rapi
- Literal bilangan bulat semuanya dimulai sebagai
comptime_int dan dikonversi secara eksplisit saat ditugaskan, sementara literal string menggunakan notasi string mentah ringkas berbasis \\
- Literal record dalam bentuk
.x = 1 memudahkan pencarian penulisan field, dan semua tipe direpresentasikan secara konsisten dengan notasi prefiks
and·or digunakan sebagai keyword alur kontrol, dan konstruksi if·loop dapat menghilangkan kurung kurawal secara opsional, dengan formatter yang menjamin keamanan
- Tanpa namespace, semua hal diperlakukan sebagai ekspresi untuk menyatukan sintaks tipe·nilai·pola, serta memanfaatkan generic·literal record·fungsi bawaan (
@import, @as, dll.) secara ringkas
Ikhtisar
- Zig memiliki tampilan yang mirip Rust, tetapi mengadopsi struktur bahasa yang lebih sederhana
- Desain sintaksnya berfokus pada ramah grep, konsistensi sintaks, dan mengurangi noise visual yang tidak perlu
Literal bilangan bulat
const an_integer = 92;
assert(@TypeOf(an_integer) == comptime_int);
const x: i32 = 92;
const y = @as(i32, 92);
- Semua literal bilangan bulat bertipe
comptime_int
- Saat ditugaskan ke variabel, tipe harus ditentukan secara eksplisit atau dikonversi dengan
@as
- Bentuk
var x = 92; tidak akan berfungsi dan memerlukan tipe eksplisit
Literal string
const raw =
\\Roses are red
\\ Violets are blue,
\\Sugar is sweet
\\ And so are you.
\\
;
- Setiap baris adalah token terpisah sehingga tidak ada masalah indentasi
- Tidak perlu melakukan escape pada
\\ itu sendiri
Literal record
const p: Point = .{
.x = 1,
.y = 2,
};
- Format
.x = 1 menguntungkan untuk membedakan baca/tulis
- Notasi
.{} membedakannya dari blok sambil otomatis dikonversi ke tipe hasil
Notasi tipe
u32 // bilangan bulat
[3]u32 // array panjang 3
?[3]u32 // array yang bisa null
*const ?[3]u32 // pointer konstan
- Semua tipe memakai notasi prefiks
- Dereferensi memakai notasi sufiks (
ptr.*)
Identifier
const @"a name with space" = 42;
- Dapat mencegah konflik keyword atau memberi nama khusus
Deklarasi fungsi
pub fn main() void {}
fn add(x: i32, y: i32) i32 {
return x + y;
}
- Keyword
fn dan nama fungsi berdempetan sehingga mudah dicari
- Tidak memakai
-> untuk menuliskan tipe kembalian
Deklarasi variabel
const mid = lo + @divFloor(hi - lo, 2);
var count: u32 = 0;
- Menggunakan
const dan var
- Penulisan tipe mengikuti urutan
nama: tipe
Alur kontrol: and/or
while (count > 0 and ascii.isWhitespace(buffer[count - 1])) {
count -= 1;
}
and, or adalah keyword alur kontrol
- Operasi bit menggunakan
&, |
Pernyataan if
.direction = if (prng.boolean()) .ascending else .descending;
- Tanda kurung wajib, kurung kurawal opsional
zig fmt menjamin format yang aman
Perulangan
for (0..10) |i| {
print("{d}\n", .{i});
} else @panic("loop safety counter exceeded");
for dan while sama-sama mendukung klausa else
- Iterator dan nama elemen ditempatkan secara intuitif
Namespace dan resolusi nama
const std = @import("std");
const ArrayList = std.ArrayList;
- Shadowing variabel dilarang
- Tidak ada namespace maupun glob import
Semua adalah ekspresi
const E = enum { a, b };
const e: if (true) E else void = .a;
- Menyatukan sintaks tipe·nilai·pola
- Ekspresi kondisional dapat ditempatkan di posisi tipe
Generic
fn ArrayListType(comptime T: type) type {
return struct {
fn init() void {}
};
}
var xs: ArrayListType(u32) = .init();
- Generic diekspresikan dengan sintaks pemanggilan fungsi (
Type(T))
- Argumen tipe selalu eksplisit
Fungsi bawaan
const foo = @import("./foo.zig");
const num = @as(i32, 92);
- Memanggil fitur yang disediakan compiler dengan prefiks
@
@import menampilkan jalur file dengan jelas
- Argumennya harus berupa literal string
Kesimpulan
- Sintaks Zig adalah contoh bagaimana sekumpulan pilihan kecil dapat membentuk bahasa yang enak dibaca
- Jika jumlah fitur dikurangi, sintaks yang dibutuhkan juga berkurang, dan kemungkinan konflik antarsintaks pun menurun
- Meminjam ide bagus dari bahasa yang sudah ada, tetapi berani memperkenalkan sintaks baru saat diperlukan
Belum ada komentar.