Topik ini memperkenalkan native record dari EEP-79 yang diimplementasikan pada OTP 29: sintaks deklarasinya, wujud nilainya yang benar-benar tipe baru, dukungan berbagi definisi antar modul, dan batas dukungan shell-nya. Topik ini tetap pengenalan: record tuple pada topik record tetap bentuk dominan di kode Erlang arus utama, dan native record dijalankan di sini sebagai eksperimen terpandu.
Motivasi EEP-79#
Record tuple mewarisi kelemahan tuplenya. Nama record hanya ada saat kompilasi, sehingga saat runtime jenis sebuah record tidak dapat diperiksa, pencetakan bergantung pada definisi yang dimuat, dan menambah bidang menuntut kompilasi ulang setiap modul yang memakai definisinya. Maps sebenarnya sudah menyediakan nama bidang saat runtime, tetapi wadahnya terbuka: bentuknya bebas dan biaya aksesnya lebih besar. EEP-79, yaitu Erlang Enhancement Proposal nomor 79, mengusulkan record sebagai tipe data native yang dikelola VM: nama bidang tersedia saat runtime, urutan bidang tercetak sesuai definisi, dan implementasinya terikat pada modul pendeklarasinya, dengan harapan kinerja yang lebih baik daripada maps untuk wadah berbentuk tetap. EEP-79 diimplementasikan pada rilis OTP 29.
Deklarasinya menambahkan pagar sebelum kurung kurawal dan mendukung anotasi tipe serta nilai bawaan:
-record #titik{x = 0 :: integer(), y = 0 :: integer()}.Pembuatan, akses, dan pembaruannya memakai bentuk yang sama dengan record tuple, sehingga pengetahuan topik record langsung terpakai.
Mengujinya pada OTP 29#
Modul berikut mendeklarasikan record native titik, mengekspor definisinya lewat -export_record, dan menyediakan tiga fungsi kecil:
-module(nr).
-export_record([titik]).
-export([buat/0, jumlah/1, geser/1]).
-record #titik{x = 0 :: integer(), y = 0 :: integer()}.
buat() -> #titik{x = 3}.
jumlah(T) -> T#titik.x + T#titik.y.
geser(T) -> T#titik{x = T#titik.x + 1}.Hasil eksekusinya di shell OTP 29.1.2:
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> c(nr).
{ok,nr}
2> T = nr:buat().
#nr:titik{x = 3,y = 0}
3> nr:jumlah(T).
3
4> nr:geser(T).
#nr:titik{x = 4,y = 0}Cetakan #nr:titik{x = 3,y = 0} menunjukkan dua hal: nama record menyertakan modul asalnya, dan nilai bawaan y = 0 diterapkan saat pembuatan. Akses T#titik.x dan pembaruan T#titik{...} terbaca persis seperti record tuple.
Tipe native, bukan tuple#
Wujud nilainya bisa diperiksa langsung. Nilai native record bukan tuple dan bukan map, sehingga fungsi is_tuple/1 dan is_map/1 keduanya menolaknya:
1> c(nr).
{ok,nr}
2> T = nr:buat().
#nr:titik{x = 3,y = 0}
3> is_map(T).
false
4> is_tuple(T).
false
5> rr(nr).
[]
6> #titik{y = 1}.
* 1:1: record titik undefinedDua baris terakhir memperlihatkan batas dukungan shell yang penting diketahui: rr/1 mengembalikan daftar kosong karena tidak memuat definisi record native, dan pembuatan #titik{...} langsung di shell gagal dengan pesan record titik undefined. Native record dibuat dan diakses lewat fungsi modul pendeklarasinya, bukan lewat definisi shell seperti record tuple. Konsekuensi praktisnya, modul contoh di atas menyediakan fungsi buat/0 justru karena shell tidak dapat membuatnya sendiri.
Anotasi tipe dan nilai bawaan#
Deklarasi native record menggabungkan tiga hal dalam satu baris per bidang: nama, nilai bawaan dengan =, dan anotasi tipe dengan ::. Pada record titik, bidang x dideklarasikan x = 0 :: integer(), yaitu bernilai bawaan 0 dan dianotasi bertipe bilangan bulat. Anotasi tipe tidak ditegakkan saat runtime. Modul berikut sengaja menyimpan string pada bidang yang dianotasi bilangan bulat:
-module(nr4).
-export([buat/0]).
-record #titik{x = 0 :: integer(), y = 0 :: integer()}.
buat() -> #titik{x = "abc"}.Kompilasinya lolos dan nilainya tetap masuk:
1> c(nr4).
{ok,nr4}
2> nr4:buat().
#nr4:titik{x = "abc",y = 0}Anotasi ini ditujukan untuk alat analisis statis seperti dialyzer yang membaca anotasi tipe, sebagaimana dibahas pada modul tipe dan pengujian. Nilai bawaan tetap bekerja seperti pada record tuple, dan compiler memeriksa kelengkapan sintaksnya saat kompilasi.
Berbagi definisi antar modul#
Definisi record native hanya terlihat di modulnya, dan modul lain mengimpornya secara eksplisit. Modul kedua berikut mengimpor titik dari modul nr lalu mengakses bidangnya:
-module(nr2).
-import_record(nr, [titik]).
-export([pakai/1]).
pakai(T) -> T#titik.x * 10.1> c(nr).
{ok,nr}
2> c(nr2).
{ok,nr2}
3> T = nr:buat().
#nr:titik{x = 3,y = 0}
4> nr2:pakai(T).
30Pasangan -export_record dan -import_record menggantikan kebiasaan menyimpan definisi record di berkas header .hrl yang disertakan di mana-mana. Nilai tetap berasal dari modul nr, sementara nr2 mengakses bidangnya dengan nama yang sama.
Kedudukannya di jalur ini#
Native record adalah penambahan besar pada bahasa, dan jalur ini mengajarkannya sebagai pengenalan yang teruji, bukan sebagai gaya bawaan. Dokumentasi resmi OTP 29 menandainya eksperimental dengan kemungkinan perubahan perilaku, sementara record tuple tetap menjadi bentuk yang paling umum di kode Erlang eksisting dan didukung penuh oleh shell, dialyzer, serta ekosistem pustaka. Native record layak dipertimbangkan untuk kode baru yang memang membutuhkan nama bidang saat runtime, dengan tetap mengikuti perkembangan statusnya, dan dokumentasi resminya menjadi rujukan utama saat statusnya matang.
Ringkasan#
- EEP-79 menjadikan record tipe native yang dikelola VM, dengan deklarasi -record #Nama{…}, anotasi tipe, dan nilai bawaan.
- Nilainya bukan tuple dan bukan map, dan cetakannya menyertakan nama modul asal seperti #nr:titik{…}.
- rr/1 tidak memuat definisi native record sehingga pembuatan langsung di shell gagal. Pembuatan dilakukan lewat fungsi modulnya.
- Berbagi definisi memakai pasangan -export_record dan -import_record, menggantikan kebiasaan berkas .hrl untuk record ini.
- Record tuple tetap bentuk dominan di kode arus utama. Native record diikuti sebagai pengenalan.
Referensi#
- EEP 79: Native Records — Erlang Enhancement Process — Proposal resmi yang mendefinisikan sintaks dan motivasi native record.
- Erlang/OTP 29 Highlights — Ericsson — Rangkuman resmi fitur OTP 29 beserta status eksperimental native record.
- Erlang Reference Manual: Records — Ericsson — Perbandingan resmi record tuple yang tetap menjadi bentuk utama.