Rebol ( / ˈrɛbəl / REB -əl ; históricamente REBOL ) es un lenguaje de intercambio de datos multiplataforma [ 6 ] y un lenguaje de programación dinámico multiparadigma diseñado por Carl Sassenrath para comunicaciones en red y computación distribuida . Introduce el concepto de dialectización : lenguajes pequeños, optimizados y específicos del dominio para código y datos, [6] [7] que también es la propiedad más notable del lenguaje según su diseñador Carl Sassenrath :
Aunque se puede utilizar para programar, escribir funciones y ejecutar procesos, su mayor fortaleza es la capacidad de crear fácilmente lenguajes o dialectos específicos del dominio.
—Carl Sassenrath [8]
Douglas Crockford , conocido por su participación en el desarrollo de JavaScript , ha descrito a Rebol como "un lenguaje más moderno, pero con algunas ideas muy similares a Lisp, en el sentido de que todo está construido sobre una representación de datos que luego se pueden ejecutar como programas" y como una de las influencias de JSON . [5]
Originalmente, el lenguaje y su implementación oficial eran propietarios y de código cerrado, desarrollados por REBOL Technologies. Tras una discusión con Lawrence Rosen , [9] el intérprete de Rebol versión 3 fue lanzado bajo la licencia Apache 2.0 el 12 de diciembre de 2012. [10] Las versiones anteriores solo están disponibles en forma binaria y no se planea ningún lanzamiento de código fuente para ellas.
Rebol se ha utilizado para programar aplicaciones de Internet (tanto del lado del cliente como del servidor ), aplicaciones de bases de datos , utilidades y aplicaciones multimedia . [6]
Rebol era inicialmente un acrónimo de Relative Expression Based Object Language escrito en mayúsculas. [6] [8] Para alinearse con las tendencias modernas en la denominación de lenguajes representadas, por ejemplo, por el cambio que reemplazó el nombre histórico LISP por Lisp , los programadores dejaron de escribir REBOL en mayúsculas. Sassenrath finalmente puso la cuestión del nombre en el debate de la comunidad en su blog. [11] En escritos posteriores, Sassenrath adoptó la convención de escribir el nombre del lenguaje como Rebol . [12]
Rebol, lanzado por primera vez en 1997, fue diseñado durante un período de 20 años por Carl Sassenrath, el arquitecto y desarrollador principal de AmigaOS , basándose en su estudio de la semántica denotacional y utilizando conceptos de los lenguajes de programación Lisp , Forth , Logo y Self .
Uno de los principios de diseño de Rebol es "hacer cosas simples de maneras simples". [6] En el siguiente ejemplo, se utiliza el dialecto de interfaz visual para describir un programa simple Hola mundo con una interfaz gráfica de usuario:
Ver diseño [ texto "¡Hola mundo!" botón "Salir" [ salir ]]
Así es como se ve un ejemplo similar en R3-GUI:
ver [ texto "¡Hola mundo!" botón "Salir" en la acción [ salir ]]
Los lenguajes específicos de dominio Rebol , llamados dialectos , son microlenguajes optimizados para un propósito específico. Los dialectos se pueden utilizar para definir reglas de negocio, interfaces gráficas de usuario o secuencias de pantallas durante la instalación de un programa. Los usuarios pueden definir sus propios dialectos, reutilizando cualquier palabra Rebol existente y dándole un significado específico en ese dialecto. [6] Los dialectos son interpretados por funciones que procesan bloques Rebol (o analizan cadenas) de una manera específica.
Un ejemplo de las capacidades de dialectización de Rebol se puede ver con la palabra return
. En el dialecto de intercambio de datos return
es solo una palabra que no tiene ningún significado específico. En el dialecto do , return
es una variable global que hace referencia a una función nativa que devuelve un valor de resultado de función. [4] En el dialecto de interfaz visual (VID) , return
es una palabra clave que hace que el motor de diseño simule un retorno de carro , moviendo el "lápiz de renderizado" hacia abajo hasta el comienzo de la siguiente línea. [7]
Un intérprete de Rebol con habilidades gráficas debe comprender e interpretar muchos dialectos. La siguiente tabla enumera los más importantes en orden de importancia.
La sintaxis de Rebol es libre y no requiere una posición específica. Sin embargo, a menudo se utiliza sangría para transmitir mejor la estructura del texto a los lectores humanos.
Las propiedades sintácticas de los distintos dialectos pueden diferir. La plataforma común para todos los dialectos Rebol es el dialecto de intercambio de datos ; otros dialectos suelen derivarse de él. Además de ser la plataforma común para todos los dialectos, el dialecto de intercambio de datos se utiliza directamente para representar datos y metadatos, completar estructuras de datos, enviar datos a través de Internet y guardarlos en un almacenamiento de datos.
A diferencia de los lenguajes de programación como C , el dialecto de intercambio de datos no consta de declaraciones , enunciados , expresiones o palabras clave. Un flujo de texto válido del dialecto de intercambio de datos es una estructura de datos en forma de árbol que consta de bloques (el bloque raíz es implícito, los subbloques están delimitados por corchetes ), paréntesis (delimitados por corchetes ), cadenas (delimitadas por comillas dobles o llaves, adecuadas para cadenas de varias líneas; la notación de intercalación se utiliza para caracteres no imprimibles), URL , direcciones de correo electrónico, archivos, rutas u otros valores compuestos . A diferencia de los bloques ALGOL , los bloques Rebol son valores compuestos similares a las s-expresiones entre comillas en Lisp . El hecho de que el código esté escrito en forma de bloques Rebol hace que el lenguaje sea homoicónico . [4]
Los bloques, así como los paréntesis, pueden contener otros valores compuestos (un bloque puede contener subbloques, paréntesis, cadenas, ...) o valores escalares como palabras, palabras de conjunto (palabras con el sufijo dos puntos ), palabras de obtención (palabras con el prefijo dos puntos), palabras lit (palabras con el prefijo apóstrofo ), números, dinero, caracteres , etc., separados por espacios en blanco . Se permiten caracteres especiales en las palabras, por lo que a+b
una palabra es diferente a a + b
, que es una secuencia de tres palabras separadas por espacios.
Los comentarios pueden aparecer después del punto y coma hasta el final de la línea. Los comentarios de varias líneas o los comentarios que no son ignorados por el analizador léxico se pueden escribir utilizando tipos de datos "ordinarios", como cadenas de varias líneas. [4]
Los bloques que contienen lenguaje específico del dominio se pueden enviar como argumentos a funciones evaluadoras específicas . [6]
El evaluador más utilizado es la do
función. Se utiliza de forma predeterminada para interpretar el texto que se ingresa en la consola del intérprete .
El dialecto do interpretado por la do
función es un sublenguaje orientado a expresiones del dialecto de intercambio de datos . La unidad semántica principal del lenguaje es la expresión . A diferencia de los lenguajes de programación imperativos que descienden de ALGOL , el dialecto do no tiene palabras clave ni declaraciones.
Las palabras se utilizan como variables que no distinguen entre mayúsculas y minúsculas . Como en todos los lenguajes tipados dinámicamente , las variables no tienen un tipo asociado, el tipo está asociado con valores. El resultado, es decir, la evaluación de una palabra, se devuelve cuando la función encuentra una palabra. La forma de conjunto de una palabra se puede utilizar para la asignación . Si bien no tiene declaraciones, la asignación, junto con las funciones con efectos secundarios, se puede utilizar para la programación imperativa . [4]do
Los subbloques del bloque raíz se evalúan a sí mismos. Esta propiedad se utiliza para manejar bloques de datos, para programación estructurada al enviar bloques como argumentos a funciones de controlif
como , either
, loop
, etc., y para dialectización, cuando un bloque se pasa a una función de interpretación específica. [6]
Un problema específico que vale la pena señalar es que los valores compuestos, asignados a las variables, no se copian. Para hacer una copia, el valor debe pasarse a la copy
función. [4]
La do
función normalmente sigue un estilo de evaluación de prefijo , donde una función procesa los argumentos que la siguen. Sin embargo, también existe la evaluación infija mediante operadores infijos. La evaluación infija tiene prioridad sobre la evaluación de prefijo. Por ejemplo,
abdominales -2 + 3
devuelve 1, ya que la suma infija tiene prioridad sobre el cálculo del valor absoluto. Al evaluar expresiones infijas, el orden de evaluación es de izquierda a derecha, ningún operador tiene prioridad sobre otro. Por ejemplo,
2 + 3 * 4
devuelve 20, mientras que una evaluación que dé prioridad a la multiplicación daría como resultado 14. Todos los operadores tienen versiones de prefijo. Do
Por lo general, evalúa los argumentos antes de pasarlos a una función. Por lo tanto, la siguiente expresión:
imprimir leer http://en.wikipedia.org/wiki/Rebol/Rebol
Primero lee la página de Wikipedia Rebol y luego pasa el resultado a la print
función. Se pueden usar paréntesis para cambiar el orden de evaluación. Al usar la notación de prefijo , se puede evitar el uso de paréntesis en expresiones. [4]
Las reglas de precedencia simples son una ventaja:
así como una desventaja:
La parse
función se utiliza preferentemente para especificar, validar, transformar e interpretar dialectos. Lo hace mediante la comparación de expresiones de análisis en tiempo de ejecución. [6]
Las expresiones de análisis se escriben en el dialecto de análisis que, al igual que el dialecto do , es un sublenguaje orientado a expresiones del dialecto de intercambio de datos . A diferencia del dialecto do , el dialecto de análisis utiliza palabras clave que representan operadores y los operadores de análisis infijos más importantes no tienen equivalentes de prefijo y utilizan reglas de precedencia ( la secuencia tiene mayor precedencia que la elección ). [6]
También se pueden incluir acciones que se deben realizar durante el proceso de análisis y la parse
función se puede utilizar para procesar bloques o cadenas. En el nivel de análisis de cadenasparse
se debe manejar el análisis de "nivel bajo", teniendo en cuenta caracteres y delimitadores. El análisis de bloques es de nivel superior y maneja el escaneo a nivel de valores Rebol. [6]
El dialecto de análisis sintáctico pertenece a la familia de gramáticas representadas por el lenguaje de análisis sintáctico de arriba hacia abajo o la gramática de expresión sintáctica (PEG). La principal similitud es la presencia de los operadores de secuencia y elección que tienen todos los miembros de la familia. La sintaxis del dialecto de análisis sintáctico y las similitudes entre el dialecto de análisis sintáctico y el PEG se ilustran con esta transliteración de un ejemplo de PEG que analiza una expresión aritmética:
Dígito: charset [ #"0" - #"9" ] Valor: [ algún Dígito | "(" Expr ")" ] Producto: [ Valor cualquiera [[ "*" | "/" ] Valor ]] Suma: [ Producto cualquiera [[ "+" | "-" ] Producto ]] Expr: Suma parse/ all "12+13" Expr
La implementación oficial de Rebol 2.7.8 está disponible en varias ediciones ( /Core , /View , /Command , /SDK y /IOS ). Tanto la edición /Core como la /View son software de libre distribución . [1]
El entorno de ejecución se almacena en un único archivo ejecutable. Rebol/Core 2.7.8, la edición de consola, tiene un tamaño de aproximadamente 300 KB y Rebol/View 2.7.8, la edición de interfaz gráfica de usuario , tiene un tamaño de aproximadamente 650 KB.
Rebol/View ofrece acceso a gráficos y sonido independientes de la plataforma y viene con su propio conjunto de herramientas de ventanas y un conjunto extensible de estilos ( widgets de GUI ). Las ediciones extendidas, como Rebol/Command 2.7.8 o Rebol/SDK 2.7.8 requieren una licencia paga; agregan funciones como acceso a datos ODBC y la opción de crear archivos ejecutables independientes. [ cita requerida ]
¿Probablemente pensaste que el lanzamiento del código fuente nunca sucedería? ¿Estoy en lo cierto? Bueno, ahora está en github en github.com/rebol/rebol.