Topik ini membahas pencocokan pola (pattern matching) sebagai mekanisme sentral Erlang: bagaimana pola menguraikan tuple dan list, apa yang terjadi saat pencocokan gagal, dan bagaimana klausa fungsi memakai pola untuk memilih cabang eksekusi. Setelah membaca, operator =, struktur data bertingkat, dan definisi fungsi berklausa dapat dibaca sebagai satu mekanisme yang sama.
Pencocokan pada pengikatan#
Operator = mencocokkan pola di sisi kiri dengan nilai di sisi kanan. Bila polanya variabel bebas, variabel itu terikat. Bila pola berisi struktur, struktur itu diuraikan. Sesi berikut menunjukkan keduanya:
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> X = 5.
5
2> {A, B} = {1, 2}.
{1,2}
3> A.
1
4> B.
2Pola {A, B} cocok dengan tuple dua elemen, sehingga A terikat 1 dan B terikat 2 dalam satu ekspresi. Pencocokan ini berlaku pada struktur yang bersarang sedalam apa pun: pola {ok, {Nama, Nilai}} menguraikan dua tingkat sekaligus, selama bentuk sisi kanan persis sama dengan polanya. Literal pada pola wajib cocok persis, misalnya pola {ok, N} hanya menerima tuple yang elemen pertamanya adalah atom ok.
Menguraikan list#
Pola list paling penting adalah [Kepala | Ekor] yang memisahkan elemen pertama dari sisanya. Pola inilah tulang punggung rekursi pada modul Rekursi dan list:
5> [K | S] = [10, 20, 30].
[10,20,30]
6> K.
10
7> S.
[20,30]
8> {ok, Nilai} = {ok, 42}.
{ok,42}
9> Nilai.
42K terikat dengan elemen pertama, sedangkan S menampung sisa list yang masih berupa list sah, yaitu [20,30]. Baris ke-8 memperlihatkan gabungan pola literal ok dan variabel Nilai: atom ok wajib sama, dan 42 masuk ke Nilai. Pola semacam {ok, Nilai} dan {error, Alasan} adalah idiom standar Erlang untuk melaporkan hasil operasi.
Pola bersarang dan variabel tanpa nama#
Pola boleh disusun bertingkat sampai semua bagian yang diperlukan tertangkap dalam satu ekspresi. Contoh berikut menguraikan hasil bertanda yang isinya tuple dua elemen:
1> {ok, {Bulan, Tahun}} = {ok, {11, 2024}}.
{ok,{11,2024}}
2> Bulan.
11
3> Tahun.
2024
4> _ = 99.
99
5> {_, Angka} = {7, 8}.
{7,8}
6> Angka.
8Satu ekspresi mengikat dua variabel sekaligus tanpa langkah perantara. Variabel tanpa nama _ menampung nilai tanpa mengikatnya, sehingga posisi yang tidak diminati tetap diperiksa bentuknya tetapi tidak memakai nama variabel. Bentuk _Angka bekerja serupa namun tetap mengikat, berguna saat nilai perlu disimpan meski tidak dibaca, dan nama itu mencegah peringatan compiler atas variabel yang tak terpakai.
Sisi kiri pencocokan adalah pola, bukan ekspresi: fungsi tidak boleh dipanggil di sana, dan satu-satunya bentuk yang sah adalah struktur, literal, dan variabel. Bila perbandingan nilai diperlukan, tempatnya adalah guard yang dibahas pada topik guard, case, dan if di modul ini.
Variabel yang sama muncul dua kali#
Satu variabel boleh muncul lebih dari satu kali dalam satu pola, dan saat itu pencocokan menuntut semua posisinya bernilai sama. Posisi pertama mengikat atau membandingkan, posisi berikutnya langsung menuntut kesamaan:
1> {U, U} = {1, 1}.
{1,1}
2> {V, V} = {1, 2}.
** exception error: no match of right hand side value {1,2}
3> X = 4.
4
4> Y = 4.
4
5> X = Y.
4Pola {U, U} berhasil pada {1, 1} karena kedua posisinya sama, dan gagal pada {1, 2} sebagaimana terlihat di baris kedua. Baris kelima menunjukkan aturan yang sama pada pengikatan biasa: X dan Y sudah terikat, sehingga X = Y berfungsi sebagai pembanding kesetaraan dan menghasilkan nilai yang cocok itu. Mekanisme ini berguna untuk menuntut kesamaan antar posisi tanpa guard tambahan.
Ketika pola gagal#
Pencocokan yang gagal bukan bernilai false, melainkan langsung memicu error. Bila bentuk polanya berbeda dari nilai yang dibandingkan, pesannya menyebutkan nilai sisi kanan:
10> {P, Q} = {1}.
** exception error: no match of right hand side value {1}Pola {P, Q} menuntut tuple dua elemen, sedangkan nilai kanannya adalah tuple satu elemen {1}, sehingga pencocokan gagal dan error no match of right hand side value muncul. Gagalnya pencocokan di dalam fungsi memicu error function_clause, sebagaimana akan terlihat pada contoh modul di bawah. Kegagalan ini bukan hal yang ditakuti, melainkan sinyal desain: pola yang diterima fungsi dinyatakan eksplisit di klausa-klausanya.
Pencocokan pada klausa fungsi#
Kekuatan pencocokan paling terlihat pada definisi fungsi. Satu fungsi boleh memiliki banyak klausa, dan tiap klausa membawa polanya sendiri. Erlang mencoba klausa dari atas ke bawah dan memakai yang pertama cocok. Modul berikut menentukan bobot pengiriman berdasarkan tag tuple:
-module(paket).
-export([bobot/1]).
bobot({surat, Berat}) -> Berat;
bobot({paket, Berat}) -> Berat * 2.Fungsi bobot/1 memiliki dua klausa. Klausa pertama menerima tuple bertag surat dan mengembalikan beratnya apa adanya, sedangkan klausa kedua menerima tuple bertag paket dan menggandakan beratnya. Hasil eksekusinya di shell:
1> c(paket).
{ok,paket}
2> paket:bobot({surat, 300}).
300
3> paket:bobot({paket, 300}).
600Pemanggilan dengan {surat, 300} jatuh ke klausa pertama dan menghasilkan 300, sedangkan {paket, 300} jatuh ke klausa kedua dan menghasilkan 600. Pemanggil yang tidak melihat isi fungsi tetap bisa menebak perilakunya dari pola-pola yang tercantum, karena pola pada klausa sekaligus menjadi dokumentasi bentuk data yang diterima.
Apabila tidak ada klausa yang cocok, error function_clause muncul dan VM menunjukkan modul serta barisnya. Konvensi terkait adalah menambahkan klausa cadangan _ bila kasus tak terduga memang diperkenankan, atau membiarkan error terjadi bila nilai di luar pola justru merupakan pelanggaran kontrak.
Ringkasan#
- Operator = mencocokkan pola dengan nilai: variabel bebas terikat, literal wajib sama, dan struktur diuraikan sedalam apa pun tingkatannya.
- Pola [Kepala | Ekor] memisahkan elemen pertama list dari sisanya dan menjadi dasar rekursi list.
- Pencocokan yang gagal memicu error, bukan nilai false, dan pesannya menyebutkan nilai sisi kanan.
- Fungsi berklausa memakai pola untuk memilih cabang eksekusi dari atas ke bawah, dan pola itu sekaligus mendokumentasikan bentuk datanya.
- Bila tidak ada klausa yang cocok, error function_clause muncul beserta lokasi modul dan barisnya.
Referensi#
- Erlang Reference Manual: Patterns — Ericsson — Dokumentasi resmi bentuk pola yang sah dan tempat-tempat pencocokan terjadi.
- Erlang Reference Manual: Expressions — Ericsson — Aturan operator pencocokan pada ekspresi.
- Learn You Some Erlang for Great Good! — Fred Hebert — Bab yang memperkenalkan pencocokan pola pada fungsi berklausa.