Un bucle de lectura-evaluación-impresión ( REPL ), también denominado intérprete interactivo de nivel superior o shell de lenguaje , es un entorno de programación sencillo e interactivo que toma entradas individuales del usuario, las ejecuta y devuelve el resultado al usuario; un programa escrito en un entorno REPL se ejecuta por partes. [ 1 ] El término suele referirse a interfaces de programación similares al entorno interactivo de máquina clásico Lisp o a Common Lisp con el entorno de desarrollo SLIME . 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 ] aunque sus características pueden variar mucho.
Historia
La expresión ciclo LEER-EVALUAR-IMPRESIÓN es utilizada por L. Peter Deutsch y Edmund Berkeley para una implementación de Lisp en el PDP-1 en 1964. [ 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 describía un lenguaje basado en REPL, llamado OPL-1, implementado en su lenguaje Fortran-SLIP en el Sistema de Tiempo Compartido Compatible (CTSS) . [ 4 ] [ 5 ] [ 6 ]
El manual de referencia de Maclisp de 1974 de David A. Moon atestigua el "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 documentadas en el contexto de Scheme . [ 8 ] [ 9 ]
Descripción general
En un REPL, el usuario introduce 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 de lectura-evaluación-impresión proviene de los nombres de las funciones primitivas de Lisp que implementan esta funcionalidad:
- La función de lectura acepta una expresión del usuario y la analiza para convertirla en una estructura de datos en memoria. Por ejemplo, el usuario puede ingresar la expresión s
(+ 1 2 3), que se analiza para convertirla en una lista enlazada que contiene cuatro elementos de datos. - La función eval toma esta estructura de datos interna y la evalúa. En Lisp, evaluar una expresión s que comienza con el nombre de una función significa llamar a esa función sobre los argumentos que componen el resto de la expresión. Por lo tanto, la función
+se llama sobre los argumentos1 2 3, lo que produce el resultado6. - La función print toma el resultado devuelto por eval y lo imprime para el usuario. Si se trata de una expresión compleja, puede formatearse para facilitar su comprensión.
El entorno de desarrollo vuelve entonces 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, ya que 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 mayor frecuencia que el ciclo clásico de edición-compilación-ejecución-depuración.
Dado que la función print genera la salida en el mismo formato de texto que la función read utiliza para la entrada, la mayoría de los resultados se imprimen en un formato que se puede copiar y pegar de nuevo en el REPL. Sin embargo, a veces es necesario imprimir representaciones de elementos que no se pueden leer de forma lógica, 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 puede leer objetos ilegibles. Registran para cada salida qué objeto se imprimió. Posteriormente, cuando se lea el código, el objeto se recuperará de la salida impresa.
Se pueden crear REPL para admitir cualquier lenguaje basado en texto. La compatibilidad con REPL para lenguajes compilados generalmente se logra 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 interfaz de línea de comandos para el lenguaje. Otros lenguajes cuentan con herramientas de terceros disponibles para descargar que ofrecen una interacción similar con el lenguaje, aunque las características pueden variar considerablemente.
Usos
Como entorno REPL, permite a los usuarios acceder a funciones relevantes del sistema operativo, además de proporcionar acceso a capacidades de programación. El uso más común de los REPL fuera de los entornos de sistemas operativos es 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 interactivo de software, la evaluación comparativa y la exploración de algoritmos.
Detalles de Lisp
Implementación
Una definición mínima en Common Lisp es:
( bucle ( imprimir ( evaluar ( leer ))))donde readespera la entrada del usuario y evalla evalúa. printImprime el resultado y loopentra en un bucle indefinidamente. Puedes entrar (+ 1 1)y detener el bucle con C-c.
Funcionalidad
Las funcionalidades típicas que ofrece un REPL de Common Lisp incluyen:
- Historial de entradas y salidas.
- Se definen variables para las expresiones de entrada y los resultados. Estas variables también están disponibles en el REPL. Por ejemplo, en Common Lisp
*se refiere al último resultado,**y***a los resultados anteriores. - Niveles de REPL. En muchos sistemas Lisp, si se produce un error durante la lectura, evaluación o impresión de una expresión, el sistema no regresa al nivel superior con un mensaje de error. En su lugar, se inicia un nuevo REPL, un nivel más profundo, en el contexto del error. El usuario puede entonces inspeccionar el problema, corregirlo y continuar, si es posible. Si se produce un error en dicho REPL de depuración, se inicia otro REPL, también un nivel más profundo. A menudo, el REPL ofrece comandos de depuración especiales.
- Manejo de errores . En Common Lisp, el REPL abre un depurador interactivo cuando ocurre un error. El depurador permite inspeccionar la pila de llamadas, saltar a la función con errores, corregirla, recompilarla y reanudar la ejecución, sin reiniciar todo el programa desde cero. El depurador también ofrece reinicios. Estos reinicios se pueden usar para volver a un nivel específico del REPL o para proporcionar un valor de entrada diferente.
- Entrada y salida de objetos de datos sensibles al ratón .
- Edición de texto y autocompletado contextual sobre símbolos, rutas de archivo, nombres de clases y otros objetos.
- Ayuda y documentación para los comandos.
- Variables para controlar el lector. Por ejemplo, la variable *read-base* controla en qué base numérica se leen los números por defecto.
- Variables para controlar la impresora. Ejemplo: longitud máxima o profundidad máxima de las expresiones a imprimir.
- Sintaxis de comandos adicional. Algunos REPL tienen comandos que no siguen la sintaxis de expresiones S, sino que a menudo trabajan con datos Lisp como argumentos.
- REPLs gráficos. Algunos REPLs de Lisp (CLIM Listener es un ejemplo y, en menor medida, SLIME ) también aceptan entrada y salida gráficas.
- Conexión a un programa remoto en ejecución. Es posible conectarse a un programa Common Lisp que se ejecuta en otra máquina e interactuar con él. Esto permite explorar su estado interno, modificar parámetros e incluso compilar código nuevo y actualizar el sistema.
Combinando archivos fuente y desarrollo REPL
Los desarrolladores de aplicaciones Lisp normalmente no escriben ni copian código en la consola interactiva (REPL). La utilizan para realizar pruebas rápidas, depurar y explorar un sistema en ejecución. Escriben su aplicación en un archivo fuente bajo control de versiones y utilizan comandos o atajos de teclado para compilar el código de forma interactiva. El proceso Lisp se ejecuta conectado al editor y compila el código nuevo sobre la marcha, sin necesidad de reiniciarse.
En Common Lisp, los desarrolladores suelen compilar la función actual en la que están trabajando. También pueden compilar un archivo completo o un proyecto entero. Al compilar una función, pueden aparecer advertencias de tipo (especialmente con la implementación SBCL ) y pueden invocar la función recién creada desde la consola interactiva (REPL). Si se produce un error, disponen de un depurador interactivo.
Este proceso de compilar una sola función y probarla en la consola interactiva (REPL) es muy rápido en comparación con otros procesos. El ciclo de escribir una nueva función, compilarla y probarla es muy corto e interactivo, lo que lo hace idóneo para el desarrollo. Además, esto significa que el estado de la aplicación no se pierde durante el desarrollo.
Solo cuando ellos deciden hacerlo, ejecutan o compilan toda la aplicación desde cero.
Véase también
Referencias
- 1 2 Grillmeyer, O. (2013). Explorando la informática con Scheme . Textos de pregrado en informática. Springer Nueva York. pág. 239. ISBN 978-1-4757-2937-5Recuperado el 26/06/2021 .
El componente central del intérprete de Scheme es el bucle de lectura-evaluación-impresión . Se leen los comandos y luego se evalúan. Finalmente, se imprime el resultado evaluado.
- ↑ Hola, Tony; Pápay, Gyuri (2014). El universo de la computación: un viaje a través de una revolución . Cambridge University Press. pág. 76. ISBN 978-1-316-12322-5Una característica principal de los lenguajes de scripting modernos es su interactividad, a veces denominada entorno de programación REPL . ... Las características de facilidad de uso y ejecución inmediata con un entorno REPL se consideran a veces la definición de un lenguaje de scripting.
{{cite book}}: CS1 mantenimiento: postscript ( enlace ) - ↑ L. Peter Deutsch; Edmund Berkeley, La implementación de LISP para la computadora PDP-1 (PDF) , pág. 15
- ↑ Joseph Weizenbaum, OPL-I: UN SISTEMA DE PROGRAMACIÓN ABIERTO DENTRO DE CTSS santichaymi2@gmail.com
- ↑ Es probable que ambos proyectos se llevaran a cabo en 1963, mucho antes de que aparecieran las respectivas publicaciones. Sin embargo, es imposible determinar con exactitud las fechas de invención.
- ↑ Existe una relación compleja e interesante entre Lisp y SLIP, ambos lenguajes de procesamiento de listas homónimos inventados por académicos vinculados al MIT: Shrager, Jeff (2024), ELIZA Reinterpreted: The world's first chatbot was not intended as a chatbot at all , arXiv : 2406.17650
- ↑ David A. Moon (8 de abril de 1974), Manual de referencia de MACLISP (PDF) , pág. 89
- ↑ Smith, Jerry D. (1988). Introducción a Scheme . Englewood Cliffs, NJ : Prentice Hall. pág . 8. ISBN 978-0-13-496712-7.
- ↑ Hanson, Chris (1986). "rep.scm -- Revisión inicial de 1986 de MIT-Scheme" . GitHub . Recuperado el 11 de junio de 2023 .
- ↑ van Binsbergen, L. Thomas; Verano Merino, Mauricio; Jeanjean, Pierre; van der Storm, Tijs; Combemale, Benoit; Barais, Olivier (17 de noviembre de 2020). «Un enfoque basado en principios para los intérpretes REPL». Actas del Simposio Internacional ACM SIGPLAN 2020 sobre Nuevas Ideas, Nuevos Paradigmas y Reflexiones sobre Programación y Software (PDF) . Nueva York, NY, EE. UU.: ACM. págs. 84–100 . doi : 10.1145/3426428.3426917 . ISBN 978-1-4503-8178-9.
Enlaces externos
- Paul Graham ha escrito una descripción de una implementación REPL en Common Lisp.
- Lista de REPs y REPLs en línea de Joël Franusic
- shells de comandos
- Lisp (lenguaje de programación)
- Intérpretes (informática)
- Técnicas de interfaz de usuario