[JAVA] Kinx-Bibliothek --REPL

Kinx-Bibliothek --REPL

Einführung

** "Sieht aus wie JavaScript, Gehirn (Inhalt) ist Ruby, (Stabilität ist AC / DC)" ** Skriptsprache Kinx ). Die Sprache ist die Bibliothek. Also, wie man die Bibliothek benutzt.

Diese Zeit ist REPL.

Anfangs war ich pessimistisch, dass ich REPL nicht machen konnte, aber ich möchte etwas vorstellen, das so funktioniert.

Dies liegt daran, dass, wenn Sie "evel" gehorsam ausführen, der Codebereich bei jeder Ausführung gleichmäßig anschwillt. Deshalb habe ich Isolate früher eingeführt. / 78cf553b65e286ea39c4) wird jetzt in einem anderen Kontext ausgeführt. Dadurch wurde die Speichernutzung erheblich verbessert.

In diesem Fall ist der Kontext jedoch anders, sodass ** Objekte nicht übergeben werden können **. Ich habe es geschafft, indem ich die Klassen- und Funktionsdefinition jedes Mal an "eval" übergeben habe. als Ergebnis,,,

  1. Es ist als Computer verwendbar geworden.
  2. Funktionen (function / native), Klassen und Module können unverändert verwendet werden.
  3. Escape-Sequenz ** bunt auch unter Windows **.
  4. Ich habe auch versucht, Schlüsselwörter mit der Taste "[TAB]" zu vervollständigen.
  5. Unterstützung der ostasiatischen Breite. UTF8-Zeichen sollten auch als "[BS]" oder "[DEL]" geschrieben werden. Zumindest Japanisch ist in Ordnung.

Es wurde insoweit abgeschlossen, als. Hart gearbeitet...

What is REPL?

"Was ist REPL?", => Read-Eval-Print-Loop. Lesen Sie die Eingabe "eval ()" (auswerten) und zeigen Sie das Ergebnis usw. an.

Wie benutzt man

Startmethode

REPL ist in den Kinx-Körper integriert, ähnlich wie SpecTest. Führen Sie wie folgt aus.

$ ./kinx --exec:repl
kinx[  0]> _

Die Farben sind hier unterschiedlich, da sie in Markdown beschrieben werden. In Wirklichkeit werden Eingabeaufforderungen und Schlüsselwörter hervorgehoben und in Farbe angezeigt (sowohl Windows als auch Linux).

Zuerst habe ich versucht, ein Bild zu erstellen, um es zu verstehen, aber da es immer noch eine Demo ist, habe ich mich bemüht, eine Demo zu erstellen. ** Bitte jemanden loben **.

repl.gif

Sie können sehen, dass die automatische Vervollständigung (Keyword-Vervollständigung) ebenfalls ordnungsgemäß funktioniert. Dieser Bereich ist ohne Demo schwer zu verstehen. Sehen heißt glauben.

Stichprobe

