" Чисте функціональне програмування" у своєму формальному визначенні стосується ідеї проектування обчислювальних машин, вихід яких суто "функція вводу в машину" . Якщо ви подаєте один і той же вхід в машину, це дасть той самий вихід. Кожен вхід має назву явно, щоб ви точно знали, що таке залежності. Чиста функціональна мова програмування жорстко виконує це.
І все-таки ... у базовій формі "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) слави.