" Pemrograman Fungsional Murni " dalam definisi formalnya adalah tentang ide merancang mesin komputasi yang outputnya murni "fungsi input ke mesin" . Jika Anda memasukkan input yang sama ke dalam mesin, itu akan menghasilkan output yang sama. Setiap input diberi nama secara eksplisit sehingga Anda tahu persis apa dependensi itu. Bahasa pemrograman fungsional murni memberlakukan ini dengan ketat.
Namun ... pada awal "Rebol" Anda dapat menulis hal-hal seperti:
foo: function [value [integer!]] [
either now/date = 20-Feb-2013 [
value + 1
] [
value
]
]
Di sini kita melihat fungsi yang mengembalikan input bilangan bulat pada setiap hari tetapi hari ini, di mana Anda mendapatkan nilai plus satu. Ini termasuk ketergantungan yang tidak terlihat pada tanggal yang tidak ditentukan secara formal sebagai argumen untuk fungsi. Ini semacam hal yang membuat orang-orang Haskell dan formalis perangkat lunak seperti saya menjerit pembunuhan berdarah.
Oleh karena itu Rebol tidak murni fungsional di luar kotak. (... tapi baca terus ...)
Definisi pemrograman fungsional yang kurang ketat adalah ketika fungsi dapat bertindak sebagai nilai dalam bahasa. Jadi, Anda dapat menetapkan fungsi ke variabel, dan menggunakannya nanti. Dalam arti itu, Anda dapat membaca suka adalah javascript bahasa fungsional dan melihat bahwa definisi tidak pasti akan menyebabkan beberapa orang mengatakan Javascript adalah bahasa fungsional. Jika Anda akan menjadi longgar dengan definisi maka ini akan menjadi "fungsional":
>> foo: does [a + 10]
>> a: 20
>> print foo
== 30
(Catatan: DOES adalah kemudahan untuk mendefinisikan fungsi tanpa argumen, yang hanya memiliki tubuh.)
Saya tidak tahu bahwa saya akan menganggap itu (atau JavaScript) agar sesuai dengan apa yang orang yang saya ajak bicara akan memanggil pemrograman fungsional. YMMV.
Jika Anda menghabiskan waktu dalam ilmu komputer Anda belajar tentang hal-hal seperti Turing Tarpits dan komputabilitas dan prinsip-prinsip kesetaraan semacam ini di mana "jika Anda dapat menghubungkan X ke Y maka Z akan benar". Dan sama seperti Anda dapat menulis implementasi Haskell di C, dan kemudian membatasi diri Anda hanya menggunakan panggilan C yang dipetakan ke dalam perpustakaan Haskell, Anda mungkin mengklaim Anda melakukan "pemrograman fungsional" dan secara teknis benar.
Jadi, jika Anda ingin mengatakan Rebol dapat menjadi bengkok ke gaya pemrograman fungsional, Anda mungkin pesimis dan berkata, "Yah, itu tidak lebih baik daripada berpura-pura Anda melakukan C ketika Anda benar-benar menggunakan subset bahasa yang terbatas sehingga Anda" kembali menggunakan Haskell melalui proxy " . Trik di lengan Rebol adalah seberapa mudah Anda tergelincir dari satu paradigma "dialek" ke paradigma lain. Menulis sedikit bahasa-spesifik-domain yang kebetulan fungsional sangat mudah dan alami sehingga Anda tidak merasa seperti memutar-mutar bahasa untuk melakukannya. Kemampuan untuk membuat bahasa spesifik domain yang memiliki karakter fungsional mengarah ke pelabelan Rebol sebagai "paradigma netral" .
Banyak orang mencampur Rebol dengan dialek yang paling umum (dialek DO) dan berpikir "itulah Rebol". Tapi "esensi" Rebol lebih seperti XML, itu adalah format pertukaran data yang secara kebetulan (oke, bukan kebetulan) memiliki kode yang dioptimalkan untuk memprosesnya dengan beberapa cara tertentu. Untuk bacaan latar belakang yang bagus tentang bagaimana mengalahkan XML, lihat Apakah XML cacat dari Awal oleh Carl Sassenrath dari ketenaran AmigaOS (dan sekarang Rebol).