Tipe Skalar Bawaan

Tipe skalar inti Carbon beserta batasan yang didukung interpreter Explorer.

Daftar isi

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.

carbon skalar.carbon
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;
}
text Keluaran
bagi : 3
sisa : 2
tambah: 20
negatif: -17
Carbon
banyak 100
result: 0

Setiap 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.

carbon skalar-bool.carbon
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;
}
text Keluaran
lulus
predikat di bawah sangat baik
result: 0

Nilai 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.

carbon gabung-string.carbon
package sample api;

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

Pesan 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.

carbon tipe-lain.carbon
package sample api;

fn Main() -> i32 {
  var suhu: f64 = 36.6;
  Print("suhu {0}", 1);
  return 0;
}
text Keluaran
SYNTAX ERROR: <source>:4: Only i32 is supported for now: f64

Pesan 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.

carbon cetak-bool.carbon
package sample api;

fn Main() -> i32 {
  var lulus: bool = true;
  Print(lulus);
  return 0;
}
text Keluaran
COMPILATION ERROR: <source>:5: type error in Print argument 0
expected: String
actual: bool

Nilai 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, dan String, sedangkan tipe lain dari keluarga desain iN, uN, dan fN masih ditolak.
  • Operasi i32 meliputi +, -, *, /, %, +=, dan pembalikan tanda, dengan pembagian bilangan bulat yang membuang bagian pecahan.
  • bool dihasilkan oleh perbandingan dan menjadi kondisi bagi if dan while, tetapi tidak dapat dicetak langsung oleh Print.
  • Penggabungan String dengan + belum tersedia pada interpreter, sehingga susunan teks dan nilai dilakukan melalui format Print.

Referensi#