„ Pure Functional Programming” w swojej formalnej definicji dotyczy idei projektowania maszyn obliczeniowych, których dane wyjściowe są wyłącznie „funkcją danych wejściowych do maszyny” . Jeśli podasz te same dane wejściowe do urządzenia, wygeneruje to samo wyjście. Każde wejście ma jawną nazwę, dzięki czemu dokładnie wiesz, jakie są zależności. Czysty funkcjonalny język programowania wymusza to rygorystycznie.
Jednak ... w podstawowym „Rebol” możesz pisać takie rzeczy jak:
foo: function [value [integer!]] [
either now/date = 20-Feb-2013 [
value + 1
] [
value
]
]
Widzimy tutaj funkcję, która zwraca liczbę całkowitą każdego dnia, ale dzisiaj, gdzie dostajesz wartość plus jeden. Zawiera niewidoczną zależność od daty, która nie jest formalnie określona jako argument funkcji. Jest to coś, co sprawia, że ludzie i formaliści Haskell, tacy jak ja, krzyczą krwawe morderstwo.
Stąd REBOL-nie jest czystym czynnościowego pudełka. (... ale czytaj dalej ...)
Mniej ścisła definicja programowania funkcjonalnego polega na tym, że funkcje mogą działać jako wartości w języku. Możesz więc przypisać funkcję do zmiennej i użyć jej później. W tym sensie możesz przeczytać, jak javascript funkcjonalny język i zobaczyć, że dicey definicja doprowadziłaby niektórych do stwierdzenia, że JavaScript jest językiem funkcjonalnym. Jeśli będziesz tak luźny w definicji, byłoby to „funkcjonalne”:
>> foo: does [a + 10]
>> a: 20
>> print foo
== 30
(Uwaga: DOES to wygoda w definiowaniu funkcji bez argumentów, która ma tylko treść.)
Nie wiem, czy uważam, że to (lub JavaScript) pasuje do tego, z kim ludzie, z którymi rozmawiam, nazwaliby programowaniem funkcjonalnym. YMMV.
Jeśli poświęcisz trochę czasu na informatykę, dowiesz się o takich rzeczach, jak Turing Tarpits i obliczalność oraz tego rodzaju zasady równoważności, w których „jeśli możesz połączyć X z Y, wówczas Z będzie prawdziwe”. I tak jak możesz napisać implementację Haskell w C, a następnie ograniczyć się do używania tylko wywołań C odwzorowanych w bibliotece Haskell, możesz twierdzić, że robisz „programowanie funkcjonalne” i jesteś technicznie poprawny.
Więc jeśli chcesz powiedzieć, że Rebol może być nastawiony na funkcjonalne style programowania, możesz być pesymistą i powiedzieć „cóż, nie jest to lepsze niż udawanie, że robisz C, kiedy faktycznie używasz tak ograniczonego podzbioru języka, że” ponownie używasz Haskell przez proxy ” . Sztuczka w rękawie Rebola polega na tym, jak łatwo przesuwasz się z jednego paradygmatu „dialektowania” na inny. Pisanie małego języka specyficznego dla domeny, który okazuje się funkcjonalny, jest tak łatwe i naturalne, że nie wydaje się, żebyś robił to ze swojego języka. Możliwość tworzenia języków specyficznych dla domeny o charakterze funkcjonalnym prowadzi do oznaczenia Rebola jako „neutralnego dla paradygmatu” .
Wiele osób miesza Rebol z jego najczęstszym dialektem (dialekt DO) i myśli „tym właśnie jest Rebol”. Ale „esencja” Rebola przypomina bardziej XML, jest to format wymiany danych, który przypadkowo (dobrze, nie przypadkowo) ma bardzo zoptymalizowany kod, który koncentruje się na przetwarzaniu go w określony sposób po wyjęciu z pudełka. Aby zapoznać się z dobrym czytaniem w tle, w jaki sposób bije spodnie od XML, zobacz Was XML był wadliwy od samego początku Carl Sassenrath z AmigaOS (a teraz Rebol).