fn dan Hello World

Menulis fungsi Main dengan fn dan menyapa dunia lewat Print di Explorer.

Daftar isi

Topik ini membahas deklarasi fungsi dengan kata kunci fn, peran fungsi Main sebagai titik masuk program, dan program hello world yang dijalankan di Carbon Explorer. Pembahasan mencakup anatomi deklarasi fungsi, aturan yang mengikat Main, serta cara membaca keluaran program yang selalu memuat baris result. Setelah membaca topik ini, program Carbon pertama dapat ditulis dan dieksekusi di Compiler Explorer lengkap dengan pemahaman atas setiap baris keluarannya.

Fungsi dengan fn#

Deklarasi fungsi dalam Carbon selalu diawali kata kunci fn, diikuti nama fungsi, daftar parameter dalam tanda kurung, tipe kembalian yang ditandai ->, dan tubuh fungsi dalam tanda kurung kurawal. Dokumen desain memperkenalkan fn sebagai kata pengantar (introducer keyword), yaitu kata yang menandai jenis deklarasi sejak baris pertamanya. Setiap parameter ditulis dengan pola nama: tipe, sehingga tipe setiap argumen selalu eksplisit. Pernyataan dan deklarasi dalam Carbon diakhiri titik koma atau berbentuk blok dengan kurung kurawal, seperti tubuh fungsi itu sendiri.

carbon Contoh: deklarasi fungsi dengan dua parameter
// tidak-dijalankan
fn Tambah(a: i32, b: i32) -> i32 {
  return a + b;
}

Fungsi pada contoh di atas bernama Tambah, menerima dua parameter bertipe i32, dan mengembalikan nilai i32 melalui pernyataan return. Program utuh berikut menggunakan fungsi itu di dalam Main, kemudian hasilnya dicetak melalui Print.

carbon tambah.carbon
package sample api;

fn Tambah(a: i32, b: i32) -> i32 {
  return a + b;
}

fn Main() -> i32 {
  Print("Jumlah: {0}", Tambah(7, 5));
  return 0;
}
text Keluaran
Jumlah: 12
result: 0

Keluaran di atas diperoleh dari eksekusi nyata di Compiler Explorer. Angka 12 pada baris pertama adalah hasil pemanggilan Tambah(7, 5), sedangkan tempat penanda {0} pada teks format diganti dengan nilai argumen kedua pernyataan Print. Pemisahan antara perhitungan di Tambah dan pencetakan di Main memperlihatkan peran tipe kembalian, yaitu membawa nilai dari fungsi ke pemanggilnya tanpa variabel perantara.

Main sebagai titik masuk program#

Fungsi Main adalah titik masuk (entry point) yang dieksekusi Carbon Explorer ketika sebuah berkas dijalankan. Explorer mewajibkan Main memiliki tipe kembalian eksplisit, dan bentuk yang berjalan adalah fn Main() -> i32 yang diakhiri return 0;. Apabila tipe kembalian ditiadakan, pemeriksa menolak program dengan pesan error, dan pesan aslinya ditampilkan pada bagian kesalahan umum di bawah. Kata kunci fn, parameter, dan tipe kembalian berlaku sama untuk Main seperti untuk fungsi lain, sehingga Main hanyalah fungsi biasa yang dipanggil oleh alat, bukan oleh kode lain dalam program.

Dokumen desain menetapkan hal yang sedikit berbeda, yaitu titik masuk program bernama Run yang berada pada library default package Main, sementara bentuk deklarasi titik masuk yang sah masih tercatat sebagai keputusan yang belum rampung. Kesenjangan kecil ini wajar pada bahasa eksperimental, karena Explorer menjalankan perilaku yang sudah terimplementasi, sedangkan dokumen desain memuat arah yang belum sepenuhnya terwujud. Bagi pembelajar hari ini, bentuk yang perlu ditulis di Explorer tetap fn Main() -> i32, dan bentuk itulah yang digunakan seluruh contoh pada jalur ini.

Program halo dan keluarannya#

Program hello world pada Carbon ditulis dalam beberapa baris, dan seluruhnya dapat dijalankan di Compiler Explorer tanpa instalasi apa pun. Berkas berikut bernama halo.carbon dan berisi deklarasi package, fungsi Main, serta satu pernyataan Print.

