Tulis File-nya
Buka editor kamu dan simpan lima baris berikut sebagai hello.0 di folder mana saja, atau cukup klik Jalankan pada blok di bawah:
Selesai, itu sudah program Zero yang lengkap. Untuk menjalankannya di komputermu:
zero run hello.0
Kamu seharusnya melihat:
hello from zero
Kalau muncul command not found, kembali ke Install Zero dan pastikan zero --version sudah berjalan.
Membedah Setiap Token
Program sekecil ini pun sudah menunjukkan sebagian besar hal yang membuat Zero berbeda. Mari kita baca dari kiri ke kanan.
pub
pub menandai sebuah deklarasi sebagai publik, yaitu terlihat dari luar module-nya. Runtime perlu menemukan main dari luar scope file itu sendiri, jadi main harus pub. Fungsi bantuan privat di file yang sama tidak membutuhkannya.
fun
fun mengawali deklarasi fungsi. Zero memakai fun, bukan fn (Rust), func (Go), atau function (JavaScript). Satu kata kunci, dipakai dengan cara yang sama setiap kali.
main
Nama titik masuk yang standar. Saat target executable Zero berjalan, runtime mencari pub fun main(world: World) lalu memanggilnya. Kamu bebas menamai fungsi lain, tetapi main dicadangkan sebagai konvensi untuk titik masuk program.
(world: World)
Parameter tunggalnya bernama world dan bertipe World. Runtime membuat nilai World sebelum memanggil main, lalu mengirimkannya. Nilai itu membawa capability program: akses ke stdout, stdin, filesystem, jaringan, dan sebagainya, tergantung apa yang diizinkan oleh runtime.
Nama parameternya bebas kamu pilih: (w: World) atau (io: World) juga bisa di-compile. Konvensi di contoh-contoh adalah world, dan kita akan tetap memakainya.
-> Void
Tipe kembaliannya. Void berarti fungsi ini tidak mengembalikan nilai yang berguna. Fungsi ini ada untuk efek sampingnya, bukan untuk nilainya. Banyak fungsi yang kamu tulis akan mengembalikan tipe nyata seperti i32 atau shape yang kamu definisikan.
raises
raises saja (tanpa tipe error tertentu) pada main berarti "fungsi ini bisa gagal". Untuk main, artinya program bisa keluar dengan status bukan nol kalau ada check di dalam isinya yang meneruskan error ke atas. Kita akan melihat bentuk yang lebih sempit, misalnya raises { InvalidInput }, di Raises dan Check.
check world.out.write("hello from zero\n")
Inilah baris yang benar-benar melakukan sesuatu. Ada tiga bagian:
world.out: stream output standar, tersedia sebagai field pada capabilityWorld..write("hello from zero\n"): method yang menulis string ke stream itu. Method ini mengembalikan hasil yang bisa menandakan kegagalan (penulisan bisa gagal, atau stream-nya bisa sudah tertutup).check: meneruskan kegagalan itu ke atas kalau terjadi. Tanpacheck, compiler akan protes karena hasilwritedibuang begitu saja.
\n di akhir adalah karakter baris baru. Tanpanya, output tidak berpindah ke baris baru dan prompt shell kamu akan muncul di baris yang sama dengan pesanmu.
Apa yang Baru Saja Terjadi
Saat kamu menjalankan zero run hello.0:
- Compiler mem-parsing file kamu dan memeriksa tipenya.
- Compiler menghasilkan executable native yang kecil untuk platform kamu.
- Runtime membuat capability
Worlduntuk proses yang sedang berjalan. - Runtime memanggil
main(world). - Kodemu menulis "hello from zero\n" ke stream
outmilik world itu, yang terhubung ke stdout terminal kamu. mainmengembalikanVoid, runtime membereskan semuanya, dan program keluar dengan status 0.
Tidak ada garbage collector, tidak ada inisialisasi runtime tersembunyi, dan tidak ada bootstrap module implisit. Seluruh program adalah fungsi yang kamu tulis, ditambah kode standard library yang dipanggilnya.
Coba Ubah Sedikit
Buat program menyimpan pesannya di sebuah binding sebelum menuliskannya:
Jalankan lagi. Output-nya sama, tetapi sekarang kamu sudah melihat binding let dan memastikan bahwa string adalah nilai biasa yang bisa kamu kirim ke mana-mana.
Varian yang Gagal
Apa yang terjadi kalau kamu lupa menulis check?
pub fun main(world: World) -> Void raises {
world.out.write("oops\n")
}
zero check hello.0 akan menolak meng-compile kode ini. Hasil dari write adalah nilai yang bisa gagal, dan mengabaikannya adalah error kompilasi. Kamu harus memakai check (meneruskan error-nya) atau menanganinya secara eksplisit. Idenya sama dengan hasil must_use di Rust, hanya saja di Zero aturan ini berlaku untuk setiap pemanggilan yang bisa gagal.
Berikutnya: CLI Zero
Di sini kamu memakai zero run. CLI-nya punya sejumlah kecil perintah yang perlu kamu kenal, yaitu check, run, build, test, fix, explain, dan masing-masing punya mode --json terstruktur yang dirancang untuk dibaca oleh agen.
Pertanyaan yang sering diajukan
Seperti apa program hello world di Zero?
Hello world standar di Zero terdiri dari lima baris: pub fun main(world: World) -> Void raises { check world.out.write("hello from zero\n") }. Simpan sebagai hello.0, lalu jalankan zero run hello.0.
Apa arti pub fun main di Zero?
pub membuat sebuah deklarasi menjadi publik, yaitu terlihat dari luar module-nya. fun mendeklarasikan fungsi. main adalah titik masuk standar yang dicari Zero di target executable. Jadi, pub fun main mendeklarasikan titik masuk publik yang dipanggil runtime saat program dimulai.
Kenapa main menerima parameter World?
Zero tidak punya I/O global. Semua yang berhubungan dengan dunia luar, seperti stdout, stdin, file, dan jaringan, harus lewat capability yang dikirim secara eksplisit. Runtime memberikan nilai World ke main, dan nilai itu (atau bagian-bagiannya) adalah satu-satunya cara fungsi bisa melakukan I/O. Dengan begitu, efek samping terlihat di signature fungsi.
Apa fungsi raises dan check di hello world?
raises pada main menyatakan bahwa fungsi itu bisa gagal. check world.out.write(...) memanggil fungsi yang bisa gagal, dan kalau gagal, error-nya diteruskan ke pemanggil. Di sini pemanggilnya adalah runtime, yang lalu keluar dengan status bukan nol. Tanpa check, compiler akan menolak meng-compile pemanggilan itu karena error-nya tidak ditangani.
Ekstensi file apa yang dipakai Zero?
File sumber Zero memakai ekstensi .0 (angka nol, bukan huruf O). File hello.0 adalah file sumber Zero. Compiler-nya dipanggil dengan perintah seperti zero check hello.0 dan zero run hello.0.