Rebol est-il un langage de programmation fonctionnel?

9

Je suis tombé sur Rebol et je me posais la question.

J'ai rencontré le script suivant à partir d' ici :

 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
 ]

Toutes les opérations de manipulation de collection comme map-eachme rappellent JavaScript et C # qui ont tous deux des capacités fonctionnelles.

Rebol est-il un langage fonctionnel? Prend-il en charge la programmation fonctionnelle? Serait-il classé comme un langage fonctionnel pur (PFL)?

Benjamin Gruenbaum
la source
5
Voici une réponse du créateur de REBOL: REBOL est-il un langage fonctionnel pur?
Greg Hewgill
1
@GregHewgill Merci pour cette ressource. J'ai posé cette question après un chat dans la salle de chat StackOverflow Rebol ( chat.stackoverflow.com/transcript/message/7836761#7836761 ). Ils (Nous) avons pensé que, puisqu'il n'y a aucune information à ce sujet sur les programmeurs ou d'autres sites dans StackExchange, je devrais la demander ici pour référence future. Ce lien est génial mais il pourrait être développé et expliqué ici afin que davantage d'utilisateurs qui ne sont pas des programmeurs Rebol expérimentés puissent le comprendre. Une réponse avec des citations de cet article et une expérience de développement personnel serait appréciée.
Benjamin Gruenbaum
Les attributs améliorent à peine le scénario XML de Carl: vous avez toujours des métadonnées en excès (les noms d'attributs) et des valeurs non typées (le contenu des attributs). Les métadonnées implicites de Rebol fournies par les types soigneusement définis suppriment une charge d'interprétation équitable. Avec XML, vous devez d'abord déverrouiller les valeurs, puis les déchiffrer (comment une date est-elle définie en XML - dois-je vérifier les spécifications RSS ou Atom? Pouvez-vous exprimer la définition en XML?), Puis éventuellement les valider, seulement alors vous peut évaluer leur contexte. ** Conçu comme un commentaire en réponse à [ce commentaire] ( programmers.stackexchange.com/questions/1

Réponses:

13

La « programmation fonctionnelle pure » dans sa définition formelle concerne l'idée de concevoir des machines de calcul dont la sortie est purement «fonction de l'entrée de la machine» . Si vous introduisez la même entrée dans la machine, elle produira la même sortie. Chaque entrée est nommée explicitement afin que vous sachiez précisément quelles sont les dépendances. Un langage de programmation purement fonctionnel applique cela rigoureusement.

Pourtant ... dans la ligne de base "Rebol", vous pouvez écrire des choses comme:

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

Ici, nous voyons une fonction qui renvoie son entrée entière tous les jours, mais aujourd'hui, où vous obtenez la valeur plus un. Il inclut une dépendance invisible à la date qui n'est pas formellement spécifiée comme argument de la fonction. C'est le genre de chose qui fait que les gens de Haskell et les formalistes des logiciels comme moi crient un meurtre sanglant.

Par conséquent, Rebol n'est pas purement fonctionnel hors de la boîte. (... mais lisez la suite ...)

La définition moins stricte de la programmation fonctionnelle est lorsque les fonctions peuvent agir comme des valeurs dans le langage. Vous pouvez donc affecter une fonction à une variable et l'utiliser plus tard. Dans ce sens, vous pouvez aller lire le javascript comme un langage fonctionnel et voir que la définition risquée conduirait certaines personnes à dire que Javascript est un langage fonctionnel. Si vous allez être aussi lâche avec la définition, ce serait "fonctionnel":

>> foo: does [a + 10]

>> a: 20

>> print foo
== 30

(Remarque: DOES est une commodité pour définir une fonction sans arguments, qui n'a qu'un corps.)

Je ne sais pas si je considérerais cela (ou JavaScript) pour s'adapter à ce que les gens à qui j'appellerais appelleraient de la programmation fonctionnelle. YMMV.

Si vous passez du temps en informatique, vous apprenez des choses comme Turing Tarpits et la calculabilité et ce genre de principes d'équivalences où "si vous pouvez connecter X à Y, alors Z sera vrai". Et tout comme vous pouvez écrire une implémentation Haskell en C, puis vous limiter à n'utiliser que des appels C mappés dans la bibliothèque Haskell, vous pourriez prétendre que vous faites de la "programmation fonctionnelle" et être techniquement correct.

Donc, si vous vouliez dire que Rebol peut être plié aux styles de programmation fonctionnels, vous pourriez être pessimiste et dire "eh bien, ce n'est pas mieux que de prétendre que vous faites du C lorsque vous utilisez réellement un sous-ensemble aussi restreint du langage que vous" en utilisant Haskell par proxy " . L'astuce dans la manche de Rebol est la facilité avec laquelle vous passez d'un paradigme de "dialecte" à un autre. Écrire un petit langage spécifique au domaine qui se trouve être fonctionnel est si facile et naturel qu'il ne semble pas que vous tordiez votre langage pour le faire. La possibilité de créer des langages spécifiques au domaine qui ont un caractère fonctionnel conduit à étiqueter Rebol comme "paradigme neutre" .

Beaucoup de gens confondent Rebol avec son dialecte le plus commun (le dialecte DO) et pensent "c'est ce que Rebol est". Mais "l'essence" de Rebol ressemble plus à XML, c'est un format d'échange de données qui, par coïncidence (d'accord, pas par coïncidence), a un code hyper-optimisé se concentrant sur le traitement de certaines façons hors de la boîte. Pour une bonne lecture de fond sur la façon dont il bat le pantalon hors XML, voir Was XML a été vicié dès le début par Carl Sassenrath de la renommée d'AmigaOS (et maintenant Rebol).

HostileFork dit de ne pas faire confiance à SE
la source
1
C'est une excellente réponse, mais je pense que l'article "Was XML flawed from the start" est assez mauvais. Tout d'abord, il utilise un XML médiocre (tout ce qu'il représente avec l'imbrication peut être représenté avec des attributs). Deuxièmement, les langues sont représentées par une structure arborescente qui ressemble à xml. Lorsque vous analysez une phrase, vous obtenez un arbre d'analyse, il n'est pas juste de comparer le XML qui contient les informations de grammaire avec la chaîne qui est spécifique au domaine. Merci pour la réponse :)
Benjamin Gruenbaum
2
Je suis un Rebol n00b et comme vous l'avez dit, moi aussi je pense maintenant que le Rebol est ce qu'est le dialecte DO. J'espère sortir de cet état d'esprit. :-)
KK.
1
@BenjaminGruenbaum Si je pouvais éditer le site Web de Carl, croyez-moi, je le ferais. :-)
HostileFork dit de ne pas faire confiance au SE
@BenjaminGruenbaum Mais toutes les langues ne peuvent pas manipuler librement cette structure arborescente. Rebol est très vif à cet égard.
Izkata