** "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,,,
function
/ native
), Klassen und Module können unverändert verwendet werden.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.
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 **.
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.
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.
Alle Befehle beginnen mit .
.
Befehl | Inhalt |
---|---|
.help |
Hilfe anzeigen |
.quit |
Ende |
.history |
Befehlsverlauf anzeigen |
.vars |
Anzeige der aktuellen Variablenliste |
.delete name |
Aus der aktuellen Variablenlistename Variable 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),.run Nicht 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.
Grundsätzlich akzeptiert der Zeileneditor die Eingabe und führt die Eingabe sofort aus.
kinx[ 0]> 10 * 2
=> 20
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);
}
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).
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.
[BS]
, [DEL]
Taste ... Bestätigt mit dem aktuellen Kandidaten und der Cursor wartet an dieser Position auf die Eingabe.[Enter]
Taste ... Im laufenden Betrieb bestätigen und ausführen oder zur nächsten Zeile wechseln.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.
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)
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
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);
}
}
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.
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
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]>
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.
../ lib
aus dem Ordner, der die ausführbare Datei kinx
enthältEntschuldigung, 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)
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.