Rebol
Rebol (REB-əl; históricamente REBOL) es un lenguaje de intercambio de datos multiplataforma y un lenguaje de programación dinámico multiparadigma diseñado por Carl Sassenrath para comunicaciones de red y Computación distribuída. Introduce el concepto de dialectización: lenguajes pequeños, optimizados y específicos de dominio para código y datos, 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 realizar procesos, su mayor fuerza es la capacidad de crear fácilmente lenguajes o dialectos propios del dominio
—Carl Sassenrath
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 se basa en una representación". de datos que luego son ejecutables como programas" y como una de las influencias de JSON.
Originalmente, el lenguaje y su implementación oficial eran propietarios y de código cerrado, desarrollados por REBOL Technologies. Luego de una discusión con Lawrence Rosen, el intérprete de Rebol versión 3 se lanzó bajo la licencia Apache 2.0 el 12 de diciembre de 2012. Las versiones anteriores solo están disponibles en forma binaria y no se planea el lanzamiento de su código fuente.
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.
Etimología
Rebol fue inicialmente un acrónimo de Relative Expression Based Object Lidioma escrito en mayúsculas. Para alinearse con las tendencias modernas en la denominación de idiomas representados, p. por el cambio que reemplaza el nombre histórico LISP por Lisp, los programadores abandonaron la práctica de escribir REBOL en mayúsculas. Sassenrath finalmente planteó la cuestión del nombre en el debate de la comunidad en su blog. En escritos posteriores, Sassenrath adoptó la convención de escribir el nombre del idioma como Rebol.
Historia
Lanzado por primera vez en 1997, Rebol fue diseñado durante un período de 20 años por Carl Sassenrath, el arquitecto y desarrollador principal de AmigaOS, basado en su estudio de la semántica denotacional y el uso de conceptos de los lenguajes de programación Lisp, Forth, Logo y Ser.
- REBOL Las tecnologías se fundaron en 1998.
- REBOL 2, el intérprete, que se convirtió en el núcleo de ediciones de intérpretes ampliadas, fue liberado por primera vez en 1999.
- REBOL/Command, que añadió fuerte cifrado y acceso a ODBC, fue liberado en septiembre de 2000.
- REBOL/View fue lanzado en abril de 2001, añadiendo habilidades gráficas en el lenguaje básico.
- REBOL/IOS, un entorno de colaboración extensible construido con REBOL fue liberado en agosto de 2001.
- REBOL/SDK, proporcionando una selección de kernels para unirse, así como un preprocesador, fue liberado en diciembre de 2002.
- Rebol 3 [R3], la versión más reciente del intérprete, tenía versiones alfa publicadas por REBOL Technologies desde enero de 2008. Desde su lanzamiento como un proyecto Apache 2 en diciembre de 2012, está siendo desarrollado por la comunidad Rebol.
Diseño
Fácil de usar
Uno de los principios de diseño de Rebol es "hacer cosas simples de manera simple". En el siguiente ejemplo, el dialecto de la interfaz visual se usa para describir un programa simple de Hello world con una interfaz gráfica de usuario:
vista diseño [texto "¡Hola mundo!" botón "Quit" [Renuncio]]
Así es como se ve un ejemplo similar en R3-GUI:
vista [texto "¡Hola mundo!" botón "Quit" on-acción [Renuncio]]
Dialectos
Los lenguajes específicos de dominio de Rebol, llamados dialectos, son microlenguajes optimizados para un propósito específico. Los dialectos se pueden utilizar para definir reglas comerciales, 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. Los dialectos son interpretados por funciones que procesan bloques Rebol (o analizan cadenas) de una manera específica.
Un ejemplo de las habilidades de dialecto 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 do dialect, return
es una variable global que hace referencia a una función nativa que devuelve un valor de resultado de función. 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" hasta el principio de la línea siguiente.
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.
Nombre del diálogo | Interpretado por | Propósito |
---|---|---|
Intercambio de datos | load función
| representa datos y metadatos; plataforma común para los dialectos Rebol |
Do dialect | do función
| programación |
Parse dialect | parse función
| patrón de coincidencia |
Definición de función | make función
| definición de función; programación funcional |
dialecto de especificación de objetos | make función
| definición/herencia del objeto; programación basada en prototipos |
dialecto de interfaz visual (VID) o RebGUI | layout funcióno display función
| especifica la interfaz gráfica de usuario |
Dibujo dialecto | view función
| define elementos gráficos (líneas, polígonos, etc.) |
dialecto de especificación del script | do función
| Definición de script |
Política de seguridad | secure función
| especifica la política de seguridad |
Sintaxis
La sintaxis de Rebol es de forma libre y no requiere un posicionamiento específico. Sin embargo, la sangría se usa a menudo para transmitir mejor la estructura del texto a los lectores humanos.
Las propiedades sintácticas de los diferentes dialectos pueden diferir. La plataforma común para todos los dialectos de Rebol es el dialecto de intercambio de datos; otros dialectos generalmente se derivan de él. Además de ser la plataforma común para todos los dialectos, el dialecto de intercambio de datos se usa directamente para representar datos y metadatos, poblar estructuras de datos, enviar datos a través de Internet y guardarlos en el almacenamiento de datos.
A diferencia de los lenguajes de programación como C, el dialecto de intercambio de datos no consta de declaraciones, sentencias, expresiones o palabras clave. Un flujo de texto de dialecto de intercambio de datos válido es una estructura de datos de árbol que consta de bloques (el bloque raíz está implícito, los subbloques están delimitados por corchetes), paréntesis (delimitados por corchetes), cadenas (delimitadas por doble comillas o corchetes adecuados para cadenas de varias líneas; la notación de intercalación se usa para caracteres no imprimibles), direcciones 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 expresiones s entrecomilladas en Lisp. El hecho de que el código esté escrito en forma de bloques Rebol hace que el lenguaje sea homoicónico.
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, set-words (palabras con el sufijo de dos puntos), get-words (palabras con el prefijo de dos puntos), lit-words (palabras con el prefijo de apóstrofo), números, dinero, caracteres, etc., separados por espacios en blanco. Tenga en cuenta que se permiten caracteres especiales en las palabras, por lo que a+b
es una palabra 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 no ignorados por el analizador léxico se pueden escribir usando "ordinario" tipos de datos como cadenas de varias líneas.
Semántica
Los bloques que contienen lenguaje específico del dominio se pueden enviar como argumentos a funciones específicas de evaluador.
Hacer
El evaluador más utilizado es la función do
. Se utiliza de forma predeterminada para interpretar la entrada de texto en la consola del intérprete.
El dialecto do interpretado por la función do
, es un sublenguaje orientado a expresiones del dialecto de intercambio de datos. La principal unidad semántica del lenguaje es la expresión. A diferencia de los lenguajes de programación imperativos que descienden de ALGOL, el dialecto del 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 de escritura dinámica, 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 do
encuentra una palabra. La forma de palabra establecida de una palabra se puede utilizar para la asignación. Si bien no tiene declaraciones, la asignación, junto con funciones con efectos secundarios, se puede usar para la programación imperativa.
Los subbloques del bloque raíz se evalúan a sí mismos. Esta propiedad se usa para manejar bloques de datos, para programación estructurada al enviar bloques como argumentos para controlar funciones como if
, ether
, loop
, etc., y para la dialectización, cuando se pasa un bloque a una función de intérprete específica.
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 función copy
.
La función do
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 de infijos usando operadores de infijos. La evaluación de infijos tiene prioridad sobre la evaluación de prefijos. Por ejemplo,
abs -2 + 3
devuelve 1, ya que la suma de infijos 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 arrojaría 14. Todos los operadores tienen versiones de prefijo. Do
suele evaluar los argumentos antes de pasarlos a una función. Entonces, la siguiente expresión:
impresión http://en.wikipedia.org/wiki/Rebol
primero lee la página de Wikipedia Rebol y luego pasa el resultado a la función print
. Los paréntesis se pueden utilizar para cambiar el orden de evaluación. Usando la notación de prefijos, se puede evitar el uso de paréntesis en las expresiones.
Las reglas de precedencia simple son una ventaja:
- No hay necesidad de "consultar" tablas de precedencia al escribir expresiones
- No es necesario reescribir tablas de precedencia cuando se define un nuevo operador
- Las expresiones pueden ser fácilmente transliteradas de infijo a notación prefijo y viceversa
así como una desventaja:
- Los usuarios acostumbrados a reglas de precedencia más convencionales pueden cometer fácilmente un error
Analizar
La función parse
se utiliza preferentemente para especificar, validar, transformar e interpretar dialectos. Lo hace haciendo coincidir expresiones de análisis en tiempo de ejecución.
Las expresiones Parse están escritas en el parse dialect, que, al igual que el do dialect, es un sublenguaje orientado a expresiones del dialecto de intercambio de datos. A diferencia del do dialect, el parse dialect usa palabras clave que representan operadores y los no terminales más importantes, los operadores de análisis de infijos no tienen equivalentes de prefijo y usan reglas de precedencia (secuencia tiene mayor precedencia que elección).
También se pueden incluir acciones para realizar durante el proceso de análisis y la función parse
se puede usar para procesar bloques o cadenas. En el nivel de análisis de cadenas, parse
debe manejar el "nivel bajo" análisis, teniendo en cuenta caracteres y delimitadores. Análisis de bloques es un nivel superior, manejando el escaneo al nivel de los valores de Rebol.
El dialecto de análisis pertenece a la familia de gramáticas representadas por el lenguaje de análisis de arriba hacia abajo o la gramática de expresión de análisis (PEG). La principal similitud es la presencia de los operadores secuencia y elección que tienen todos los miembros de la familia. La sintaxis del dialecto de análisis y las similitudes entre el dialecto de análisis y el PEG se ilustran con esta transliteración de un ejemplo de PEG que analiza una expresión aritmética:
Digit: charset [#"0" - #"9"]
Valor: [algunos Digit Silencio "( Gastos ")"]
Producto: [Valor cualquiera [[2]"*Silencio "/"] Valor]]
Sum: [Producto cualquiera [[2]"+"Silencio "-] Producto]]
Expr: Sumparse/Todos "12+13" Gastos
Implementaciones
La implementación oficial de Rebol 2.7.8 está disponible en varias ediciones (/Core, /View, /Command, / SDK y /IOS). Las ediciones /Core y /View son software libremente redistribuible.
El entorno de tiempo de ejecución se almacena en un único archivo ejecutable. Rebol/Core 2.7.8, la edición de consola, tiene un tamaño aproximado de 300 KB y Rebol/View 2.7.8, la edición de interfaz gráfica de usuario, tiene un tamaño aproximado de 650 KB.
Rebol/View proporciona acceso a sonido y gráficos independientes de la plataforma, y viene con su propio conjunto de herramientas de ventanas y un conjunto extensible de estilos (widgets GUI). Las ediciones extendidas, como Rebol/Command 2.7.8 o Rebol/SDK 2.7.8 requieren una licencia paga; agregan funciones como el acceso a datos ODBC y la opción de crear archivos ejecutables independientes.
Legado
- Rebol fue nombrado por Douglas Crockford como una de las inspiraciones de la notación de objetos JavaScript.
- Rebol inspiró el proyecto Orca de código abierto, que es un lenguaje interpretado como Rebol.
- Boron es un lenguaje interpretado, homoicónico inspirado en y similar a Rebol, que está destinado a incorporar lenguajes específicos de dominio. Se implementa como una biblioteca C con licencia bajo los términos del LGPLv3.
- El lenguaje de programación roja se inspiró directamente en Rebol, pero las opciones de implementación de Red estaban orientadas específicamente a superar sus limitaciones percibidas.
Contenido relacionado
Cambio aritmético
Wendy carlos
Problema del vendedor ambulante