¿Es Rebol un lenguaje de programación funcional?

9

Me encontré con Rebol y me preguntaba sobre eso.

Me encontré con el siguiente script desde aquí :

 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
 ]

Todas las operaciones de manipulación de colecciones como map-eachrecordarme JavaScript y C # tienen capacidades funcionales.

¿Es Rebol un lenguaje funcional? ¿Es compatible con la programación funcional? ¿Clasificaría como un lenguaje funcional puro (PFL)?

Benjamin Gruenbaum
fuente
55
Aquí hay una respuesta del creador de REBOL: ¿Es REBOL un lenguaje funcional puro?
Greg Hewgill
1
@GregHewgill Gracias por ese recurso. Hice esta pregunta después de un chat en la sala de chat de StackOverflow Rebol ( chat.stackoverflow.com/transcript/message/7836761#7836761 ). Ellos (Nosotros) supusimos que, dado que no hay información sobre esto en los programadores u otros sitios en StackExchange, debería preguntarlo aquí para referencia futura. Ese enlace es excelente, pero podría expandirse y explicarse aquí para que más usuarios que no sean programadores experimentados de Rebol puedan entenderlo. Se agradecería una respuesta con citas de ese artículo y experiencia de desarrollo personal.
Benjamin Gruenbaum
Los atributos apenas mejoran el escenario XML de Carl: todavía tiene un exceso de metadatos (los nombres de los atributos) y valores sin tipo (el contenido del atributo). Los metadatos implícitos de Rebol proporcionados por los tipos cuidadosamente definidos eliminan una carga justa sobre la interpretación. Con XML, primero debe desbloquear valores, luego descifrarlos (¿cómo se define una fecha en XML? ¿Debería verificar las especificaciones de RSS o Atom? ¿Puede expresar la definición en XML?), Y luego posiblemente validarlos, solo entonces usted puede evaluar su contexto. ** Diseñado como un comentario en respuesta a [este comentario] ( programmers.stackexchange.com/questions/1

Respuestas:

13

La " programación funcional pura " en su definición formal trata sobre la idea de diseñar máquinas computacionales cuya salida es puramente "una función de la entrada a la máquina" . Si introduce la misma entrada en la máquina, producirá la misma salida. Cada entrada se nombra explícitamente para que sepa con precisión cuáles son las dependencias. Un lenguaje de programación funcional puro lo aplica rigurosamente.

Sin embargo ... en la línea base "Rebol" puedes escribir cosas como:

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

Aquí vemos una función que devuelve su entrada entera todos los días, pero hoy, donde obtiene el valor más uno. Incluye una dependencia invisible en la fecha que no se especifica formalmente como argumento de la función. Es el tipo de cosa que hace que la gente de Haskell y los formalistas de software como yo griten un asesinato sangriento.

Por lo tanto, Rebol no es puramente funcional de fábrica. (... pero sigue leyendo ...)

La definición menos estricta de la programación funcional es cuando las funciones pueden actuar como valores en el lenguaje. Por lo tanto, puede asignar una función a una variable y usarla más tarde. En ese sentido, puede leer los gustos de javascript, un lenguaje funcional y ver que la definición incierta llevaría a algunas personas a decir que Javascript es un lenguaje funcional. Si va a ser tan suelto con la definición, esto sería "funcional":

>> foo: does [a + 10]

>> a: 20

>> print foo
== 30

(Nota: DOES es una conveniencia para definir una función sin argumentos, que solo tiene un cuerpo).

No sé si consideraría que (o JavaScript) se ajustan a lo que las personas con las que hablo llamarían programación funcional. YMMV.

Si pasa algún tiempo en ciencias de la computación, aprenderá sobre cosas como las Tarpits de Turing y la computabilidad y este tipo de principios de equivalencias donde "si puede conectar X con Y, entonces Z será verdadero". Y así como puede escribir una implementación de Haskell en C, y luego limitarse a usar solo llamadas C asignadas a la biblioteca de Haskell, puede afirmar que está haciendo "programación funcional" y ser técnicamente correcto.

Entonces, si quisieras decir que Rebol puede inclinarse por los estilos de programación funcionales, podrías ser pesimista y decir "bueno, no es mejor que pretender que estás haciendo C cuando estás usando un subconjunto tan limitado del lenguaje que" re usando Haskell por proxy " . El truco bajo la manga de Rebol es la facilidad con que te deslizas de un paradigma de "dialecto" a otro. Escribir un poco de lenguaje específico de dominio que resulta ser funcional es tan fácil y natural que no se siente como si estuvieras torciendo tu lenguaje para hacerlo. La capacidad de crear lenguajes específicos de dominio que tengan un carácter funcional conduce al etiquetado de Rebol como "paradigma neutral" .

Muchas personas mezclan Rebol con su dialecto más común (el dialecto DO) y piensan "eso es Rebol". Pero la "esencia" de Rebol se parece más a XML, es un formato de intercambio de datos que por coincidencia (está bien, no por casualidad) tiene un código hiperoptimizado que se enfoca en procesarlo de manera segura. Para una buena lectura de antecedentes sobre cómo supera a XML, vea ¿Fue XML defectuoso desde el principio por Carl Sassenrath de AmigaOS (y ahora Rebol) fama.

HostileFork dice que no confíes en SE
fuente
1
Esa es una gran respuesta, pero creo que el artículo "Fue un error de XML desde el principio" es bastante malo. Primero, usa XML deficiente (todo lo que representa con anidamiento se puede representar con atributos). Segundo, los lenguajes están representados por una estructura similar a un árbol que se asemeja a xml. Cuando analiza una oración, obtiene un árbol de análisis, no es justo comparar el XML que contiene la información gramatical con la cadena que es específica del dominio. Gracias por la respuesta :)
Benjamin Gruenbaum
2
Soy un Rebol n00b y, como has dicho, a partir de ahora también pienso que Rebol es el dialecto DO. Espero salir de esta mentalidad. :-)
KK.
1
@BenjaminGruenbaum Si pudiera editar el sitio web de Carl, créeme, lo haría. :-)
HostileFork dice que no confíes en SE
@BenjaminGruenbaum Pero no todos los idiomas pueden manipular libremente esa estructura de árbol. Rebol es muy lisp-y en ese sentido.
Izkata