Atom dan single assignment

Atom sebagai label dan aturan single assignment yang mengikat variabel sekali saja.

Daftar isi

Topik ini membahas dua konsep paling dasar bahasa Erlang, yaitu atom sebagai label konstanta dan single assignment sebagai aturan pengikatan variabel. Setelah membaca, pembaca mengenal cara menulis atom, memahami mengapa variabel tidak pernah berubah nilainya, dan membaca pesan error yang muncul saat aturan itu dilanggar.

Atom sebagai label#

Atom adalah konstanta yang namanya sama dengan nilainya. Tulisannya dimulai dengan huruf kecil diikuti huruf, angka, garis bawah, atau tanda @, misalnya ok, panas, atau suhu_rendah. Atom tidak menyimpan data apa pun selain identitasnya sendiri, sehingga perannya mirip label pada kotak: menandai makna sebuah nilai tanpa menambah isi. Sesi berikut mengevaluasi dua atom di shell:

erlang Atom sederhana dan atom berkutip
Erlang/OTP 29 [erts-17.1.1] [source] [64-bit] [smp:2:2] [ds:2:2:10] [async-threads:1] [jit:ns]

Eshell V17.1.1 (press Ctrl+G to abort, type help(). for help)
1> ok.
ok
2> 'Warna Kedua'.
'Warna Kedua'

Atom yang mengandung spasi, huruf besar di awal, atau karakter khusus ditulis di antara kutip tunggal, seperti 'Warna Kedua' di atas. Nilai true dan false juga merupakan atom, sebagaimana akan terlihat pada topik bilangan dan boolean. Karena atom hanya berupa nama, atom paling tepat dipakai untuk nilai-nilai tetap yang berjumlah kecil, misalnya status ok dan error, bukan untuk data yang berubah-ubah.

Variabel diikat sekali#

Nama variabel di Erlang selalu diawali huruf kapital atau garis bawah. Aturan utamanya disebut single assignment: satu variabel hanya diikat satu kali, dan pengikatan itu tidak pernah berubah sepanjang lingkupnya. Operator = tidak melakukan penugasan seperti pada bahasa imperatif, melainkan pencocokan: sisi kiri dicocokkan dengan sisi kanan, dan variabel yang belum terikat akan terikat bila cocok.

erlang Pengikatan dan percobaan mengikat ulang
4> X = 10.
10
5> X.
10
6> X = 20.
** exception error: no match of right hand side value 20

Ekspresi X = 10. mengikat X dengan nilai 10. Percobaan X = 20. gagal karena pencocokan membandingkan nilai terikat X dengan 20, dan keduanya tidak sama. Pesan errornya menyebutkan no match of right hand side value 20, yang dibaca sebagai: sisi kanan bernilai 20 dan tidak cocok dengan sisi kiri. Inilah bedanya dengan penugasan pada bahasa lain. Di Erlang tidak ada perintah untuk mengubah nilai variabel.

Mengulang pengikatan yang nilainya sama justru sah. Ekspresi X = 10. berikutnya tidak error karena kedua sisi cocok persis. Sifat ini membuat alur data program mudah dilacak: satu variabel berarti satu nilai sejak awal hingga akhir.

Melepas pengikatan di shell#

Karena shell menyimpan state antar ekspresi, ada kalanya pengujian membutuhkan nama yang sama dengan nilai berbeda. Fasilitas shell f(X) melepas pengikatan X, sehingga nama itu bisa diikat kembali:

erlang Melepas dan mengikat ulang lewat f(X)
7> f(X).
ok
8> X = 20.
20
9> Y = X + 5.
25
10> b().
X = 20
Y = 25
ok

Setelah f(X)., pengikatan X = 20. berhasil karena X kembali bebas. Fungsi b() mencetak seluruh pengikatan aktif, dan hasilnya menunjukkan X kini bernilai 20 serta Y bernilai 25. Perlu diingat lagi bahwa f/1 hanya ada di shell. Di dalam berkas .erl, satu nama tetap satu nilai sampai fungsi itu selesai dijalankan.

Nama huruf kecil bukan variabel#

Kesalahan pemula yang paling sering adalah menulis nama variabel dengan huruf kecil. Nama tersebut tidak menjadi variabel, melainkan atom, sehingga hasil pencocokannya berbeda dari dugaan:

erlang Nama huruf kecil adalah atom
3> x = 5.
** exception error: no match of right hand side value 5

Ekspresi x = 5. gagal karena sisi kirinya adalah atom x, bukan variabel, dan atom tidak pernah sama dengan bilangan 5. Pesan errornya sama persis dengan kasus mengikat ulang di atas, sehingga kuncinya adalah membaca nama pada sisi kiri: huruf kapital berarti variabel, huruf kecil berarti atom.

Variabel tanpa nama _ menerima nilai apa pun tanpa mengikatnya, dan bentuk _Nama mengikat nilai sambil menandakan bahwa nilai itu tidak akan dibaca lagi. Keduanya dipakai pada pencocokan pola yang dibahas pada topik tersendiri di modul ini.

Kapan atom dipakai#

Karena atom hanya berupa nama, penggunaannya paling efektif pada nilai-nilai tetap yang berjumlah kecil dan sudah dikenal sejak desain. Tiga pemakaian paling umum adalah pelaporan status seperti ok dan error, penanda jenis data pada posisi pertama tuple seperti {suhu, 27}, serta label kategori seperti kelompok suhu panas hingga dingin yang menjadi contoh pada topik guard, case, dan if. Pola-pola itu memanfaatkan sifat atom yang selalu cocok dengan dirinya sendiri saat pencocokan.

Atom juga menjadi nama modul dan nama fungsi pada pemanggilan kalkulator:tambah(2, 3). Keduanya sebenarnya atom yang dipakai runtime untuk mencari kode. Sebaliknya, atom tidak tepat untuk data yang isinya berubah-ubah atau berjumlah besar, misalnya teks masukan pengguna, karena tiap atom unik untuk seumur hidup VM. Sejak OTP 26, atom yang tidak lagi dipakai ikut dikumpulkan sampah, tetapi batas jumlah atom yang hidup bersamaan tetap ada, sehingga mengubah masukan dinamis menjadi atom tetap bukan kebiasaan yang baik.

Ringkasan#

  • Atom adalah konstanta berupa nama, ditulis dengan huruf kecil atau di dalam kutip tunggal bila mengandung karakter khusus.
  • Operator = melakukan pencocokan dan pengikatan, bukan penugasan, sehingga satu variabel hanya diikat sekali.
  • Mengikat ulang variabel terikat dengan nilai berbeda memicu error no match of right hand side value, dan pesan itu wajar dibaca sebagai kegagalan pencocokan.
  • f(X) hanya melepas pengikatan di shell dan tidak ada padanannya di berkas .erl.
  • Nama dengan huruf kecil adalah atom, bukan variabel, sehingga x = 5. selalu gagal.
  • Atom paling tepat untuk nilai tetap berjumlah kecil: status, penanda tuple, dan nama modul atau fungsi.

Referensi#