Di Erlang From 99 Lisp Problems terdapat contoh dasar-dasar kode Erlang, namun tidak ada pembahasan bagaimana cara kerja dari kode-kode tersebut. Pada post ini saya akan membahas problem 5 dan 6. Problem 1 sampai dengan 4 bisa dibaca pada tulisan-tulisan sebelumnya termasuk simbol-simbol yang tidak saya bahas di sini (seperti [H|T], [_|T], dsb). Problem-problem yang lain akan saya bahas di lain waktu.
Problem 5.a. Reverse List
rev([]) -> [];
rev([H|T]) -> rev(T)++[H].
Input list adalah [a,b,c,d]. Program dijalankan melalui shell dengan perintah: nama_modul:rev([a,b,c,d]). Kali ini diperkenalkan append operator: ++. Contoh penggabungan 2 list menggunakan ++ adalah [1,2] ++ [3,4] = [1,2,3,4]. Cara kerja program di atas secara berurutan adalah sebagai berikut:
Catatan: Nomor berhuruf ‘a’ menggunakan fungsi rev([]) -> [], sedangkan nomor berhuruf ‘b’ menggunakan fungsi rev([H|T]) -> rev(T)++[H].
1.a. Tidak digunakan karena list tidak kosong.
1.b. rev(a,b,c,d) -> rev(b,c,d) ++ [a]
2.a. Tidak digunakan karena list tidak kosong.
2.b. rev(b,c,d) -> rev(c,d) ++ [b] ++ [a].
3.a. Tidak digunakan karena list tidak kosong.
3.b. rev(c,d) -> rev(d) ++ [c] ++ [b,a].
4.a. Tidak digunakan karena list tidak kosong.
4.b. rev(d) -> rev([]) ++ [d] ++ [c,b,a].
5.a. rev([]) -> [] ++ [d,c,b,a] -> [d,c,b,a].
5.b. Tidak digunakan karena list kosong.
Sisi kanan yang berhuruf tebal dan berwarna maroon adalah hasil sesungguhnya dari sisi kiri, sedangkan sisanya adalah penggabungan dari hasil sebelumnya.
Problem 5.b. Reverse with Tail Rec
Program ini mempunyai hasil yang sama dengan problem 5.a., hanya melalui pendekatan yang berbeda.
revtail(L) -> revt(L,[]).
revt([],L) -> L;
revt([H|T], L) -> revt(T, [H|L]).
revtail(L) akan memanggil fungsi revt(L,[]). Jadi, yang perlu dibahas adalah fungsi revt/2. Input list adalah [a,b,c,d]. Program dijalankan melalui shell dengan perintah: nama_modul:revtail([a,b,c,d]). Cara kerja program di atas secara berurutan adalah sebagai berikut:
Catatan: Nomor berhuruf ‘a’ menggunakan fungsi revt([],L) -> L, sedangkan nomor berhuruf ‘b’ menggunakan fungsi revt([H|T], L) -> revt(T, [H|L]).
1.a. Tidak cocok. revt([],L) minta argumen 1 kosong,
sedangkan argumen 1 dari revt(L,[]) tidak kosong.
1.b. revt([a,b,c,d], []) -> revt([b,c,d], [a]).
2.a. Lihat alasan 1.a.
2.b. revt([b,c,d], [a]) -> revt([c,d], [b,a]).
3.a. Lihat alasan 1.a.
3.b. revt([c,d], [b,a]) -> revt([d], [c,b,a]).
4.a. Lihat alasan 1.a.
4.b. revt([d], [c,b,a]) -> revt([], [d,c,b,a]).
5.a. revt([], [d,c,b,a]) -> [d,c,b,a].
5.b. Tidak cocok.
Problem 6. Is Palindrome
Program ini berfungsi untuk menguji bila sebuah list memiliki urutan yang sama baik dibaca dari depan maupun dari belakang.
ispalin(L) -> L =:= revtail(L).
Kali ini diperkenalkan operator =:= yang berguna untuk menguji keidentikan (test of identical).
Program ini memanggil revtail/1 yang telah saya bahas di problem 5.b. yang berfungsi untuk membalik sebuah list. Program dijalankan melalui shell dengan perintah: nama_modul:ispalin(L). dimana L adalah sebuah list. Cara kerja program di atas secara berurutan adalah sebagai berikut dan kali ini saya menggunakan 2 input sebagai perbandingan.
Input = [a,b,c,d] :
ispalin([a,b,c,d]) -> [a,b,c,d] =:= [d,c,b,a] -> false;
Input = [a,b,b,a] :
ispalin([a,b,b,a]) -> [a,b,b,a] =:= [a,b,b,a] -> true;
Sebagai bonus, mari kita lihat operator-operator dalam Erlang beserta artinya:
Operator: Artinya:
X > Y X lebih besar dari Y.
X < Y X lebih kecil dari Y.
X =< Y X sama dengan atau lebih kecil dari Y.
X >= Y X lebih besar dari atau sama dengan Y.
X == Y X sama dengan Y.
X /= Y X tidak sama dengan Y.
X =:= Y X identik dengan Y.
X =/= Y X tidak identik dengan Y.
Operator =:= mendapat perhatian khusus di sini. Operator =:= mirip dengan == pada bahasa C dan Java, sedangkan programer Delphi akan menggunakan operator =. Erlang memiliki operator ==, tapi hanya digunakan untuk membandingkan antara nilai float dan integer. Bila ada kode Erlang yang menggunakan == maka harus dicurigai dan diperiksa ulang, bisa jadi tidak menghasilkan error selama tidak melibatkan float, tetapi hampir 99% kode Erlang cenderung menggunakan =:=.