Probieren Sie zunächst den hier aufgeführten aus (Ruby, der in 20 Minuten startet) (https://www.ruby-lang.org/en/documentation/quickstart/). Es ist gut, es ist auf diesem Niveau richtig gemacht.

$ ./kinx --exec:repl
kinx[  0]> "Hello, world"
=> "Hello, world"

kinx[  1]> System.println("Hello, world")
Hello, world
=> (null)

kinx[  2]> 3+2
=> 5

kinx[  3]> 3*2
=> 6

kinx[  4]> 3**2
=> 9

kinx[  5]> Math.sqrt(9)
=> 3

kinx[  6]> a = 3 ** 2
=> 9

kinx[  7]> b = 4 ** 2
=> 16

kinx[  8]> Math.sqrt(a+b)
=> 5

Dann ist es das Hauptthema.

Befehlsliste

Alle Befehle beginnen mit ..

Befehl Inhalt
.help Hilfe anzeigen
.quit Ende
.history Befehlsverlauf anzeigen
.vars Anzeige der aktuellen Variablenliste
.delete name Aus der aktuellen VariablenlistenameVariable löschen
.showdef name Funktions- und Klassendefinitionen anzeigen
.cursor [*on/off] Schalten Sie die Cursoranzeige ein/AUS (Standard EIN)
.fullcode [on/*off] Voller Eingabemodus (Standard AUS),.runNicht ausführen, bis der Befehl eingegeben wurde
.time [on/*off] Ausführungszeit-Messmodus (Standard AUS), zeigt die Ausführungszeit nach der Ausführung an
.run Wird verwendet, um im vollständigen Eingabemodus zu laufen

Bitte beachten Sie, dass Sie auch mit Strg-C beenden können.

Geben Sie .help ein, um die folgende Hilfe zu erhalten.

kinx[  0]> .help
Kinx REPL Command: * means by default
    .help               Display this help.
    .quit               Quit REPL.
    .history            Display command history.
    .vars               Display variables with its value.
    .delete name        Delete a variable by name.
    .showdef name       Display function/class definition by name.
    .cursor [*on|off]   Set to 'off' to make the cursor invisible.
    .fullcode [on|*off] Set to 'on', and the code will be executed by .run instead of immediately.
    .time [on|*off]     Set to 'on' to measure and display elapsed time.
    .run                Execute the code only with .fullcode 1.

REPL Operation:
    [^] Arrow up        Choose a previous command.
    [v] Arrow down      Choose a next command.
    [<] Arrow left      Move cursor to left.
    [>] Arrow right     Move cursor to right.
    Ctrl+[<]            Move cursor to left by word.
    Ctrl+[>]            Move cursor to right by word.
    [DEL]               Delete character on cursor.
    [BS]                Delete previous character.
    [TAB]               Move to the next tab stop, or auto-complete.

Bewegen Sie den Cursor mit den Cursortasten nach links und rechts und wortweise mit Strg + links und rechts. Sie können den Verlauf mit den Auf- und Ab-Tasten anzeigen.

Zeileneditor

Grundsätzlich akzeptiert der Zeileneditor die Eingabe und führt die Eingabe sofort aus.

kinx[  0]> 10 * 2
=> 20

Automatische mehrzeilige Beurteilung und automatische Einrückung

Es erkennt automatisch das {und das entsprechende} und bleibt im Editor-Modus, bis der gesamte Block gefüllt ist. Zu diesem Zeitpunkt wird der Einzug für 4 Leerzeichen automatisch entsprechend der Anzahl von { hinzugefügt.

Sie können diese Zeile jedoch nur bearbeiten, sodass Sie sie nach Eingabe von "[Enter]" nicht mehr bearbeiten können.

Verwenden Sie diese Funktion, um "Funktion", "Klasse", "Modul" usw. zu definieren.

kinx[  0]> function func(...a) {
	[  1]>     return a.reduce(&(r, e) => r + e);
	[  2]> }
=> function func

Auf diese Weise können Sie die Funktion wie folgt verwenden.

kinx[  0]> function func(...a) {
    [  1]>     return a.reduce(&(r, e) => r + e);
    [  2]> }
=> function func

kinx[  3]> func(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
=> 55

Sie können die registrierte Funktion wie folgt überprüfen.

kinx[  4]> .vars
function func(...a)

kinx[  5]> .showdef func
function func(...a) {
    return a.reduce(&(r, e) => r + e);
}

Keyword-Vervollständigung

Befehle und Schlüsselwörter werden durch Drücken der Taste [TAB] in den Abschlussmodus versetzt. Der Abschlussmodus vervollständigt eine Zeichenfolge, die der vorhergehenden Zeichenfolge in hellgrau folgen kann. Sie können es in der obigen Demo überprüfen, die ich versucht habe zu machen. Es wäre jedoch mühsam, wieder nach oben zu gehen, daher werde ich es erneut veröffentlichen (weil ich es geschafft habe).

repl.gif

Wenn Sie die Taste [TAB] drücken, während dieser Kandidat angezeigt wird, können Sie zum nächsten Kandidaten wechseln. Zu diesem Zeitpunkt werden die folgenden Schlüsseloperationen ausgeführt.

Abschlusskandidaten ändern sich je nach Kontext der Position. Wenn es sich beispielsweise um ein Array aus der Vergangenheit handelt, wird die Methode "Array" ebenfalls als Kandidat hinzugefügt. Darüber hinaus werden den Kandidaten auch die Klassenmethode usw. hinzugefügt, z. B. wenn ein mit dem Operator "new" instanziiertes Objekt in der Vergangenheit zugewiesen wurde.

Sie können einige dieser Beispiele in der zu Beginn gezeigten Demo sehen. Zum Beispiel werden "Wert" und "Summe" als Kandidaten für "s" in der letzten Zeile angezeigt.

In einigen Fällen funktioniert dies möglicherweise nicht gut. Wenn Sie jedoch eine Zeichenkette zur Hälfte eingeben und die Taste "[TAB]" drücken, werden Kandidaten, die mit dieser Zeichenkette beginnen, nacheinander angezeigt. Probieren Sie verschiedene Dinge aus. Bitte gib mir.

Außerdem wird der Namespace nicht unterstützt.

Liste der Variablen

Der Befehl .vars zeigt eine Liste der aktuell aktivierten Variablen an. Beachten Sie, dass Funktionsnamen und Klassennamen in derselben Spalte wie Variablennamen behandelt werden, sodass sie nicht mit demselben Namen registriert werden können. Es wird mit dem später definierten überschrieben.

kinx[ 20]> .vars
class Sample(...a)
a = 10
b = 20
c = 30
d = 40
e = 50
f = 60
g = 70
sample = new Sample(a, b, c, d, e, f, g)

Variablen löschen

Mit dem Befehl .delete können Sie nicht mehr benötigte Variablen angeben und löschen. Wenn Sie es demselben Variablennamen zuweisen, wird es überschrieben, sodass Sie möglicherweise nicht viel Gelegenheit haben, es zu verwenden. Es gibt jedoch Fälle, in denen "Kompilierungsfehler" auftritt, wenn die Registrierungsreihenfolge von Variablen aufgrund wiederholten Überschreibens falsch ist oder wenn die Abhängigkeit von Variablen aufgrund der Verwendung des Befehls ".delete" falsch ist. Löschen Sie in diesem Fall die seltsame Variable und registrieren Sie sie erneut, damit sie ordnungsgemäß funktioniert.

Zum Beispiel gibt es Fälle, in denen die obigen Variablen wie folgt registriert werden.

kinx[ 25]> .delete g      //Entfernen Sie g
kinx[ 26]> sample.sum()   //Die Beispielinstanz ist fehlerhaft, weil g weg ist.
=> Error: Compile Error.

kinx[ 27]> .vars
class Sample(...a)
a = 10
b = 20
c = 30
d = 40
e = 50
f = 60
sample = new Sample(a, b, c, d, e, f, g)  // <-Illegale Form, weil g hier weg ist.

kinx[ 28]> g = 60         //Ich möchte ein neues g registrieren, aber es liegt ein Kompilierungsfehler vor.
=> Error: Compile Error.

kinx[ 29> .delete sample  //Die fehlerhafte Instanz stört die Ausführung. Löschen Sie sie daher ebenfalls.
kinx[ 30]> g = 60         //g kann neu registriert werden.
=> 60

kinx[ 31]> var sample = new Sample(a, b, c, d, e, f, g)  //Probe wird ebenfalls neu registriert.
=> (null)

kinx[ 32]> sample.sum() //Kann mit dem neuen g ausgeführt werden.
=> 270

Funktions-, Klassen- und Moduldefinitionen anzeigen

In .vars werden der Funktionsname und der Klassenname in der Listenanzeige angezeigt, die Definition wird jedoch nicht angezeigt. Sie können dann den Befehl .showdef verwenden, um den Inhalt der Definition anzuzeigen.

kinx[ 33]> .showdef Sample
class Sample(...a) {
    @value = a;
    public sum() {
        return @value.reduce(&(r, e) => r + e);
    }
}

Ausführungsverlauf

Sie können den bisherigen Ausführungsverlauf mit dem Befehl .history überprüfen. Beispielsweise wird die folgende Anzeige angezeigt (die Nummer unterscheidet sich vom obigen Beispiel, ist jedoch ein Beispiel).

[  0]: class Sample(...a) {
[  1]:     @value = a;
[  2]:     public sum() {
[  3]:         return @value.reduce(&(r, e) => r + e);
[  4]:     }
[  5]: }
[  6]: a = new Sample(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
[  7]: .vars
[  8]: System.println(a.sum());
[  9]: a = 10
[ 10]: b = 20
[ 11]: c = 30
[ 12]: d = 40
[ 13]: e = 50
[ 14]: f = 60
[ 15]: g = 70
[ 16]: .vars
[ 17]: var sample = new Sample(a, b, c, d, e, f, g)
[ 18]: sample.sum()
[ 19]: .vars
[ 20]: sample.sum()
[ 21]: .showdef System
[ 22]: .showdef Sample
[ 23]: .vars
[ 24]: sample.sum()
[ 25]: .delete g
[ 26]: sample.sum()
[ 27]: .vars
[ 28]: g = 60
[ 29]: g = 60
[ 30]: .vars
[ 31]: .delete sample
[ 32]: g = 60
[ 33]: var sample = new Sample(a, b, c, d, e, f, g)
[ 34]: sample.sum()
[ 35]: .history

Aus der Vergangenheit können Sie auch mit ! Darauf verweisen, wie unten gezeigt.

kinx[ 36]> !34
=> "sample.sum();"
=> 270

Sie können den Verlauf auch als Wiedereintrittsziel auswählen, indem Sie die Cursortasten nach oben und unten drücken.

Messung der Ausführungszeit

Wenn Sie ".time on" einstellen, wird das Ausführungsergebnis angezeigt. Da das Messergebnis einfach die verstrichene Zeit ist, bis es als "Bewertung" zurückgegeben wird, enthält es verschiedene Gemeinkosten, ist jedoch eine Richtlinie.

kinx[  0]> native fib(n) {
    [  1]>     return n if (n < 3);
    [  2]>     return fib(n-2) + fib(n-1);
    [  3]> }
=> native<int> fib

kinx[  4]> .time on
.time: on

kinx[  5]> fib(39)
=> 102334155

elapsed:    1.238 s

kinx[  6]> fib(34)
=> 9227465

elapsed:    0.131 s

Voller Eingabemodus

Wenn ".fullcode on" aktiviert ist, wird es nur durch Drücken der Taste "[Enter]" nicht ausgeführt. Geben Sie weiter ein, bis Sie den Befehl .run eingeben. Im vollständigen Eingabemodus sind Variablen und Klassendefinitionen derzeit jedoch nicht ** registriert **. Alles wird eine einmalige Ausführung nur dieser Eingabe sein.

kinx[  0]> .fullcode on
.fullcode: on

kinx[  1]> class Something() {
    [  2]>         public println(...a) {
    [  3]>                 System.println(a);
    [  4]>         }
    [  5]> }
    [  6]> s = new Something();
    [  7]> s.println(1, 2, 3, 4, 5, 6, 7, 8);
    [  8]> .run
[1, 2, 3, 4, 5, 6, 7, 8]
=> {"s":null}

kinx[  9]> .vars

kinx[ 10]>

Externe Datei lesen

Verwenden Sie den Befehl .load, um eine externe Datei zu importieren. Module, die als normale Bibliotheken verwendet werden, werden auch mit .load geladen. Sie können die Vervollständigung einiger Methodennamen aktivieren, indem Sie mit .load laden.

Wenn Sie beispielsweise "DateTime" verwenden, können Sie Folgendes tun:

kinx[  0]> .load DateTime
=> Successfully loaded.

kinx[  1]> var dt = new DateTime(2020, 1, 1, 9, 30, 0)
=> (null)

kinx[  2]> .vars
dt = new DateTime(2020, 1, 1, 9, 30, 00)

kinx[  3]> dt.weekday()
=> 3

kinx[  4]> System.println(dt)
2020/01/01 09:30:00

Der Name der Suchdatei lautet "angegebener Name.kx". Das Suchziel wird in der folgenden Reihenfolge ausgeführt. Sie können sich also auch auf die Standardbibliothek beziehen.

  1. Aktuelles Verzeichnis
  2. Im Ordner "lib" unter dem Ordner, der die ausführbare Datei "kinx" enthält
  3. Im Ordner "lib / std" unter dem Ordner, der die ausführbare Datei "kinx" enthält
  4. Im Ordner ../ lib aus dem Ordner, der die ausführbare Datei kinx enthält
  5. Im Ordner "kinxlib" unter dem Ordner, der die ausführbare Datei "kinx" enthält
  6. Im Ordner "kinxlib / std" unter dem Ordner, der die ausführbare Datei "kinx" enthält

Entschuldigung, in der Version 0.9.2 wird unter Linux der Fehler ".load DateTime" angezeigt, da dies nicht berücksichtigt wurde (5 und 6 wurden für Linux benötigt, aber noch nicht implementiert). Geben Sie als Problemumgehung .load / usr / bin / kinxlib / std / DateTime an. Es ist schwer. Es tut mir Leid.

Derzeit gibt es jedoch zwei Einschränkungen in Bezug auf DateTime. Es kann in zukünftigen Versionen verbessert werden.

East Asian Width

Unterstützt die Eingabe in UTF8. Da der Cursor gemäß der Definition der ostasiatischen Breite bewegt wird, bewegen sich Zeichen voller Breite mit dieser Breite. Im folgenden Beispiel bewegt "aiueo" den Cursor auch zeichenweise in voller Breite, und "Aiueo" bewegt den Cursor in halber Breite. Das Löschen mit den Tasten "[DEL]" und "[BS]" funktioniert ebenfalls ordnungsgemäß.

$ ./kinx --exec:repl
kinx[  0]> a = "Aiueo Aiueo";
=> "Aiueo Aiueo"

kinx[  1]> System.println(a);
Aiueo Aiueo
=> (null)

kinx[  2]> a = "Diese Art von Aio";  //Auf "U"[DEL]Und auf "O"[BS]Drücken Sie.
=> "Diese Art von Aio"

kinx[  3]> System.println(a);
Diese Art von Aio
=> (null)

abschließend

Ich habe irgendwo gelesen, dass die Programmiersprache ohne REPL ** zur Hälfte dient, also habe ich mein Bestes gegeben, um es zu schaffen (es war schwer ...). Das heißt, es entwickelt sich immer noch. Mit dieser ersten Ausgabe möchte ich auf Wunsch Verbesserungen vornehmen.

Es wäre großartig, wenn mehr Menschen diese Gelegenheit nutzen könnten. Wir haben auch einen Release-Build veröffentlicht, wenn Sie möchten.

Bis zum nächsten Mal.

Recommended Posts

Kinx-Bibliothek --REPL
Kinx-Bibliothek - Getopt
Kinx Library --DateTime
Kinx Library - Prozess
Kinx Library-JIT-Compiler-Bibliothek
Kinx Library-JIT-Compiler-Bibliothek (Extra Edition)