2010-04-15 11 views
8

Al implementar el intérprete para mi lenguaje de programación, primero pensé en una ventana de consola simple que permite al usuario ingresar un código que luego se ejecuta como un programa independiente como un shell.¿Cómo implementan Ruby y Python sus consolas interactivas?

Pero hay problemas graves: si cada línea de código que ingresa el usuario se maneja como un programa independiente, tiene que pasar por el tokenizador y el analizador y luego el intérprete simplemente lo ejecuta, ¿qué ocurre con las funciones?

  • ¿Cómo pueden las consolas interactivas Python/Ruby (IDLE, irb) "compartir" el código? ¿Cómo se maneja el código ingresado?

Ejemplo:

>> def x: 
>> print("Blah") 
>> 
>> x() 

donde se almacena la función por lo que se puede llamar en cualquier momento de nuevo?

¿Cómo puede la consola interactiva tomar todo lo que se ingrese como obviamente un programa sin ejecutar todo una y otra vez?

Respuesta

5

Para Python, una expresión no está completa hasta que todos los paréntesis, corchetes, etc. coincidan. Esto es bastante fácil de detectar. Una definición de función/clase no está completa hasta que se ingresa una línea completamente en blanco. El compilador luego compila la expresión o definición introducida y la ejecuta.

Al igual que una función normal, clase, módulo, etc., el REPL tiene su propio alcance local. Es este alcance el que se usa para las variables y definiciones ingresadas en REPL.

3

Usted puede aprender más acerca de la consola Python interactiva mediante la lectura de la documentación para el módulo de código:

El módulo de código proporciona facilidades para implementar bucles en Python eval-print lectura. Se incluyen dos clases y funciones de conveniencia que se pueden usar para crear aplicaciones que brindan un intérprete interactivo.

http://docs.python.org/library/code.html

3

La mayoría de estos idiomas utilizan un analizador que tiene una especie de "corriente token" - es decir, el analizador mantiene tomando fichas (una cadena, símbolo, operador, etc.) a partir de la entrada transmitir hasta que tenga una expresión completa, luego devuelve esa expresión analizada donde podría ser compilada a bytecode o ejecutada de otra manera. Un bucle REPL es relativamente fácil de manejar dada esa estructura, ya que el analizador básicamente solicita más entradas, y usted le da al usuario un aviso y le pide al usuario que ingrese más información. Es posible que necesite un poco de comunicación del analizador para que el lector lo represente como indicaciones de continuación.

Python y Ruby ambos ejecutan sentencias inmediatamente, en orden (una declaración de función es una declaración). De modo que puede ejecutar el código declaración por instrucción en el intérprete para que tenga el mismo efecto que en un archivo fuente.

Cuestiones relacionadas