Czy Rebol jest funkcjonalnym językiem programowania?

9

Wpadłem na Rebola i zastanawiałem się nad tym.

Pobiegłem do następującego skryptu z tutaj :

 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
 ]

Wszystkie operacje manipulowania kolekcją, takie jak map-eachprzypominanie mi JavaScript i C #, oba mają zdolności funkcjonalne.

Czy Rebol jest językiem funkcjonalnym? Czy obsługuje programowanie funkcjonalne? Czy klasyfikowałby się jako czysty język funkcjonalny (PFL)?

Benjamin Gruenbaum
źródło
5
Oto odpowiedź twórcy REBOL: Czy REBOL jest czystym językiem funkcjonalnym?
Greg Hewgill
1
@GregHewgill Dziękujemy za ten zasób. Zadałem to pytanie po czacie w pokoju rozmów StackOverflow Rebol ( chat.stackoverflow.com/transcript/message/7836761#7836761 ). Oni (My) doszli do wniosku, że skoro nie ma informacji na ten temat na programistach lub innych stronach w StackExchange, powinienem zapytać o to tutaj w przyszłości. Ten link jest świetny, ale można go tutaj rozwinąć i wyjaśnić, aby więcej użytkowników, którzy nie są doświadczonymi programistami Rebol, mogło to zrozumieć. Będziemy wdzięczni za odpowiedź z cytatami z tego artykułu i osobistym doświadczeniem rozwojowym.
Benjamin Gruenbaum
Atrybuty ledwo poprawiają scenariusz XML Carla: nadal masz nadmiar metadanych (nazwy atrybutów) i nietypowych wartości (zawartość atrybutu). Ukryte metadane Rebola dostarczone przez starannie zdefiniowane typy usuwają spore obciążenie interpretacyjne. W przypadku XML musisz najpierw odblokować wartości, a następnie je odszyfrować (jak to jest zdefiniowana data w XML - czy mam sprawdzić specyfikację RSS lub Atom? Czy możesz wyrazić definicję w XML?), A następnie ewentualnie je zweryfikować, tylko wtedy potrafi ocenić ich kontekst. ** Przeznaczony jako komentarz w odpowiedzi na [ten komentarz] ( programmers.stackexchange.com/questions/1

Odpowiedzi:

13

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

HostileFork mówi: nie ufaj SE
źródło
1
To świetna odpowiedź, ale myślę, że artykuł „Was XML był wadliwy od samego początku” jest dość zły. Po pierwsze, używa słabego XML (wszystko, co reprezentuje poprzez zagnieżdżanie, może być reprezentowane przez atrybuty). Po drugie, języki reprezentowane przez strukturę przypominającą drzewo, która przypomina xml. Kiedy parsujesz zdanie, otrzymujesz drzewo parsowania, niesprawiedliwe jest porównywanie XML-a zawierającego informacje o gramatyce z ciągiem specyficznym dla domeny. Dzięki za odpowiedź :)
Benjamin Gruenbaum,
2
Jestem Rebolem n00b i jak powiedziałeś, ja też myślę, że Rebol jest tym, czym jest dialekt DO. Mam nadzieję, że wyrwiesz się z tego sposobu myślenia. :-)
KK.
1
@BenjaminGruenbaum Gdybym mógł edytować stronę Carla, uwierz mi, zrobiłbym to. :-)
HostileFork mówi: nie ufaj
@BenjaminGruenbaum Ale nie wszystkie języki mogą swobodnie manipulować tą strukturą drzewa. Rebol jest pod tym względem bardzo seplenny.
Izkata