Fungsional - Closure
Pendahuluan
Pendahuluan mengenai Lambda Expression bisa dilihat di sini
Lalu ada lagi istilah Closure
Apa lagi ini ?
Closure di dalam lambda calculus
Tentu saja kita akan melihat asal muasal dari Closure ini.
Lagi-lagi dari konsep Lambda Calculus.
Lambda Calculus - λ , mengisyaratkan bahwa sebuah fungsi lambda terdiri dari :
- variable
- abstraksi lambda atau penulisan variable beserta isi body nya. Yaa maksudnya ini adalah penulisan fungsinya.
- aplikasi lambda, atau pengisian nilai ke variable diatas dan dijalankan di bodynya tersebut, sehingga didapatkan hasilnya.
Contohnya :
Misalkan kita ingin membuat fungsi penambahan sebuah variable dengan nilai 1 :
fungsi(x) { return x + 1 };
Maka konstruksinya lambdanya :
x –> variable x
(λ.x) ( x + 1 ) –> abstraksi lambda atau penulisan fungsinya.
(λ.x) ( x + 1 ) (3) ==> 3 + 1 ==> 4 –> aplikasi lambda
(f x) (3) ==> 3 + 1 ==> 4 –> aplikasi lambda, kalau kita bungkus dalam bentuk fungsi
Kalau kita lihat di contoh diatas, maka ada satu variable x yang dari awal sudah di “ikat” di dalam fungsinya dan cocok dengan parameternya.
Ini kita sebut Bind Variable.
Tidak perlu lagi mencari dimana variable lainnya.
Akan tetapi bagaimana kalau kita mengubah fungsinya seperti ini ?
- Fungsi yang di dalam codenya, membutuhkan variable yang terletak diluar dari fungsinya. Misalnya fungsi yang x+1 ingin kita ganti menjadi x+1+y dengan tujuan agar secara dinamik kita bisa mendapatkan hasil dari inputan runtime.
Contohnya :
fungsi(x) { return x + 1 + y };
Hmmm, bagaimana kita bisa menyelesaikan hasil kembalian dari fungsi ini ?
Tentunya tidak bisa.
Wong ada variable yang tidak di Bind di fungsinya.
Variable y ini kita sebut sebagai Free Variable, karena tidak ada parameter yang bisa menggantikannya di parameter fungsi.
Sehingga fungsi diatas disebut Open Lambda, atau Lambda yang masih terbuka dan belum sempurna pengisian nilai variablenya.
Kalau kita nanti bisa mendapatkan nilai y yang diatas, maka fungsi diatas berubah menjadi Close Lambda atau Closure.
Kalau kita lihat konstruksinya :
x –> variable x
(λ.x) ( x + 1 + y ) –> abstraksi lambda atau penulisan fungsinya.
(λ.x) ( x + 1 + y) (3) ==> 3 + 1 + y ==> 4 + y –> aplikasi lambda
(f x) (3) ==> 3 + y ==> 4 + y –> aplikasi lambda, kalau kita bungkus dalam bentuk fungsi
Lalu bagaimana caranya mendapatkan nilai y ?
Tentunya misalnya dengan :
- setting nilai parameter y di luar fungsi sebagai nilai statik.
- dengan inner function, yaitu membungkus fungsi diatas didalam fungsi yang lain yang menerima inputan y saat runtime.
misalkan :
function outerfunc() {
const y = 12;
function innerfunc(int x) { return x + 1 + y; };
return innerfunc(3);
}
outerfunc()
atau
function outerfunc(int y) {
function innerfunc(int x) { return x + 1 + y; };
return innerfunc(3);
}
outerfunc(12);
Dengan kata lain, nilai dari variable y sebenarnya disupply dari nilai yang dipassing pada saat fungsi tersebut dijalankan.
Tetapi bukan merupakan parameter asli dari fungsinya tersebut.
Dengan men-supply nilai y tadi, yang merupakan Free Variable, maka kita mengubah Lambda yang sebelumnya adalah Open Lambda menjadi Close Lambda, atau disebut Closure.
Kenapa kita butuh Closure ?
Hmmm..
Ok..ok..
Terkadang kita membutuhkan fungsi yang bisa dipakai berulang-ulang, dengan data dari kondisi runtime saat itu.
misalnya memproses Callback, dimana kita membutuhkan fungsi yang bisa menganalisa kembalian dari sebuah proses asinkronous.
atau fungsi closure yang membutuhkan referensi object dari luar agar bisa diproses berbeda tergantung dari object luarnya tersebut.
atau
lebih tepatnya
Kita bisa memproses secara dinamik sebuah inputan untuk diproses oleh fungsi closure dengan cara yang elegan dan lebih abstrak.
Itu…