Kali ini saya akan memberikan sedikit materi tentang lisp.
disadur dari Diktat LISP fungsional
NOTASI FUNGSIONAL
Sebuah program komputer adalah “model”, yang mewakili solusi persoalan tertentu dalam informatik yang akan diselesaikan dengan komputer. Program berisi kumpulan informasi penting yang mewakili persoalan itu.
Pada paradigma pemrograman fungsional solusi persoalan diungkapkan menjadi identifikasi dari satu atau beberapa fungsi, yang jika di"aplikasi" dengan nilai yang diberikan akan memberikan hasil yang diharapkan. Dalam paradigma fungsional, program direpresentasi dalam: himpunan nilai type, dengan nilai-nilai dari type adalah konstanta.
Fungsi adalah asosiasi (pemetaan) antara dua type yaitu domain dan range, yang dapat berupa :
• type dasar
• type terkomposisi (bentukan)
Untuk menuliskan suatu program fungsional, dipakai suatu bahasa ekspresi .
Ada tiga macam bentuk komposisi ekspresi :
• ekspresi fungsional dasar
• konditional
• rekursif
Masing-masing ekspresi akan dibahas pada bagian selanjutnya.
Untuk sebagian besar pembaca yang sudah memahami bagaimana memprogram secara prosedural, berikut ini diberikan ilustrasi mengenai perbedaan antara program fungsional dengan program imperatif (prosedural). Bagi yang belum pernah mempelajari program prosedural, bagian ini dapat diloncati tanpa mengubah alur pemahaman
Perhatikan sebuah program yang ditulis dalam bahasa algoritmik sebagai berikut :
PROGRAM PLUSAB
{ Membaca dua buah nilai a dan b integer, menghitung jumlahnya dan menuliskan hasilnya }
Kamus : a,b : integer
Algoritma :
input (a,b)
output (a+b)
Program tersebut mengandung instruksi pembacaan nilai (input) dan penulisan hasil (output). Program akan menunggu aksi pembacaan dilakukan, melakukan kalkulasi dan akan mencetak hasil. Ada suatu sekuens (urut-urutan) aksi yang dilakukan.
Kelakuan (behaviour) dari program fungsional berbeda. Dalam pemrograman Fungsional tidak ada 'aksi' menggunakan baca/tulis atau mengubah state.
Pada konsteks fungsional, ekivalensi dari program diatas adalah pemakai mengetik 3+4 sistem menghasilkan 7. Semua yang dilakukan pemakai ini telah mewakili aksi baca/tulis pada program "aksional" (berdasarkan “aksi”, action)
Pemrograman fungsional didasari atas analisa top down:
1. Problema
2. Spesifikasi
3. Dekomposisi pada persoalan "antara", berarti menciptakan sebuah fungsi antara
Fungsi pada analisa topdown adalah strukturasi teks. Sebuah fungsi mewakili sebuah tingkatan abstraksi. Dengan mengenalkan (mendefinisikan) sebuah fungsi, maka pemrogram memperkaya “khasanah”, perbendaharaan dari fungsi yang tersedia, dan karena sudah didaftarkan maka dapat digunakan kemudian.
Konstruksi program fungsional : definisi-spesifikasi-realisasi-aplikasi
Tahapan Deskripsi
Definisi Kata kuncinya adalah memberikan identitas fungsi, yaitu menentukan nama, domain dan range.
Contoh: untuk memangkatkan sebuah bilangan integer dengan tiga, didefinisikan nama Pangkat3, dengan domain integer dan range adalah integer. Dituliskan Pangkat3 : integer → integer
Spesifikasi Kata kuncinya adalah menentukan “apa” yang dilakukan oleh fungsi, yaitu menentukan 'arti" dari fungsi.
Contoh : Fungsi bernama Pangkat3(x) artinya menghitung pangkat tiga dari nilai x .
Realisasi Kata kuncinya adalah menentukan “bagaimana” fungsi melakukan komputasi, yaitu mengasosiasikan pada nama fungsi, sebuah ekspresi fungsional dengan parameter formal yang cocok.
Contoh : mengasosiasikan pada Pangkat Tiga : a*a*a atau a3 dengan a adalah nama parameter formal. Parameter formal fungsi adalah nama yang dipilih untuk mengasosiasikan domain dan range.
Aplikasi Adalah memakai fungsi untuk melakukan komputasi, atau memakainya dalam suatu ekspresi, yaitu dengan menggantikan semua nama parameter formal dengan nilai. Dengan aplikasi fungsi, akan dilakukan evaluasi ekspresi fungsional.Contoh : Pangkat Tiga (2) + Pangkat Tiga (3) Argumen pada saat dilakukan aplikasi fungsi disebut parameter aktual
Pada perkuliahan ini dipakai suatu notasi untuk menuliskan program fungsional yang disebut sebagai notasi fungsional. Dengan notasi fungsional, teks terdiri dari judul dan empat bagian sesuai dengan tahapan pemrograman di atas.
Bagian pertama adalah “header” (judul program), yang berisi Judul Fungsi deskripsi sangat ringkas dari fungsi dan nama serta parameter formalnya. Bagian ini cukup memberikan penjelasan bagi pemakai fungsi andaikata sudah pernah direalisasikan. Bagian kedua berisi definisi dan spesifikasi fungsi sesuai dengan keterangan di atas.; kedua ini (definisi dan spesifikasi) tidak dipisahkan satu sama lain karena sangat erat kaitannya.
Bagian ketiga berisi realisasi fungsi, yaitu ekspresi fungsional yang ditulis untuk mencapai spesifikasi yang dimaksudkan. Sebuah definisi dan spesifikasi yang sama dapat direalisasikan dalam beberapa ekspresi ! Perhatikanlah pula bahwa dalam realisasi fungsi, nama fungsi dituliskan berikut ekspresinya. Tidak diperlukan kata kunci “fungsi” karena dalam konteks fungsional, semua objek adalah fungsi.
Bagian keempat berisi contoh aplikasi fungsi, jika dipandang perlu, dan bahkan hasilnya. Bagian inilah yang sebenarnya akan merupakan interaksi langsung dengan pemakai pada konsteks eksekusi.
Bagian teks yang berupa komentar dituliskan di antara kurung kurawal
Notasi fungsional ini dibuat untuk menuliskan rancangan program supaya lebih mudah dibaca oleh “manusia”.
Berikut ini adalah contoh generik (template) teks program dalam notasi fungsional
JUDUL Nama-Fungsi (list parameter formal) Bagian I
DEFINISI DAN SPESIFIKASI
Nama-Fungsi : domain → range Bagian II
{Tuliskanlah spesifikasi fungsi yang nama, domain dan range nya disebut di atas
}
REALISASI Bagian III
Nama-Fungsi (list parameter) :
APLIKASI
⇒ Nama-Fungsi (list parameter aktual) Bagian IV
⇒ Nama-Fungsi (list parameter aktual)
⇒ Nama-Fungsi (list parameter aktual)
Lihatlah contoh dari penggunaan notasi ini pada bagian berikutnya Seluruh sisa buku ini akan memakai notasi seperti di atas.
Notasi fungsional ini diadopsi dari [3] dan dikembangkan khusus untuk perkuliahan ini, dan mampu menampung semua konsep pemrograman fungsional, walaupun tidak mungkin dieksekusi (karena tidak mempunyai pemroses bahasa). Kekuatan aspek konseptual, statis dan aspek desain ini justru diperoleh karena ketiaadaan dari eksekutor.
Perancang dibebaskan dari keterbatasan bahasa, terutama aspek eksekusi yang dinamik.
Akibatnya perancang harus berpikir untuk mendapatkan solusi yang secara statik benar.
Karena tidak mempunyai eksekutor, maka notasi ini harus dilengkapi dengan aturan translasi ke bahasa riil yang ada. Buku kedua akan melengkapi notasi ini dengan aturan translasi ke LISP.
Kebanyakan bahasa fungsional mempunyai notasi penulisan yang lebih rumit dan tidak sesuai dengan kebiasaan sehari-hari (misalnya notasi prefix). Penulisan program langsung ke dalam bahasa fungsional terutama bagi pemula akan sangat membingungkan dan berpotensi menimbulkan kesalahan sintaks. Notasi fungsional dibuat untuk mempermudaj dalam menentukan solusi. Setelah solusi didapat, translasi ke bahasa fungsional dapat dilakukan secara “mekanistis”.
EKSPRESI DASAR
Seperti telah dijelaskan pada bagian pendahuluan, pada pemrograman fungsional, pemrogram mulai dari fungsi dasar yang disediakan oleh pemroses bahasa untuk membuat fungsi lain yang melakukan aplikasi terhadap fungsi dasar tersebut.
Fungsi yang paling dasar pada program fungsional disebut operator. Pada ekspresi fungsional, sebagai “titik awal”, dinyatakan bahwa tersedia operator aritmatika, operator relasional dan operator boolean.
Jenis operator Notasi Deskripsi
Operator aritmatika *, /, + -
mod
div Berlaku untuk operan numerik. untuk melakukan perhitungan Selain operator aritmatika tsb, diasumsikan pula tersedia fungsi dasar perhitungan bilangan “integer” seperti abs, mod, div. Dengan operator sederhana dan fungsi dasar tersebut, akan diberikan contoh-contoh pengembangan program fungsional yang hanya membutuhkan ekspresi aritmatika tersebut.
Operator relasional <, >, =, ≤, ≥ , ≠ Berlaku untuk operan numerik atau
karakter, hasilnya adalah boolean
Operator boolean and , or Berlaku untuk operan boolean, sesuai dengan definisi and dan or pada aljabar boolean
Ekspresi adalah sebuah teks yang terdiri dari: nama, simbol, operator, fungsi, ( ), yang dapat menghasilkan suatu nilai berkat evaluasi dari ekspresi.
Ekspresi aritmatika (numerik), adalah ekspresi dengan operator aritmatika ‘*’, ‘/’, ‘+, ‘-’ dapat dituliskan dalam bentuk infix, prefix atau postfix. Pada notasi fungsional, jenis ekspresi yang dipakai adalah Infix, karena lebih manusiawi.
Jenis Ekspresi aritmatika Ekspresi boolean
Infix (3+4)*5 3 < 5
Prefix (* (+ 3 4) 5) < 3 5
Postfix (3 4 + ) 5 * 3 5 >
Ekspresi di atas tidak mengandung nama, melainkan hanya mengandung simbol angka numerik, operator dan tanda kurung
Hasil evaluasi (perhitungan) suatu ekspresi dasar dapat berupa nilai numerik atau boolean. Ekspresi yang hasilnya numerik disebut ekspresi numerik (aritmatika). Ekspresi yang hasilnya boolean disebut ekspresi boolean. Jika sebuah ekspresi boolean operatornya numerik, disebut pula ekspresi relasional.
Selain menggunakan konstanta numerik tersebut, ekspresi dapat berupa ekspresi aljabar :
- abstraksi dengan menggunakan "nama"
- nama mempunyai "nilai"
yang hanya mengandung operator aritmatika.
Evaluasi ekspresi tergantung kepada presedensi (prioritas evaluasi) dan aturan yang ditetapkan.
Contoh :
a3 : Evaluasi hanya mungkin terjadi jika a diberi nilai (diaplikasi)
3+4*5 dengan aturan presedensi * yang lebih tinggi dari + maka akan dievaluasi sebagai 3 + (4*5)
Fungsi dengan hasil nilai boolean disebut PREDIKAT, dan namanya biasanya diawali dengan “Is”. Contoh: IsAnA?: character → boolean yang bernilai benar jika C adalah karakter ‘A’
Berikut ini diberikan contoh-contoh persoalan yang dapat diselesaikan secara fungsional hanya dengan membuat ekspresi dasar fungsional, yaitu dengan operator aritmatika, operator relasional, operator boolean dan fungsi dasar terhadap bilangan seperti mod, div, abs.
Pada hakekatnya, fungsi akan menghasilkan suatu nilai karena di dalam fungsi tsb dilakukan evaluasi ekspresi.
Contoh-1 Ekspresi numerik : PANGKAT DUA
Persoalan :
Buatlah definisi, spesifikasi dan realisasi dari sebuah fungsi yang menerima sebuah bilangan bulat dan menghasilkan pangkat dua dari bilangan tersebut dengan menuliskan ekspresi yang hanya mengandung operator ekspresi aritmatika yang telah didefinisikan
PANGKAT2 FX2(x)
DEFINISI DAN SPESIFIKASI
FX2 : integer → integer
{FX2 (x) menghitung pangkat dua dari x, sebuah bilangan integer }
REALISASI
FX2 (x) : x * x
APLIKASI
⇒ FX2(1)
⇒ FX2(0)
⇒ FX2(-1)
Contoh-2 Ekspresi numerik: PANGKAT TIGA
Persoalan :
Buatlah definisi, spesifikasi dan realisasi dari sebuah fungsi yang menerima sebuah bilangan bulat dan menghasilkan pangkat tiga dari bilangan tersebut dengan menuliskan ekspresi yang hanya mengandung operator ekspresi aritmatika yang telah didefinisikan
PANGKAT3 (versi-1) FX3(x)
DEFINISI DAN SPESIFIKASI
FX3 : integer → integer
{FX3 (x) menghitung pangkat tiga dari x, sebuah bilangan integer }
REALISASI
FX3 (x) : x * x * x
APLIKASI
⇒ FX3(1)
⇒ FX3(8) ⇒ FX3(-1)
Contoh-2 Ekspresi numerik: PANGKAT3 (dengan fungsi antara)
Persoalan :
Buatlah definisi, spesifikasi dan realisasi dari sebuah fungsi yang menerima sebuah bilangan bulat dan menghasilkan pangkat tiga dari bilangan tersebut dengan menuliskan ekspresi yang hanya mengandung ekspresi perkalian dan aplikasi terhadap fungsi PANGKAT2 yang telah didefinisikan.
PANGKAT3 (versi 2) FX3(x)
DEFINISI DAN SPESIFIKASI
FX3 : integer → integer
{FX3 (x) menghitung pangkat tiga a dari x, sebuah bilangan integer, dengan aplikasi FX2 sebagai fungsi antara}
FX2 : integer → integer
{FX2 (x) menghitung pangkat dua dari x, sebuah bilangan integer }
REALISASI
FX3 (x) : x * FX2(x)
APLIKASI
⇒ FX3(8)
⇒ FX3(1)
⇒ FX3(-1)
Contoh-3 Ekspresi dengan analisa bottom up: realisasi MAX3, jika dipunyai MAX2
Persoalan :
Buatlah definisi, spesifikasi dan realisasi dari sebuah fungsi yang menerima tiga buah bilangan bulat dan menghasilkan nilai maksimum dari ketiga bilangan tersebut dengan melakukan aplikasi terhadap MAX2 yang telah didefinisikan.
MAKSIMUM 3 BILANGAN INTEGER MAX3(a,b,c)
DEFINISI DAN SPESIFIKASI
MAX3 : 3 integer → integer
{MAX3 (a,b,c ) menentukan nilai maksimum dari 3 bilangan integer a,b, dan c} MAX2 : 2 integer → integer
{MAX2 (a,b) menentukan nilai maksimum dua buah bilangan integer a dan b}
REALISASI
{ Realisasi MAX2(a,b) pada contoh yang lain }Catatan :
MAX3 (a,b,c) : MAX2( MAX2(a,b),c)
APLIKASI
⇒ MAX3(8,1,2)
⇒ MAX3(8,10,-2) ⇒ MAX3(0,0,0)
Beberapa fungsi seperti MAX3 yang mempunyai definisi dan arti semantik yang sama direalisasi dengan nama yang sama. Pada dunia nyata, akan terjadi konflik nama, karena sebuah nama hanya boleh muncul secara unik dalam suatu “univers” (lingkungan tertentu). Jangan lupa melakukan penamaan berbeda jika melakukan translasi ke bahasa pemrograman nyata, dianjurkan dengan mempertahankan nama asli, kemudian identifikasi versi misalnya MAX3v1, MAX3v2, dan seterusnya.
Contoh-4 Ekspresi numerik: Mean Olympique (MO)
Persoalan :
Definisikan sebuah fungsi yang menerima 4 bilangan bulat positif, menghasilkan harga rata-rata dari dua di antara empat buah bilangan tersebut, dengan mengabaikan nilai terbesar dan nilai terkecil.
Contoh : 10,8,12,14 = 11; 12,12,12,12 = 12
a. Definisi : menentukan nama fungsi, domain dan range
MO : 4 bilangan bulat >0 → real { Nama fungsi : MO }
{ Domain : 4 buah bilangan bulat }
{ Range : bilangan riil }
Contoh : MO (10,8,12,14) = 11
b. Realisasi dari definisi tersebut dapat dilakukan, misalnya berdasarkan tiga buah ide sebagai berikut :
a. SORT : urutkan mengecil, buang terbesar + terkecil hitung rata-rata dari 2 sisanya.
b. Buang Maksimum dan Minimum : buang tebesar buang terkecil
hitung rata-rata dari yang tersisa
c. Kalkulasi : MO = jumlah ke empat angka, dikurangi dengan terbesar
dikurangi dengan terkecil
Ide pertama (SORT) dan kedua (Buang nilai, kalkulasi) adalah aksional dan harus dilakukan secara “sekuensial”, berurutan. Untuk memecahkan persoalan ini dibutuhkan urut-urutan aksi.
Berikut ini adalah program fungsional untuk realisasi dengan ide kalkulasi, yaitu ide yang ke tiga, dengan hanya menuliskan ekspresi fungsional dasar, yang dapat menghasilkan nilai rata-rata 4 buah bilangan, tanpa bilangan terbesar dan tanpa bilangan terkecil yang diinginkan
Perhatikan bahwa kalkulasi untuk menghasilkan nilai terbesar dan terkecil dari dua buah bilangan dapat dilakukan dengan suatu ekspresi aritmatika, yang tentunya memerlukan pengetahuan mengenai “rumus” yang dipakai.
Sedangkan maksimum dari 4 buah bilangan ditentukan dengan membandingkan nilai maksimum dari dua bilangan, dengan cara mencari maksimum dari maksimum yang diperoleh terhadap dua buah integer. Demikian pula dengan nilai minimum.
MEAN-OLYMPIQUE MO (u,v,w,x)
DEFINISI DAN SPESIFIKASI
MO : 4 integer > 0 → real
{ MO (u,v,w,x): menghitung rata-rata dari dua buah bilangan integer, yang bukan maksimum dan bukan minimum dari 4 buah integer: (u+v+w+x-min4 (u,v,w,x)-max4
(u,v,w,x))/2
max4 : 4 integer >0 → integer
{max4 (i,j,k,l) menentukan maksimum dari 4 buah bilangan integer}
min4 : 4 integer > 0 → integer
{min4 (i,j,k,l) menentukan minimum dari 4 buah bilangan integer}
max2 : 2 integer >0 → integer
{max2 (a,b) menentukan maksimum dari 2 bilangan intege, hanya dengan ekspresi aritmatika: jumlah dari kedua bilangan ditambah denganselisih kedua bilangan, hasilnya dibagi 2}
min2 : 2 integer > 0 → integer
{min2 (a,b) menentukan minimum dari 2 bilangan integer, , hanya dengan ekspresi aritmatika :jumlah dari kedua bilangan – selisih kedua bilangan , hasilnya dibagi 2}
REALISASI
max2 (a,b) : (a + b + abs(a - b))/2 min2 (a,b) : (a + b - abs(a - b))/2 max4 (i,j,k,l) : max2(max2(i,j),max2(k,l)) min4 (i,j,k,l) : min2(min2(i,j),min2(k,l))
MO(u,v,w,x): (u+v+w+x-min4(u,v,w,x)- max4(u,v,w,x))/2
APLIKASI
⇒ MO(8,12,10,20)Contoh-5 Ekspresi boolean : POSITIF
Persoalan :
Buatlah definisi, spesifikasi dan realisasi dari sebuah predikat yang menerima sebuah bilangan bulat dan bernilai benar jika bilangan tersebut positif. Lebih spesifik : menghasilkan sebuah nilai boolean yang bernilai true jika bilangan tersebut positif, atau false jika bilangan tersebut negatif.
POSITIF IsPositif?(x)
DEFINISI DAN SPESIFIKASI
IsPositif? : integer → boolean
{IsPositif? (x) benar jika x positif }
REALISASI
IsPositif?(x) : x ≥ 0
APLIKASI
⇒ IsPositif?(1)
⇒ IsPositif? (0)
⇒ IsPositif? (-1)
Contoh-6 Ekspresi boolean : APAKAH HURUF A
Persoalan :
Buatlah definisi, spesifikasi dan realisasi dari sebuah predikat yang menerima sebuah karakter dan bernilai benar jika karakter tersebut adalah huruf ‘A’.
APAKAH HURUF A IsAnA?(C)
DEFINISI DAN SPESIFIKASI
IsAnA : character → boolean
{IsAnA (C) benar jika c adalah karakter (huruf) ‘A’ }
REALISASI
IsAnA?(c) : c = ‘A’
APLIKASI
⇒ IsAnA?(1)
⇒ IsAnA? (0)
⇒ IsAnA? (-1)
Contoh-7 Ekspresi boolean : APAKAH ORIGIN
Persoalan :
Buatlah definisi, spesifikasi dan realisasi dan contoh aplikasi dari sebuah predikat yang menerima dua buah bilangan riil yang interpretasinya adalah absis dan ordinat pada sumbu kartesian, dan mengirimkan apakah absis dan ordinat tersebut merupakan titik O(0,0)
APAKAH ORIGIN IsOrigin?(x,y)
DEFINISI DAN SPESIFIKASIREALISASI
IsOrigin? : real, real → boolean
{IsOrigin? (x,y) benar jika (x,y) adalah dua nilai yang mewakili titik origin (0,0) }
IsOrigin?(x,y) : x=0 and y=0
APLIKASI
⇒ IsOrigin?(1,0)
⇒ IsOrigin? (1,1)
⇒ IsOrigin? (0,0)
Contoh-7 Ekspresi boolean dengan operator boolean: APAKAH VALID
Persoalan :
Buatlah definisi, spesifikasi dan realisasi dari sebuah predikat yang menerima sebuah besaran integer, dan menentukan apakah bilangan tersebut valid. Bilangan disebut valid jika nilainya lebih kecil dari 5 atau lebih besar dari 500. Jadi bilangan di antara 5 dan 500 tidak valid.
APAKAH VALID IsValid?(x)
DEFINISI DAN SPESIFIKASI
IsValid? : integer → boolean
{IsValid? (x) benar jika (x) bernilai lebih kecil 5 atau lebih besar dari 500 }
REALISASI
IsValid?(x) : x <5 or="" x="">500 5>
APLIKASI
⇒ IsValid?(5)
⇒ IsValid? (0)
⇒ IsValid? (500) ⇒ IsValid? (6000)
Evaluasi Fungsi
Evaluasi fungsi :
Suatu ekspresi dituliskan dan dihitung hasilnya (dievaluasi) sesuai dengan aturan pemroses bahasanya. Operator dapat dianggap sebagai fungsi yang paling dasar yang dipunyai oleh bahasa. Lihat penulisan dalam bentuk prefix:
* 2 3
yang dapat kita pandang sebagai “fungsi” *(2,3) dalam notasi fungsional.
Evaluasi ekspresi dalam konteks fungsional adalah melakukan aplikasi fungsi sambil melakukan evaluasi dari ekspresi yang mengandung operan. Karena sebuah ekspresi dapat mengandung lebih dari satu operan dan aplikasi fungsi, maka urutan dari evaluasi dapat bermacam-macam dan prioritas dari operan menentukan urutan evaluasi. Untuk ketepatan evaluasi dari ekspresi yang mengandung operan, disarankan untuk menuliskan tanda kurung secara eksplisit. Untuk evaluasi yang dilakukan berdasarkan aplikasi fungsi, kita harus mempelajari aturan evaluasi dari bahasa yang bersangkutan.
Contoh-1 Evaluasi fungsi :
Persoalan :
Buatlah definisi, spesifikasi dan realisasi dari sebuah fungsi yang menrima empat buah bilangan riil yang pengertiannya adalah dua pasang titik pada koordinat kartesian, dan menghasilkan sebuah bilangan riil yang merupakan jarak dari kedua titik tersebut (atau panjang garis yang dibentuk oleh kedua titik tersebut), dengan melakukan aplikasi terhadap dua buah fungsi antara yang harus didefinisikan terlebih dulu sebagai berikut : dif2 adalah sebuah fungsi yang menerima dua buah bilangan riil dan menghasilkan pangkat dua dari selisih kedua bilangan riil tersebut. Pangkat dua dilakukan oleh fungsi quad yang menerima sebuah bilangan riil dan menghasilkan pangkat dua dari bilangan riil tersebut
JARAK2TITIK, Least Square LS(x1,x2,y1,y2)
DEFINISI DAN SPESIFIKASI
LS : 4 real → real
{LS(x1,x2,y1,y2) adalah jarak antara dua buah titik (x1,x2) dengan (y1,y2) }
DEFINISI DAN SPESIFIKASI FUNGSI ANTARA dif2 : 2 real → real
{dif(x,y) adalah kuadrat dari selisih antara x dan y }
FX2 : real → real
{ FX2 (x) adalah hasil kuadrat dari x }
REALISASI
FX2 (x) : x * x dif2 (x,y) : FX2(x - y)
LS (X1,y1,x2,y2):V dif2(y2,y1) + dif2(x2,x1)
Berikut ini diberikan contoh perhitungan yang dilakukan oleh “pemroses bahasa” pada saat aplikasi, yaitu jika evaluasi dilakukan darikiri ke kanan.
Evaluasi LS (1,3,5,6)
--> V dif2(6,3) + dif2(5,1) {pilih dif(6,3) untuk dievaluasi dulu }
--> V FX2(6-3) + dif2(5,1) {expansi dif(6,3)}
--> V FX2(3) + dif2(5,1) {reduksi,hasil evaluasi -}
--> V 3 * 3 + dif2(5,1) {ekspansi quad(3)}
--> V 9 + dif2(5,1) {reduksi *}
--> V 9 + FX2(5-1) {ekspansi dif(5,1)}
--> V 9 – FX2(4) {reduksi -}
--> V 9 + 4 * 4 {ekspansi quad(4)}
--> V 9 + 16 {reduksi *}
--> V 25 {reduksi +}
--> 5 {reduksi V }
Jika ekspresi mengandung aplikasi dari beberapa fungsi, secara teoritis beberapa evaluasi dapat dilakukan secara paralel karena evaluasi suatu fungsi asalakan parameternya siap dipakai akan dapat dilakukan secara independent terhadap evaluasi fungsi yang lain.
Perhatikan urut-urutan evaluasi yang dilakukan di atas adalah berdasarkan “pilihan” dari pemroses. Untuk bahasa pemrograman fungsional yang nyata (misalnya LISP), perlu dipelajari urutan evaluasi yang dilakukan supaya didapatkan hasil yang sesuai dengan yang diinginkan. Urutan evaluasi seperti contoh di atas bahkan tidak mungkin diatur dengan menuliskan tanda kurung. Hal ini secara spesifik akan diuraikan pada Bagian kedua buku ini.
Selanjutnya, pada bagian ke satu, fokus kita adalah pada definisi dan realisasi fungsi yang hasilnya benar sesuai kaidah aritmatika. Untuk contoh di atas: operator + dalam aritmatika adalah operator yang komunitatif: a+b=b+a. Sebaiknya konstruksi dari program fungsional dibuat tidak tergantung (atau sesedikit mungkin tergantung) pada urutan evaluasi. Misalnya untuk suatu ekspresi aritmatika, jika mungkin, dituliskan di antara tanda kurung.
Ekspresi Bernama, Nama Antara
Suatu ekspresi “antara”, yaitu ekspresi yang dituliskan untuk sementara di dalam fungsi namun tidak dikomunikasikan ke dunia luar fungsi tersebut, dapat diberi nama (yang bukan merupakan nama fungsi). Nama ini hanya berlaku sementara di “dalam” sebuah fungsi.
Pemakaian fungsi atau nama antara tergantung pada generalitas solusi yang kita inginkan.
Fungsi selalu dapat digunakan dalam konteks lain.
Type dari nama lokal yang dipakai menyimpan hasil ekspresi tidak perlu dinyatakan secara eksplisit. Type dapat dideduksi dari operator ekspresi.
Bentuk umum
: let = in
dengan :
• Nama-Fungsi adalah Nama Fungsi yang direalisasi
• Nama adalah nama sementara bersifat “lokal” yang dipakai untuk menyimpan hasil evaluasi Ekspresi dan nilai hanya terdefinisi pada lingkup let di mana Fungsi tersebut direalisasi
• Ekspresi adalah suatu ekspresi fungsional
• Realisasi-Fungsi adalah Ekspresi Fungsional, realisasi dari Nama-Fungsi
lingkup
Cara Evaluasi pada umumnya: untuk semua nilai i, evaluasi
Pemakaian let
Pemakaian let ... in... adalah untuk :
• menghindari evaluasi berulang-ulang.
• menjadikan program lebih mudah dibaca
Menghindari evaluasi yang berulang
Misalnya dalam ekspresi (1+a*b) * (1-2*a*b) harus dilakukan evaluasi a * b sebanyak dua kali
Untuk menghindari evaluasi berulang dapat ditulis :
Memudahkan interpretasi/pembacaan teks program :
membingungkan (beberapa bahasa bahkan menganggap sama dan menimbulkan konflik)
Let yang mengandung Let
Suatu blok let dapat mengandung blok let di dalamnya, dituliskan sebagai berikut :
Dalam hal ini, Konteks/scope harus diperhatikan Perhatikan Contoh berikut yang “membingungkan” :
Sebaiknya semua nama lokal tidak sama dengan nama parameter formal.
Tidak ada komentar:
Posting Komentar