« Чистое функциональное программирование» в своем формальном определении относится к идее конструирования вычислительных машин, выход которых является чисто «функцией ввода в машину» . Если вы подаете один и тот же вход в аппарат, он будет выдавать тот же результат. Каждый вход назван явно, так что вы точно знаете, каковы зависимости. Чисто функциональный язык программирования обеспечивает это строго.
Тем не менее ... в базовом "Rebol" вы можете написать такие вещи, как:
foo: function [value [integer!]] [
either now/date = 20-Feb-2013 [
value + 1
] [
value
]
]
Здесь мы видим функцию, которая возвращает свой целочисленный ввод каждый день, но сегодня, где вы получаете значение плюс один. Он включает в себя невидимую зависимость от даты, которая формально не указана в качестве аргумента функции. Именно такие вещи заставляют людей из Haskell и таких формалистов программного обеспечения, как я, кричать о кровавом убийстве.
Следовательно, Rebol не является чистым функционалом из коробки. (... но читайте дальше ...)
Менее строгое определение функционального программирования - когда функции могут выступать в качестве значений в языке. Таким образом, вы можете назначить функцию переменной и использовать ее позже. В этом смысле вы можете прочесть, что такое javascript - функциональный язык, и увидеть, что из-за сложного определения некоторые люди скажут, что Javascript - это функциональный язык. Если вы не будете использовать определение, это будет «функционально»:
>> foo: does [a + 10]
>> a: 20
>> print foo
== 30
(Примечание: DOES - это удобство для определения функции без аргументов, которая имеет только тело.)
Я не знаю, подумаю ли я (или JavaScript), чтобы люди, с которыми я общаюсь, называли функциональное программирование. YMMV.
Если вы проводите какое-то время в компьютерных науках, вы узнаете о таких вещах, как тьюринг Тьюринга и вычислимость, и о подобных принципах эквивалентности, где «если вы можете соединить X с Y, тогда Z будет правдой». И точно так же, как вы можете написать реализацию на Haskell в C, а затем ограничиться использованием только вызовов C, отображаемых в библиотеке Haskell, вы можете утверждать, что выполняете «функциональное программирование» и быть технически правильными.
Так что, если вы хотите сказать, что Rebol может быть привязан к функциональным стилям программирования, вы можете быть пессимистом и сказать: «Ну, это не лучше, чем притворяться, что вы делаете C, когда вы на самом деле используете такое ограниченное подмножество языка, которое вы» Вы используете Haskell по доверенности " . Фокус в рукаве Ребола заключается в том, как легко вы переходите от одной «диалектной» парадигмы к другой. Написание небольшого предметно-ориентированного языка, который оказывается функциональным, настолько легко и естественно, что вы не чувствуете, что для этого выкручиваете свой язык. Способность создавать специфичные для предметной области языки, имеющие функциональный характер, приводит к маркировке Rebol как «нейтральной по отношению к парадигме» .
Многие люди смешивают Rebol с его наиболее распространенным диалектом (диалект DO) и думают, что «это то, чем является Rebol». Но «сущность» Rebol больше похожа на XML, это формат обмена данными, который по совпадению (хорошо, не случайно) имеет гипероптимизированный код, ориентированный на его обработку некоторыми определенными способами из коробки. Хорошую справочную информацию о том, как он превосходит XML, см. В статье « Было ли изъяном XML с самого начала » Карл Сассенрат из AmigaOS (а теперь и Rebol).