Nim mengelompokkan penyimpanan nilai ke dalam tiga kata kunci dengan disiplin yang berbeda. let mengikat satu nilai yang tidak dapat diberi nilai baru, var mengizinkan perubahan nilai selama program berjalan, dan const menetapkan nilai pada waktu kompilasi. Topik ini membahas perilaku ketiganya, error yang muncul apabila aturannya dilanggar, serta pertimbangan memilih di antara ketiganya. Contoh yang digunakan berupa catatan suhu ruangan dengan angka yang mudah dihitung ulang.
let untuk nilai sekali isi#
let menyatakan variabel yang nilainya ditetapkan sekali saat deklarasi. Setelah diinisialisasi, variabel let tidak dapat diberi nilai baru oleh pernyataan mana pun. Nim mewajibkan setiap let diinisialisasi langsung pada baris deklarasi, sehingga let suhuAwal = 26.5 sah, sedangkan deklarasi let tanpa nilai ditolak compiler dengan pesan Error: 'let' symbol requires an initialization.
let suhuAwal = 26.5
echo suhuAwal26.5Potongan ini menampilkan 26.5 karena nilai suhuAwal terbaca langsung dari pengikatannya. Apabila program berusaha memberi nilai baru, kompilasi berhenti sebelum program sempat berjalan.
let juga dapat mengikat hasil ekspresi yang melibatkan variabel lain, sebagaimana let f = c.toFloat * 9.0 / 5.0 + 32.0 pada contoh tabel konversi suhu di topik Alur kendali. Nilai turunan yang tidak berubah lagi cukup dihitung sekali dan diberi nama, sehingga ekspresinya tidak perlu ditulis ulang di tempat lain. Penamaan semacam ini juga menghindari pengulangan perhitungan yang rawan berbeda hasil.
# tidak-dijalankan
let suhuAwal = 26.5
suhuAwal = 30.0Kompilasi potongan ini berhenti dengan pesan Error: 'suhuAwal' cannot be assigned to. Pesan yang sama muncul untuk setiap usaha memberi nilai baru ke variabel let, sehingga pelanggaran disiplin nilai tetap terdeteksi lebih awal. Perbaikannya bergantung pada maksud program, yaitu memakai var apabila nilainya memang berubah, atau menghapus penugasannya apabila nilai itu seharusnya tetap.
var untuk nilai yang berubah#
var menyatakan variabel yang boleh diberi nilai baru sebanyak berapa kali pun. Bentuk deklarasinya sama dengan let, tetapi pernyataan penugasan berikutnya diperbolehkan. Beberapa variabel juga dapat dideklarasikan dalam satu blok var dengan indentasi yang sejajar, sebagaimana blok let dan const dapat mengelompokkan beberapa deklarasi sekaligus.
Program berikut mencatat suhu ruangan pada tiga kesempatan. suhuSekarang dan jumlahPencatatan dideklarasikan sebagai var karena keduanya berubah antara pencatatan, sedangkan suhuAwal berupa let dan suhuMaksRuang berupa const karena keduanya tetap.
# Catatan suhu ruangan sederhana
const suhuMaksRuang = 30.0
let suhuAwal = 26.5
var
suhuSekarang = suhuAwal
jumlahPencatatan = 1
suhuSekarang = 28.0
jumlahPencatatan = jumlahPencatatan + 1
suhuSekarang = 31.5
jumlahPencatatan = jumlahPencatatan + 1
echo "pencatatan ke-", jumlahPencatatan
echo "suhu sekarang: ", suhuSekarang
echo "melewati batas: ", suhuSekarang > suhuMaksRuang
echo "suhu awal tetap: ", suhuAwal# kompilasi dan jalankan program, hint kompilasi disembunyikan
nim c --hints:off -r catatan_suhu.nimpencatatan ke-3
suhu sekarang: 31.5
melewati batas: true
suhu awal tetap: 26.5Keluaran menunjukkan nilai akhir kedua var setelah dua kali penugasan. Perbandingan suhuSekarang > suhuMaksRuang menghasilkan true karena 31.5 melewati batas 30.0, sementara suhuAwal tetap 26.5 sesuai pengikatannya yang pertama. Satu nama pengenal juga tidak boleh dideklarasikan dua kali pada lingkup yang sama, sehingga mengganti let suhuAwal menjadi var suhuAwal tanpa menghapus deklarasi lama memicu error redefinition.
const untuk konstanta waktu kompilasi#
const menyatakan konstanta yang nilainya dihitung saat kompilasi, bukan saat program berjalan. Compiler harus dapat menghitung ekspresinya tanpa menjalankan program, sehingga const cocok untuk nilai tetap yang sudah diketahui sebelum program dibangun. Nilai yang sudah dihitung kemudian ditempatkan pada bagian data biner hasil kompilasi, sehingga perhitungannya tidak diulang setiap kali program dijalankan.
const
detikPerMenit = 60
menitPerJam = 60
detikPerJam = detikPerMenit * menitPerJam
echo detikPerJam3600Konstanta boleh merujuk konstanta lain, sehingga detikPerJam dihitung dari dua konstanta sebelumnya. Seluruh perkalian selesai pada waktu kompilasi, dan program hanya menampilkan 3600. Ekspresi yang membutuhkan program berjalan, seperti pembacaan masukan, tidak dapat menjadi konstanta.
Kelompok const pada potongan di atas memakai indentasi sejajar, dan setiap barisnya menjadi konstanta tersendiri. Gaya pengelompokan ini dipakai pula oleh let dan var apabila deklarasinya banyak, sebagaimana blok var pada program catatan suhu.
# tidak-dijalankan
const s = readLine(stdin)
echo sProc readLine membaca masukan saat program berjalan, sehingga nilainya tidak dapat dihitung compiler. Kompilasi dihentikan dengan pesan Error: cannot evaluate at compile time: stdin, dan nilai semacam ini seharusnya disimpan ke dalam let atau var, bukan const.
Memilih let, var, atau const#
Pemilihan kata kunci mengikuti dua pertanyaan, yaitu apakah nilainya berubah selama program berjalan dan apakah nilainya sudah dapat dihitung saat kompilasi. Nilai yang berubah menggunakan var. Nilai yang tetap menggunakan let, kecuali nilainya dapat dihitung pada waktu kompilasi sehingga const lebih tepat. Tabel berikut merangkum ketiganya.
| Kata kunci | Pemberian nilai baru | Waktu evaluasi | Contoh penggunaan |
|---|---|---|---|
let | tidak diizinkan | saat program berjalan | hasil perhitungan yang tetap |
var | diizinkan | saat program berjalan | penghitung dan pencatatan berulang |
const | tidak diizinkan | saat kompilasi | faktor konversi dan batas tetap |
Urutan pertimbangan tersebut dirangkum dalam diagram berikut. Nilai yang berubah langsung menuju var, sedangkan nilai tetap dibedakan berdasarkan waktu perhitungannya.
Ketiga kata kunci memperkenalkan pengenal pada lingkup tempat deklarasi ditulis. Deklarasi di bagian atas berkas berlaku untuk seluruh berkas, sedangkan deklarasi di dalam sebuah blok berlaku terbatas pada blok tersebut.
Pembacaan kode mengikuti disiplin yang sama. Pengenal var menjadi satu-satunya sumber perubahan nilai, sehingga nilai yang mengejutkan cukup dilacak pada penugasan di sekitarnya. Pengenal let dan const memberi jaminan sebaliknya, yaitu nilainya tidak pernah berubah setelah dinyatakan, dan jaminan itu ditegakkan compiler dengan error.
Ringkasan#
letmengikat satu nilai dan menolak setiap penugasan baru dengan errorcannot be assigned to.varmengizinkan penugasan berulang selama program berjalan.constdievaluasi compiler pada waktu kompilasi dan menolak ekspresi yang membutuhkan program berjalan.- Pemilihannya bergantung pada perubahan nilai dan waktu perhitungan, dirangkum dalam tabel serta diagram alur pemilihan.
Referensi#
- Nim Tutorial (Part I) — Nim Project — Menjelaskan semantik var, let, dan const beserta keharusan evaluasi konstanta pada waktu kompilasi.
- Nim Manual — Nim Project — Merinci aturan deklarasi var, let, dan const pada bagian statements and expressions.