Apakah Rebol bahasa pemrograman fungsional?


9

Saya berlari ke Rebol dan saya bertanya-tanya tentang hal itu.

Saya menemukan skrip berikut dari sini :

 use [feed questions answers][
    feed: load-xml/dom http://stackoverflow.com/feeds/tag/rebol
    questions: map-each entry feed/get-by-tag <entry> [
        find/match entry/get <id> "http://stackoverflow.com/q/"
    ]

    answers: make block! length? questions

    foreach question questions [
        question: load-xml/dom join http://stackoverflow.com/feeds/question/ question
        foreach entry next question/get-by-tag <entry> [append answers entry/tree]
    ]

    insert clear feed/find-element <entry> answers
    feed/flatten
 ]

Semua operasi manipulasi koleksi seperti map-eachmengingatkan saya pada JavaScript dan C # yang keduanya memiliki kemampuan fungsional.

Apakah Rebol bahasa fungsional? Apakah itu mendukung pemrograman fungsional? Apakah akan diklasifikasikan sebagai bahasa fungsional murni (PFL)?


5
Inilah jawaban dari pencipta REBOL: Apakah REBOL Bahasa Fungsional Murni?
Greg Hewgill

1
@GregHewgill Terima kasih atas sumber daya itu. Saya menanyakan pertanyaan ini setelah mengobrol di ruang obrolan StackOverflow Rebol ( chat.stackoverflow.com/transcript/message/7836761#7836761 ). Mereka (Kami) memperkirakan bahwa karena tidak ada informasi tentang ini di programer atau situs lain di StackExchange, saya harus bertanya di sini untuk referensi di masa mendatang. Tautan itu bagus tetapi bisa diperluas dan dijelaskan di sini sehingga lebih banyak pengguna yang tidak berpengalaman programmer Rebol bisa memahaminya. Jawaban dengan kutipan dari artikel itu dan pengalaman pengembangan pribadi akan dihargai.
Benjamin Gruenbaum

Atribut nyaris tidak meningkatkan skenario XML Carl: Anda masih memiliki metadata berlebih (nama atribut) dan nilai yang tidak diketik (konten atribut). Metadata implisit Rebol yang disediakan oleh tipe-tipe yang didefinisikan dengan cermat menghilangkan beban yang adil pada interpretasi. Dengan XML, Anda harus terlebih dahulu membuka kunci nilai, lalu menguraikannya (bagaimana tanggal didefinisikan dalam XML — haruskah saya memeriksa RSS atau spesifikasi Atom? Bisakah Anda mengungkapkan definisi dalam XML?), Dan kemudian mungkin memvalidasinya, hanya kemudian Anda dapat mengevaluasi konteksnya. ** Dimaksudkan sebagai komentar sebagai tanggapan terhadap [komentar ini] ( programmers.stackexchange.com/questions/1

Jawaban:


13

" 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).


1
Itu jawaban yang bagus tapi saya pikir artikel "Apakah XML cacat sejak awal" cukup buruk. Pertama, ia menggunakan XML yang buruk (semua yang diwakilinya dengan bersarang dapat diwakili dengan atribut). Kedua, bahasa yang diwakili oleh pohon seperti struktur yang menyerupai xml. Ketika Anda mem-parsing kalimat Anda mendapatkan parse tree, itu tidak adil untuk membandingkan XML yang berisi informasi grammer dengan string yang spesifik domain. Terima kasih atas jawabannya :)
Benjamin Gruenbaum

2
Saya seorang Rebol n00b dan seperti yang Anda katakan, saya juga berpikir sampai sekarang bahwa Rebol adalah apa dialek DO itu. Harapan untuk keluar dari pola pikir ini. :-)
KK.

1
@BenjaminGruenbaum Jika saya bisa mengedit situs web Carl, percayalah, saya akan. :-)
HostileFork bilang jangan percaya SE

@BenjaminGruenbaum Tetapi tidak semua bahasa dapat dengan bebas memanipulasi struktur pohon itu. Rebol sangat lemah dalam hal itu.
Izkata
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.