Чи є Rebol функціональною мовою програмування?


9

Я наткнувся на Ребола, і мені було цікаво про це.

Звідси я наткнувся на такий сценарій :

 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
 ]

Усі операції з маніпулювання колекцією, на зразок map-eachнагадують мені JavaScript та C #, мають обоє функціональні можливості.

Чи є Rebol функціональною мовою? Чи підтримує він функціональне програмування? Чи можна було б класифікувати її як чисту функціональну мову (PFL)?



1
@GregHewgill Дякую за цей ресурс. Я поставив це запитання після чату в чаті StackOverflow Rebol ( chat.stackoverflow.com/transcript/message/7836761#7836761 ). Вони (Ми) подумали, що оскільки у програмістів та інших сайтах StackExchange немає інформації про це, я повинен попросити її для подальшої ознайомлення. Це посилання є чудовим, але його можна розширити і пояснити тут, тому більше користувачів, які не мають досвідчених програмістів Rebol, могли це зрозуміти. Будемо вдячні відповіді з цитатами цієї статті та досвідом особистого розвитку.
Бенджамін Грюенбаум

Атрибути ледь покращують сценарій XML Карла: у вас все ще є зайві метадані (назви атрибутів) та нетипізовані значення (вміст атрибута). Неявні метадані Ребола, надані ретельно визначеними типами, знімають неабиякий тягар на інтерпретацію. За допомогою XML ви повинні спочатку розблокувати значення, а потім розшифрувати їх (як дата, визначена в XML - чи я повинен перевірити специфікацію RSS чи Atom? Чи можете ви виразити визначення у XML?), А потім, можливо, перевірити їх, лише тоді ви може оцінити їх контекст. ** Зазначений як коментар у відповідь на [цей коментар] ( programmers.stackexchange.com/questions/1

Відповіді:


13

" Чисте функціональне програмування" у своєму формальному визначенні стосується ідеї проектування обчислювальних машин, вихід яких суто "функція вводу в машину" . Якщо ви подаєте один і той же вхід в машину, це дасть той самий вихід. Кожен вхід має назву явно, щоб ви точно знали, що таке залежності. Чиста функціональна мова програмування жорстко виконує це.

І все-таки ... у базовій формі "Rebol" ви можете написати такі речі, як:

foo: function [value [integer!]] [
    either now/date = 20-Feb-2013 [
        value + 1
    ] [
        value
    ]
]

Тут ми бачимо функцію, яка повертає цілий вхід кожного дня, але сьогодні, коли ви отримуєте значення плюс одне. Він включає невидиму залежність від дати, яка формально не визначається як аргумент функції. Це та річ, яка змушує людей Haskell та формалістів програмного забезпечення, як я, кричати криваве вбивство.

Отже, Rebol не є чистим функціоналом поза коробкою. (... але читайте далі ...)

Менш чітке визначення функціонального програмування - це коли функції можуть виступати як значення в мові. Таким чином, ви можете призначити функцію змінній і використовувати її пізніше. У цьому сенсі ви можете прочитати вподобання - це функціональна мова Javascript і побачити, що визначення dicey призведе до того, що деякі люди скажуть, що Javascript - це функціональна мова. Якщо ви будете настільки розгублені з визначенням, то це було б "функціонально":

>> foo: does [a + 10]

>> a: 20

>> print foo
== 30

(Примітка: DOES - це зручність визначення функції без аргументів, яка має лише тіло.)

Я не знаю, що я вважаю, що (або JavaScript) підходить до того, що люди, з якими я розмовляю, називають функціональним програмуванням. YMMV.

Якщо ви проводите будь-який час в галузі інформатики, ви дізнаєтесь про такі речі, як Тьюрінг Тарпіц і обчислюваність, і такі принципи еквівалентності, де "якщо ви зможете підключити X до Y, Z буде правдою". І так само, як ви можете написати реалізацію Haskell в C, а потім обмежитися лише використанням викликів C, відображених у бібліотеці Haskell, ви можете стверджувати, що ви виконуєте "функціональне програмування" і бути технічно правильним.

Отже, якщо ви хотіли сказати, що Rebol може бути схильний до функціональних стилів програмування, ви можете бути песимістом і сказати: "ну це не краще, ніж робити вигляд, що ти робиш C, коли ти насправді використовуєш такий обмежений підмножини мови, що ти" повторно використовуйте Haskell через проксі " . Хитрість рукаву Ребола полягає в тому, наскільки легко ви переходите з однієї "діалектної" парадигми на іншу. Дати трохи предметно-орієнтована мова-що відбувається , щоб бути функціональним так легко і природно , що він не відчуває , як ви скручування мову з суглоба , щоб зробити це. Можливість зробити мови, характерні для домену, які мають функціональний характер, призводить до маркування Rebol як "парадигми нейтральної" .

Багато людей змішують Ребол з його найпоширенішим діалектом (діалект DO) і думають, що "це те, що Rebol". Але "суть" Ребола більше нагадує XML, це формат обміну даними, який випадково (добре, не випадково) має гіпероптимізований код, зосереджений на обробці його деякими певними способами поза коробкою. Щоб дізнатися про те, як він відбиває штани від XML, дивіться у розділі: Чи була помилка XML з самого початку Карлом Сассенратом з AmigaOS (і тепер Rebol) слави.


1
Це відмінна відповідь, але я думаю, що стаття "Був недолік XML з самого початку" досить погана. По-перше, він використовує поганий XML (все, що він представляє при вкладенні, може бути представлено атрибутами). По- друге, мови будуть представлені у вигляді дерева , як структура , яка нагадує XML. Коли ви розбираєте речення, ви отримуєте дерево розбору, не справедливо порівнювати XML, що містить інформацію про граммер, із рядком, який залежить від домену. Дякую за відповідь :)
Бенджамін Грюнбаум

2
Я - Rebol n00b, і, як ви вже сказали, я теж зараз думаю, що Rebol - це діалект DO. Сподіваюсь вирватися з цього мислення. :-)
КК.

1
@BenjaminGruenbaum Якби я міг редагувати веб-сайт Карла, повірте, я б. :-)
HostileFork каже, що не довіряти SE

@BenjaminGruenbaum Але не всі мови можуть вільно маніпулювати цією структурою дерева. У цьому відношенні Ребол дуже невдоволений.
Ізката
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.