Wie können Ruby und Python ihre interaktiven Konsolen implementieren?

Bei der Implementierung des Dolmetschers für meine Programmiersprache habe ich zuerst an ein einfaches Konsolenfenster gedacht, das dem Benutzer erlaubt, einen Code einzugeben, der dann als eigenständiges Programm als Shell ausgeführt wird.

Aber es gibt schwere Probleme: Wenn jede Codezeile, die der Benutzer betritt, als eigenständiges Programm behandelt wird, muss es durch den Tokenizer und den Parser gehen und wird dann nur vom Dolmetscher ausgeführt – was ist mit den Funktionen?

  • Wie können die Python / Ruby interaktiven Konsolen (IDLE, irb) den Code teilen? Wie wird der eingegebene Code behandelt?

Beispiel:

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

Wo ist die Funktion gespeichert, so dass sie jederzeit wieder aufgerufen werden kann?

Wie kann die interaktive Konsole alles als offensichtlich ein Programm betreten, ohne alles immer wieder zu machen?

3 Solutions collect form web for “Wie können Ruby und Python ihre interaktiven Konsolen implementieren?”

Für Python ist ein Ausdruck nicht vollständig, bis alle Klammern, Klammern usw. zusammenpassen. Das ist ziemlich leicht zu erkennen. Eine Funktion / Klassendefinition ist nicht abgeschlossen, bis eine vollständig leere Zeile eingegeben wird. Der Compiler kompiliert dann den eingegebenen Ausdruck oder die Definition und führt ihn aus.

Ähnlich wie eine normale Funktion, Klasse, Modul, etc., hat die REPL ihren eigenen lokalen Bereich. Es ist dieser Bereich, der für Variablen und Definitionen verwendet wird, die in die REPL eingegeben wurden.

Sie können mehr über die interaktive Python-Konsole erfahren, indem Sie die Dokumentation für das Code-Modul lesen:

Das Code-Modul bietet die Möglichkeit, read-eval-print-Schleifen in Python zu implementieren. Es sind zwei Klassen und Komfortfunktionen enthalten, die zum Erstellen von Anwendungen verwendet werden können, die eine interaktive Interpreter-Aufforderung bieten.

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

Die meisten dieser Sprachen verwenden einen Parser, der eine Art "Token-Stream" hat – das heißt, der Parser hält Token (einen String, Symbol, Operator, etc.) aus dem Input-Stream, bis er einen vollständigen Ausdruck hat, dann kehrt er zurück Der den Ausdruck analysiert, wo er zum Bytecode kompiliert oder anderweitig ausgeführt werden könnte. Eine REPL-Schleife ist relativ einfach zu handhaben, da Struktur, da der Parser grundsätzlich nach mehr Eingabe fragt, und Sie geben dem Benutzer eine Aufforderung und haben den Benutzer mehr Eingabe eingeben. Du brauchst ein bisschen Kommunikation vom Parser zum Leser, um es zu machen, Dinge wie Fortsetzungsaufforderungen zu machen.

Python und Ruby beide Anweisungen sofort ausführen, in-order (eine Funktionsdeklaration ist eine Anweisung). So können Sie Code-Statement-by-Anweisung am Interpreter weitgehend die gleiche Wirkung wie in einer Quelldatei ausführen.

  • Wie kann man die Unicode-Codepunkte finden, die eine Schriftart hat, auf einem Debian-basierten System?
  • Bildgrößenbestimmung Web Service
  • Was ist der Punkt der heterogenen Arrays?
  • Gibt es eine Cart / Catalog App da draußen, die nicht eine volle Seite ist?
  • Nennen Sie dieses Python / Rubin-Sprachkonstrukt (mit Array-Werten, um Funktionsparameter zu erfüllen)
  • `If ​​__name__ == '__main __'` äquivalent in Ruby
  • Python, Ruby, Haskell - bieten sie echte Multithreading?
  • Running Python / Ruby Skript auf dem iPhone?
  • Wie nehme ich die Ausgabe eines Programms und benutze es als Eingabe eines anderen?
  • Wie schreibe ich ein Perl, Python oder Ruby Programm, um den Speicher eines anderen Prozesses unter Windows zu ändern?
  • Sparen Sie JSON aus einer URL in eine Datei
  • Python ist die beste Programmiersprache der Welt.