carbon halo.carbon
package sample api;

fn Main() -> i32 {
  Print("Halo, Carbon!");
  return 0;
}
text Keluaran
Halo, Carbon!
result: 0

Fungsi Print menerima satu atau dua argumen, dan argumen pertamanya wajib berupa string. Bentuk satu argumen mencetak teks apa adanya, sedangkan bentuk dua argumen memperlakukan teks pertama sebagai format dengan tempat penanda {0} yang diganti nilai argumen kedua bertipe i32. Pernyataan ini tidak menambahkan baris baru di akhir keluarannya. Nama Print dapat digunakan tanpa pernyataan import karena Explorer menyediakannya dari library bawaan, sedangkan dokumen desain menuliskannya sebagai Core.Print yang berasal dari library io pada package Core.

Baris result: 0 bukan keluaran program, melainkan penanda yang selalu ditambahkan Compiler Explorer dan berisi kode kembalian fungsi Main. Apabila Main mengembalikan nilai lain, angka pada baris itu ikut berubah, misalnya return 2; menghasilkan baris result: 2. Nilai ini berguna saat program diuji secara otomatis, karena keberhasilannya dapat diperiksa dari kode kembalian tanpa membaca teks keluarannya.

Kesalahan umum#

Tiga kesalahan berikut paling sering muncul ketika program Carbon pertama ditulis di Explorer, dan ketiganya diverifikasi melalui eksekusi nyata. Semua pesan di bawah adalah keluaran stderr asli dari Compiler Explorer, sehingga bentuknya dapat dibandingkan langsung dengan pesan yang muncul saat contoh serupa dicoba ulang. Kesalahan pertama adalah berkas tanpa deklarasi package sama sekali.

carbon Contoh: berkas tanpa deklarasi package
fn Main() -> i32 {
  Print("Halo, Carbon!");
  return 0;
}
text Keluaran
SYNTAX ERROR: <source>:1: syntax error, unexpected FN, expecting PACKAGE

Pesan expecting PACKAGE menyatakan bahwa tahap pembacaan sintaks menunggu kata package sebelum kata fn. Perbaikannya adalah menambahkan deklarasi package pada baris pertama, misalnya package sample api;.

Kesalahan kedua adalah Main tanpa tipe kembalian. Program terlihat selesai ditulis, tetapi pemeriksa menolaknya pada tahap kompilasi.

carbon Contoh: Main tanpa tipe kembalian
package sample api;

fn Main() {
  Print("Halo, Carbon!");
}
text Keluaran
COMPILATION ERROR: <source>:3: `Main` must have an explicit return type

Pesan error ini sekaligus menyebut solusinya, yaitu memberi tipe kembalian eksplisit -> i32 dan mengembalikan nilai di akhir tubuh fungsi.

Kesalahan ketiga adalah menyambung string dengan operator +, misalnya untuk menggabungkan sapaan dengan nama.

carbon Contoh: penyambungan string dengan operator +
package sample api;

fn Main() -> i32 {
  Print("Halo, " + "Carbon!");
  return 0;
}
text Keluaran
COMPILATION ERROR: <source>:4: type error in `+`:
could not find implementation of interface AddWith(U = String) for String

Interpreter Explorer belum menyediakan operasi penjumlahan untuk tipe String, sehingga penyambungan teks dengan + ditolak. Perbaikannya adalah menggunakan format Print, yaitu teks tetap ditulis pada argumen pertama, sedangkan bagian yang berubah ditulis sebagai {0} beserta nilainya pada argumen kedua.

Ringkasan#

  • Deklarasi fungsi Carbon diawali fn, menggunakan pola parameter nama: tipe, dan dapat menyatakan tipe kembalian setelah ->.
  • Main adalah titik masuk yang dieksekusi Explorer dan wajib bertipe kembalian eksplisit i32.
  • Print menerima satu atau dua argumen dengan tempat penanda {0}, tanpa menambahkan baris baru di akhir.
  • Baris result: N pada keluaran Compiler Explorer berisi kode kembalian Main dan selalu ditampilkan.

Referensi#