Diferencia entre un REPL y un shell interactivo


37

Pregunta novata. No puedo distinguir la diferencia entre un REPL y un shell interactivo simplemente leyendo las definiciones en Wikipedia.

Wiki señala que REPL es un tipo particular de shell de lenguaje interactivo. Sin embargo, ¿es un subconjunto adecuado? La definición de Wiki parece restringir la terminología REPL a los lenguajes similares a Lisp, mientras que las propiedades indicadas realmente no contienen ninguna característica distintiva.

En particular, ¿sería correcto llamar a IPython un REPL?

Respuestas:


24

REPL: este es un procedimiento que simplemente repite, acepta un comando a la vez, lo ejecuta e imprime el resultado.

Los tres pasos en cada iteración del bucle son:

  1. Llamando a read para leer los caracteres que forman una expresión textual desde el búfer de entrada del teclado, y construir una estructura de datos para representarlo,
  2. Al llamar a eval para evaluar la expresión, intuitivamente, eval "descubre lo que significa la expresión" y "hace lo que dice hacer", devolviendo el valor de la expresión, y
  3. Llamando a escribir para imprimir una representación textual del resultado de eval, para que el usuario pueda verlo.

Puede escribir su propio bucle read-eval-print para sus propios programas, de modo que los usuarios puedan escribir expresiones y pueda interpretarlas de la forma que desee. Puede iniciar su ciclo de lectura-evaluación-impresión (escribiendo (rep-loop)), y se hará cargo del ciclo normal de lectura-evaluación-impresión del esquema, interpretando las expresiones a su manera.

Aquí hay un bucle muy simple de lectura-evaluación-impresión:

  (define (rep-loop)
  (display "repl>")      ; print a prompt
  (write (eval (read)))  ; read expr., pass to eval, write result
  (rep-loop))            ; loop (tail-recursive call) to do it again

Observe que la expresión (write (eval (read))) hace las cosas en el orden correcto de lectura-evaluación-impresión, porque el argumento de cada llamada al procedimiento se calcula antes de la llamada real.

Shell interactivo: un shell interactivo lee comandos de la entrada del usuario en un terminal. Entre otras cosas, dicho shell lee los archivos de inicio en la activación, muestra un mensaje y permite el control del trabajo de forma predeterminada. El usuario puede interactuar con el shell. Así es como surgió el nombre del shell interactivo. Consideremos este script bash:

     #!/bin/bash
     echo -n "Enter the value of variable 'var1': "
     read var1
     echo "var1 = $var1"
     echo

    echo -n "Enter the values of variables 'var2' and 'var3' "
    echo =n "(separated by a space or tab): "
    read var2 var3
    echo "var2 = $var2      var3 = $var3"
    #  If you input only one value,
    #+ the other variable(s) will remain unset (null).

    exit 0

Ahora el script anterior interactúa con el usuario, le pide al usuario que ingrese entradas en función de las cuales realiza sus cálculos. Por eso se comporta como un shell interactivo.

De manera similar, el intérprete de Python que la mayoría de la gente usa para aprender Python es interactivo ya que se comunica con su usuario.


1
@ The Dark Knight: Entonces, según la teoría anterior, ¿podemos decir que la barra de herramientas del desarrollador (en Chrome) o la extensión Firebug (en Firefox) es un poco REPL?
Rajkishore

9

Técnicamente, es correcto decir que un shell es una instancia de un REPL. Sin embargo, no es una cuestión de definición de programa, ya que es uno de los escenarios de uso comunes.

Bash, por ejemplo, está escrito en C, pero bien podría haberse escrito en Python. En ese punto, si habla de las características y habilidades del programa, ¿sería correcto decir que Bash es un shell mientras que Python no lo es?

También se podría decir que los shells se tratan de ejecutar comandos, mientras que los REPL se tratan de ejecutar instrucciones y llamadas a funciones. Pero, ¿no puede ejecutar comandos en REPLs (sistema os. de Python, os.popen, etc.), y no puede ejecutar (o definir) funciones en Bash, utilizando muchas de sus funciones integradas?

Como se mencionó anteriormente, es una cuestión de uso. Si hace juegos malabares con archivos y programas listos, lo está utilizando como un shell. Si está probando bibliotecas o semántica de lenguaje, es un REPL.

Espero que ayude.


3

Esta pregunta de StackOverflow analiza esa misma pregunta (entre otras cosas).

Personalmente estoy en la cerca en lo que respecta a Python interactivo. Pero, si quiere llamarlo REPL, no creo que nadie se enoje con usted (hay demasiadas cosas que funcionan en los archivos de código fuente, pero no en el shell interactivo para que yo esté completamente feliz de llamar es una REPL).


Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.