Topik ini membahas tipe skalar inti yang tersedia pada Carbon Explorer, yaitu i32 untuk bilangan bulat bertanda, bool untuk nilai kebenaran, dan String untuk teks. Pembahasan mencakup operasi yang dapat dilakukan pada masing-masing tipe, cara tipe-tipe itu dipakai dalam program yang berjalan, serta batasan interpreter terhadap tipe lain yang sudah ada dalam desain. Setelah topik ini, pemilihan tipe yang sesuai dan pengenalan pesan error tipe dapat dilakukan secara mandiri.
i32 dan operasi aritmetika#
Tipe i32 adalah tipe bilangan bulat bertanda selebar 32 bit, dan tipe inilah yang saat ini didukung penuh oleh interpreter Explorer. Menurut dokumen desain, Carbon menyediakan keluarga tipe bilangan bulat bertanda iN dan tak bertanda uN, dengan N kelipatan 8, serta tipe bilangan pecahan IEEE-754 bernama fN. Pada praktiknya, deklarasi u8, i64, atau f64 masih ditolak interpreter dengan pesan bahwa hanya i32 yang didukung, sehingga seluruh contoh bilangan pada jalur ini menggunakan i32.
Operator aritmetika yang tersedia untuk i32 mencakup penjumlahan +, pengurangan -, perkalian *, pembagian /, dan sisa bagi %. Pembagian pada bilangan bulat membuang bagian pecahannya, sehingga 17 / 5 bernilai 3 dan 17 % 5 bernilai 2. Tanda operasi majemuk seperti += juga tersedia sebagai singkatan penugasan, dan tanda - di depan sebuah nilai membalik tandanya. Program berikut mencoba sebagian operasi tersebut sekaligus memperlihatkan binding bertipe String.
package sample api;
fn Main() -> i32 {
var nilai: i32 = 17;
Print("bagi : {0}", nilai / 5);
Print("sisa : {0}", nilai % 5);
Print("tambah: {0}", nilai + 3);
Print("negatif: {0}", -nilai);
var label: String = "Carbon";
Print(label);
Print("banyak {0}", 100);
return 0;
}bagi : 3
sisa : 2
tambah: 20
negatif: -17
Carbon
banyak 100
result: 0Setiap baris Print pada keluaran sesuai dengan panggilannya di kode. Perhatikan bahwa Print menerima satu argumen berupa String, atau dua argumen berupa String format yang memuat penanda {0} dan satu nilai i32 untuk mengisinya. Pemanggilan Print("banyak {0}", 100); menunjukkan bentuk kedua tersebut, sedangkan Print(label); menunjukkan bentuk pertama dengan variabel String biasa.
bool untuk keputusan#
Tipe bool memiliki dua nilai saja, yaitu true dan false, dan ketiga namanya berupa kata kunci bahasa. Ekspresi perbandingan menghasilkan nilai bool, sehingga nilai >= 70 bernilai true atau false tergantung isi nilai. Nilai bool menjadi masukan bagi kondisi pernyataan if dan while. Operator logika and dan or menggabungkan beberapa nilai bool menjadi satu kondisi, sehingga pemeriksaan rentang dapat dituliskan dalam satu pernyataan if tanpa percabangan bersarang.
Program berikut menyimpan hasil perbandingan ke dalam binding bool, lalu memakainya sebagai kondisi percabangan.
package sample api;
fn Main() -> i32 {
var nilai: i32 = 85;
var lulus: bool = nilai >= 70;
if (lulus) {
Print("lulus");
} else {
Print("tidak lulus");
}
if (nilai > 90) {
Print("predikat sangat baik");
} else {
Print("predikat di bawah sangat baik");
}
return 0;
}lulus
predikat di bawah sangat baik
result: 0Nilai 85 memenuhi nilai >= 70, sehingga binding lulus bernilai true dan blok pertama yang dieksekusi. Perbandingan nilai > 90 bernilai false, sehingga blok else pada percabangan kedua yang dijalankan. Contoh ini memperlihatkan dua hal sekaligus, yaitu hasil perbandingan dapat disimpan terlebih dahulu sebagai nilai bool dan dapat pula dipakai langsung di dalam kondisi if.
String untuk teks#
Tipe String menyimpan urutan byte yang ditafsirkan sebagai teks berenkode UTF-8. Literal String ditulis di antara tanda kutip ganda, misalnya "Carbon", dan literal multibaris yang diapit tiga tanda kutip tunggal juga tersedia dalam desain. Binding bertipe String dibuat dengan pola yang sama seperti tipe lain, yaitu var label: String = "Carbon"; atau let label: String = "Carbon";, dan nilai terikat dapat dicetak dengan Print(label);.
Dokumen desain menandai tipe String sebagai bagian yang belum melewati proses proposal secara utuh, dan kondisi ini terasa pada interpreter. Penggabungan teks dengan operator +, yang lazim di bahasa lain, masih ditolak karena implementasi antarmuka penjumlahan untuk String belum tersedia. Program berikut memperlihatkan bentuk penolakannya.
package sample api;
fn Main() -> i32 {
var s: String = "Carbon" + " 2026";
Print(s);
return 0;
}COMPILATION ERROR: <source>:4: type error in `+`:
could not find implementation of interface AddWith(U = String) for StringPesan error tersebut menyatakan bahwa tidak ada implementasi antarmuka AddWith untuk String, sehingga penggabungan dua teks dengan operator + tidak tersedia. Pemformatan bawaan Print juga tidak menawarkan penyambungan teks, karena fungsi ini hanya menerima satu nilai i32 setelah argumen formatnya. Cara yang berjalan saat ini adalah menuliskan teks secara utuh pada argumen format atau menaruh potongan teks pada binding yang berbeda.
Kesalahan umum#
Dua kesalahan tipe paling umum pada Explorer adalah menggunakan tipe yang belum didukung dan memberikan bool kepada Print. Kesalahan pertama muncul saat tipe pecahan atau tipe lebar lain digunakan karena kebiasaan dari bahasa lain.
package sample api;
fn Main() -> i32 {
var suhu: f64 = 36.6;
Print("suhu {0}", 1);
return 0;
}SYNTAX ERROR: <source>:4: Only i32 is supported for now: f64Pesan Only i32 is supported for now muncul untuk tipe apa pun di luar yang didukung, dan variasi u8 maupun i64 menghasilkan pesan dengan bentuk yang sama. Perbaikan yang berjalan saat ini adalah tetap menggunakan i32, termasuk untuk nilai yang biasanya pecahan seperti suhu, atau mengalikan nilai tersebut dengan skala tertentu bila ketelitian desimal diperlukan.
Kesalahan kedua terjadi karena Print menuntut argumen pertama bertipe String dan argumen kedua bertipe i32, sedangkan nilai bool bukan keduanya. Program berikut memperlihatkan penolakannya.
package sample api;
fn Main() -> i32 {
var lulus: bool = true;
Print(lulus);
return 0;
}COMPILATION ERROR: <source>:5: type error in Print argument 0
expected: String
actual: boolNilai bool tetap dapat ditampilkan dengan bantuan percabangan, yaitu mencetak teks berbeda untuk kondisi true dan false sebagaimana dilakukan pada program skalar-bool.carbon. Pola ini juga memudahkan pembaca keluaran karena teks yang tampil langsung menyatakan maknanya.
Ringkasan#
- Tipe yang didukung penuh interpreter Explorer saat ini adalah
i32,bool, danString, sedangkan tipe lain dari keluarga desainiN,uN, danfNmasih ditolak. - Operasi
i32meliputi+,-,*,/,%,+=, dan pembalikan tanda, dengan pembagian bilangan bulat yang membuang bagian pecahan. booldihasilkan oleh perbandingan dan menjadi kondisi bagiifdanwhile, tetapi tidak dapat dicetak langsung olehPrint.- Penggabungan
Stringdengan+belum tersedia pada interpreter, sehingga susunan teks dan nilai dilakukan melalui formatPrint.
Referensi#
- Language design — Carbon Language — Dokumen desain inti yang memuat tipe primitif bool, bilangan bulat iN dan uN, bilangan pecahan fN, serta tipe String.
- Values, objects, and expressions — Carbon Language — Menetapkan semantik binding dan kategori ekspresi yang mendasari penggunaan tipe.
- Carbon Explorer — Compiler Explorer — Layanan daring tempat seluruh program pada topik ini dijalankan dengan kompiler Explorer (trunk).