Banyak bahasa pemrograman modern mendukung beberapa konsep penutupan , yaitu sepotong kode (blok atau fungsi) itu
- Dapat diperlakukan sebagai nilai, dan karena itu disimpan dalam variabel, diedarkan ke berbagai bagian kode, didefinisikan dalam satu bagian dari program dan dipanggil dalam bagian yang sama sekali berbeda dari program yang sama.
- Dapat menangkap variabel dari konteks di mana ia didefinisikan, dan mengaksesnya ketika nanti dipanggil (mungkin dalam konteks yang sama sekali berbeda).
Berikut adalah contoh penutupan yang ditulis dalam Scala:
def filterList(xs: List[Int], lowerBound: Int): List[Int] =
xs.filter(x => x >= lowerBound)
Fungsi literal x => x >= lowerBound
berisi variabel bebas lowerBound
, yang ditutup (terikat) oleh argumen fungsi filterList
yang memiliki nama yang sama. Penutupan diteruskan ke metode perpustakaan filter
, yang dapat memanggilnya berulang kali sebagai fungsi normal.
Saya telah membaca banyak pertanyaan dan jawaban di situs ini dan, sejauh yang saya mengerti, istilah penutupan sering secara otomatis dikaitkan dengan pemrograman fungsional dan gaya pemrograman fungsional.
Definisi pemrograman fungsi pada wikipedia berbunyi:
Dalam ilmu komputer, pemrograman fungsional adalah paradigma pemrograman yang memperlakukan komputasi sebagai evaluasi fungsi matematika dan menghindari keadaan dan data yang bisa berubah. Ini menekankan penerapan fungsi, berbeda dengan gaya pemrograman imperatif, yang menekankan perubahan dalam keadaan.
dan selanjutnya
[...] dalam kode fungsional, nilai output suatu fungsi hanya bergantung pada argumen yang diinput ke fungsi [...]. Menghilangkan efek samping dapat membuatnya lebih mudah untuk memahami dan memprediksi perilaku suatu program, yang merupakan salah satu motivasi utama untuk pengembangan pemrograman fungsional.
Di sisi lain, banyak konstruksi penutupan yang disediakan oleh bahasa pemrograman memungkinkan penutupan untuk menangkap variabel non-lokal dan mengubahnya ketika penutupan itu dipanggil, sehingga menghasilkan efek samping pada lingkungan di mana mereka didefinisikan.
Dalam hal ini, closure mengimplementasikan ide pertama pemrograman fungsional (fungsi adalah entitas kelas satu yang dapat digerakkan seperti nilai-nilai lainnya) tetapi mengabaikan ide kedua (menghindari efek samping).
Apakah penggunaan penutupan dengan efek samping ini dianggap sebagai gaya fungsional atau apakah penutupan dianggap sebagai konstruksi yang lebih umum yang dapat digunakan baik untuk gaya pemrograman fungsional maupun non-fungsional? Apakah ada literatur tentang topik ini?
CATATAN PENTING
Saya tidak mempertanyakan kegunaan efek samping atau memiliki penutupan dengan efek samping. Juga, saya tidak tertarik dalam diskusi tentang keuntungan / kerugian penutupan dengan atau tanpa efek samping.
Saya hanya tertarik untuk mengetahui apakah menggunakan penutupan seperti itu masih dianggap gaya fungsional oleh pendukung pemrograman fungsional atau jika, sebaliknya, penggunaannya tidak disarankan ketika menggunakan gaya fungsional.