Un bucle de lectura, evaluación e impresión ( REPL ), también denominado nivel superior interactivo o shell de lenguaje , es un entorno de programación de computadora interactivo simple que toma entradas de un solo usuario, 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 de máquina Lisp clásico . 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 scripting . [2]
En 1964, L. Peter Deutsch y Edmund Berkeley utilizan la expresión ciclo READ-EVAL-PRINT para una implementación de Lisp en el PDP-1 . [3]
El manual de referencia de Maclisp de 1974 de David A. Moon da fe del "bucle de lectura-evaluación-impresión" en la página 89, pero no utiliza el acrónimo REPL. [4]
Al menos desde la década de 1980, las abreviaturas REP Loop y REPL están atestiguadas en el contexto de Scheme . [5] [6]
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 lectura-evaluación-impresión proviene de los nombres de las funciones primitivas Lisp que implementan esta funcionalidad:
(+ 1 2 3)
, que se analiza en una lista vinculada que contiene cuatro elementos de datos.+
se llama sobre los argumentos 1 2 3
, produciendo el resultado 6
.Luego, el entorno de desarrollo vuelve 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 lectura-evaluación-impresión involucra al programador con más frecuencia que el clásico ciclo edición-compilación-ejecución-depuración.
Debido a que la función de impresión genera el mismo formato de texto que utiliza la función de lectura 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, como un identificador de socket o una instancia de clase compleja. En estos casos, debe existir una sintaxis para 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 pueden leer objetos ilegibles. Registran para cada salida qué objeto se imprimió. Más tarde, cuando se vuelva a leer el código, el objeto se recuperará de la salida impresa.
Se pueden crear REPL para admitir cualquier idioma basado en texto. La compatibilidad con REPL para lenguajes compilados generalmente se logra implementando un intérprete encima de una máquina virtual que proporciona una interfaz para el compilador. Por ejemplo, a partir de JDK 9, Java incluyó JShell como interfaz de línea de comandos para el lenguaje. Varios otros idiomas tienen herramientas de terceros disponibles para descargar que brindan una interacción de shell similar con el idioma.
Como shell , un entorno REPL permite a los usuarios acceder a funciones relevantes de un sistema operativo además de brindar acceso a capacidades de programación. El uso más común de los REPL fuera de los shells del sistema operativo es la creación de prototipos interactivos . [7] Otros usos incluyen cálculo matemático, creación de documentos que integran análisis científicos (por ejemplo, IPython ), mantenimiento de software interactivo, evaluación comparativa y 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 Lisp REPL 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}}
: CS1 maint: postscript (link)