Un bucle de lectura-evaluación-impresión ( REPL ), también denominado shell de lenguaje o nivel superior interactivo , es un entorno de programación informática interactivo simple que toma entradas de usuario individuales, las ejecuta y devuelve el resultado al usuario; un programa escrito en un entorno REPL se ejecuta por partes. [1] El término generalmente se refiere a interfaces de programación similares al entorno interactivo clásico de la máquina Lisp . Los ejemplos comunes incluyen shells de línea de comandos y entornos similares para lenguajes de programación , y la técnica es muy característica de los lenguajes de script . [2]
En 1964, la expresión ciclo READ-EVAL-PRINT es utilizada por L. Peter Deutsch y Edmund Berkeley para una implementación de Lisp en el PDP-1 . [3] Tan solo un mes después, Project Mac publicó un informe de Joseph Weizenbaum (el creador de ELIZA , el primer chatbot del mundo) que describe un lenguaje basado en REPL, llamado OPL-1, implementado en su lenguaje Fortran-SLIP en el Compatible Time Sharing System (CTSS) . [4] [5] [6]
El manual de referencia de Maclisp de 1974 de David A. Moon menciona "bucle de lectura-evaluación-impresión" en la página 89, pero no utiliza el acrónimo REPL. [7]
Desde al menos la década de 1980, las abreviaturas REP Loop y REPL están atestiguadas en el contexto del Esquema . [8] [9]
En un REPL, el usuario ingresa una o más expresiones (en lugar de una unidad de compilación completa ) y el REPL las evalúa y muestra los resultados. [1] El nombre bucle read–eval–print proviene de los nombres de las funciones primitivas de Lisp que implementan esta funcionalidad:
(+ 1 2 3)
, que se analiza en una lista enlazada que contiene cuatro elementos de datos.+
se llama a la función sobre los argumentos 1 2 3
y se obtiene el resultado 6
.Luego, el entorno de desarrollo regresa al estado de lectura, creando un bucle que finaliza cuando se cierra el programa.
Los REPL facilitan la programación exploratoria y la depuración porque el programador puede inspeccionar el resultado impreso antes de decidir qué expresión proporcionar para la siguiente lectura. El ciclo de lectura-evaluación-impresión involucra al programador con más frecuencia que el ciclo clásico de edición-compilación-ejecución-depuración.
Debido a que la función de impresión genera el mismo formato de texto que la función de lectura utiliza para la entrada, la mayoría de los resultados se imprimen en un formato que se puede copiar y pegar nuevamente en el REPL. Sin embargo, a veces es necesario imprimir representaciones de elementos que no se pueden volver a leer de manera sensata, como un identificador de socket o una instancia de clase compleja. En estos casos, debe existir una sintaxis para los objetos ilegibles. En Python, es la <__module__.class instance>
notación y, en Common Lisp, la #<whatever>
forma. El REPL de CLIM , SLIME y Symbolics Lisp Machine también puede volver a leer objetos ilegibles. Registran para cada salida qué objeto se imprimió. Más tarde, cuando se vuelve a leer el código, se recuperará el objeto de la salida impresa.
Se pueden crear REPL para admitir cualquier lenguaje basado en texto. La compatibilidad de REPL con lenguajes compilados se logra generalmente implementando un intérprete sobre una máquina virtual que proporciona una interfaz al compilador. Por ejemplo, a partir de JDK 9, Java incluyó JShell como una interfaz de línea de comandos para el lenguaje. Varios otros lenguajes tienen herramientas de terceros disponibles para descargar que brindan una interacción de shell similar con el lenguaje.
Como shell , un entorno REPL permite a los usuarios acceder a funciones relevantes de un sistema operativo además de proporcionar acceso a capacidades de programación. El uso más común de los REPL fuera de los shells del sistema operativo es para la creación de prototipos interactivos . [10] Otros usos incluyen el cálculo matemático, la creación de documentos que integran análisis científicos (por ejemplo, IPython ), el mantenimiento de software interactivo, la evaluación comparativa y la exploración de algoritmos.
Una definición mínima es:
( definir ( REPL env ) ( imprimir ( eval env ( leer ))) ( REPL env ) )
donde env
representa eval
el entorno de -uación inicial. También se supone que env
puede actualizarse destructivamente mediante eval
.
La funcionalidad típica proporcionada por un REPL de Lisp incluye:
*
se refiere al último resultado **
y ***
a los resultados anteriores.El componente central del intérprete de Scheme es el bucle read-eval-print . Los comandos se leen y luego se evalúan. Finalmente, se imprime el resultado evaluado.
{{cite book}}
: Mantenimiento de CS1: postscript ( enlace )