Janet ist eine Programmiersprache für Systemscripting, Ausdrucksautomatisierung und Erweiterung von Programmen, die in C oder C ++ mit Benutzer -Skriptfunktionen geschrieben wurden.
Janet macht eine gute System -Skriptsprache oder eine Sprache, um sich in andere Programme einzubetten. Es ist in dieser Hinsicht wie Lua und Gnu Guile. Es hat mehr integrierte Funktionen und eine reichhaltigere Kernsprache als Lua, aber kleiner als GNU Guile oder Python. Es ist jedoch viel einfacher, sich einzubetten und python oder laulisch zu betten.
Es gibt eine Wiederholung, um die Sprache auszuprobieren, sowie die Möglichkeit, Skriptdateien auszuführen. Dieses Client -Programm ist von der Kernlaufzeit getrennt, sodass Janet in andere Programme eingebettet werden kann. Probieren Sie Janet in Ihrem Browser unter https://janet-lang.org.
Sehen Sie sich das Beispielverzeichnis für alle bereitgestellten Beispielprogramme an.
# John Conway's Game of Life
( def- window
( seq [ x :range [ -1 2 ]
y :range [ -1 2 ]
:when ( not ( and ( zero? x ) ( zero? y )))]
[ x y ]))
( defn- neighbors
[[ x y ]]
( map ( fn [[ x1 y1 ]] [( + x x1 ) ( + y y1 )]) window ))
( defn tick
" Get the next state in the Game Of Life. "
[ state ]
( def cell-set ( frequencies state ))
( def neighbor-set ( frequencies ( mapcat neighbors state )))
( seq [ coord :keys neighbor-set
:let [ count ( get neighbor-set coord )]
:when ( or ( = count 3 ) ( and ( get cell-set coord ) ( = count 2 )))]
coord ))
( defn draw
" Draw cells in the game of life from (x1, y1) to (x2, y2) "
[ state x1 y1 x2 y2 ]
( def cellset @{})
( each cell state ( put cellset cell true ))
( loop [ x :range [ x1 ( + 1 x2 )]
:after ( print )
y :range [ y1 ( + 1 y2 )]]
( file/write stdout ( if ( get cellset [ x y ]) " X " " . " )))
( print ))
# Print the first 20 generations of a glider
( var *state* '[( 0 0 ) ( -1 0 ) ( 1 0 ) ( 1 1 ) ( 0 2 )])
( for i 0 20
( print " generation " i )
( draw *state* -7 -7 7 7 )
( set *state* ( tick *state* ))) # A simple TCP echo server using the built-in socket networking and event loop.
( defn handler
" Simple handler for connections. "
[ stream ]
( defer ( :close stream )
( def id ( gensym ))
( def b @" " )
( print " Connection " id " ! " )
( while ( :read stream 1024 b )
( printf " %v -> %v " id b )
( :write stream b )
( buffer/clear b ))
( printf " Done %v! " id )
( ev/sleep 0.5 )))
( net/server " 127.0.0.1 " " 8000 " handler ) # Use the FFI to popup a Windows message box - no C required
( ffi/context " user32.dll " )
( ffi/defbind MessageBoxA :int
[ w :ptr text :string cap :string typ :int ])
( MessageBoxA nil " Hello, World! " " Test " 0 ) Die Dokumentation ist auch lokal in der Repl. Verwenden Sie das (doc symbol-name) -Makro, um API-Dokumentation für Symbole in der Kernbibliothek zu erhalten. Zum Beispiel,
(doc apply)
Zeigt Dokumentation für die apply an.
Verwenden Sie die (all-bindings) -Funktion, um eine Liste aller Bindungen in der Standardumgebung zu erhalten. Sie können auch das (doc) -Makro ohne Argumente verwenden, wenn Sie in der Reply sind, um gebundene Symbole anzuzeigen.
Sie können die Quelle auf Github oder SourceHut erhalten. Während das Github -Repo das offizielle Repo ist, wird der Quellhut -Spiegel aktiv aufrechterhalten.
Das Makefile ist nicht portierbar und erfordert Gnu-Flora-Make.
cd somewhere/my/projects/janet
make
make test
make repl
make install
make install-jpm-git Erfahren Sie mehr über die verfügbaren Make -Ziele, indem Sie make help .
32-Bit-Haiku-Build-Anweisungen entsprechen den Unix-ähnlichen Build-Anweisungen, aber Sie müssen einen alternativen Compiler wie gcc-x86 angeben.
cd somewhere/my/projects/janet
make CC=gcc-x86
make test
make repl
make install
make install-jpm-git FreeBSD-Build-Anweisungen entsprechen den Unix-ähnlichen Build-Anweisungen, aber Sie benötigen gmake , um zu kompilieren. Installieren Sie das Paket alternativ direkt mit pkg install lang/janet .
cd somewhere/my/projects/janet
gmake
gmake test
gmake repl
gmake install
gmake install-jpm-git NetBSD Build -Anweisungen entsprechen den Anweisungen für FreeBSD -Build. Installieren Sie das Paket alternativ direkt mit pkgin install janet .
cl.exe und link.exe müssen auf Ihrem Weg sein) und cd mit Janet in das Verzeichnis.build_win , um Janet zu kompilieren.build_win test aus, um sicherzustellen, dass alles funktioniert. Um ein ausführbares .msi -Installationsprogramm zu erstellen, müssen Sie zusätzlich zu den oben genannten Schritten:
build_win dist . Jetzt sollten Sie ein .msi haben. Sie können build_win install um das .msi zu installieren oder die Datei selbst auszuführen.
Janet hat auch eine Build-Datei für Meson, ein plattformübergreifendes Build-System. Obwohl Meson eine Python -Abhängigkeit hat, ist Meson ein sehr vollständiges Build -System, das möglicherweise bequemer und flexibler für die Integration in vorhandene Pipelines ist. Meson bietet auch eine viel bessere IDE-Integration als Made- oder Stapeldateien sowie Unterstützung für die Cross-Compilation.
Für den ungeduldigen Gebäude mit Meson lautet wie folgt. Die Optionen für meson setup unten emulieren Janets Makefile.
git clone https://github.com/janet-lang/janet.git
cd janet
meson setup build
--buildtype release
--optimization 2
--libdir /usr/local/lib
-Dgit_hash= $( git log --pretty=format: ' %h ' -n 1 )
ninja -C build
# Run the binary
build/janet
# Installation
ninja -C build installJanet kann mit so ziemlich jeder Umgebung gehackt werden, die Sie mögen, aber für IDE -Liebhaber ist Gnome Builder wahrscheinlich die beste Option, da es eine hervorragende Meson -Integration hat. Es bietet auch Code -Fertigstellung für Janets C API direkt außerhalb der Box, was sehr nützlich für die Erkundung ist. VSCODE, VIM, EMACS und ATOM haben jedoch Syntaxpakete für die Janet -Sprache.
Wenn Sie nur die Sprache ausprobieren möchten, müssen Sie nichts installieren. In diesem Fall können Sie die ausführbare janet auch überall in Ihrem System verschieben und ausführen. Für ein vollere Setup finden Sie jedoch die Einführung, um weitere Informationen zu erhalten.
Eine Wiederholung wird gestartet, wenn die Binärdatei ohne Argumente aufgerufen wird. Übergeben Sie das Flag -h , um die Nutzungsinformationen anzuzeigen. Einzelne Skripte können mit ./janet myscript.janet ausgeführt werden.
Wenn Sie erkunden möchten, können Sie eine Liste aller verfügbaren Makros, Funktionen und Konstanten drucken, indem Sie den Befehl (all-bindings) in die Replung eingeben.
$ janet
Janet 1.7.1-dev-951e10f Copyright (C) 2017-2020 Calvin Rose
janet:1:> (+ 1 2 3)
6
janet:2:> (print "Hello, World!")
Hello, World!
nil
janet:3:> (os/exit)
$ janet -h
usage: janet [options] script args...
Options are:
-h : Show this help
-v : Print the version string
-s : Use raw stdin instead of getline like functionality
-e code : Execute a string of janet
-E code arguments... : Evaluate an expression as a short-fn with arguments
-d : Set the debug flag in the REPL
-r : Enter the REPL after running all scripts
-R : Disables loading profile.janet when JANET_PROFILE is present
-p : Keep on executing if there is a top-level error (persistent)
-q : Hide logo (quiet)
-k : Compile scripts but do not execute (flycheck)
-m syspath : Set system path for loading global modules
-c source output : Compile janet source code into an image
-i : Load the script argument as an image file instead of source code
-n : Disable ANSI color output in the REPL
-l lib : Use a module before processing more arguments
-w level : Set the lint warning level - default is "normal"
-x level : Set the lint error level - default is "none"
-- : Stop handling options
Wenn Sie installiert sind, können Sie auch man janet ausführen, um Nutzungsinformationen zu erhalten.
Janet kann sehr leicht in ein Host -Programm eingebettet werden. Der normale Build erstellt eine Datei build/janet.c , eine einzelne C -Datei, die die gesamte Quelle für Janet enthält. Diese Datei kann zusammen mit src/include/janet.h und src/conf/janetconf.h in jedes C -Projekt gezogen und darin zusammengestellt werden. Janet sollte mit -std=c99 für die meisten Compiler zusammengestellt werden und muss mit der Mathematikbibliothek, -lm und dem dynamischen Linker, -ldl verknüpft werden, wenn man dynamische Module laden will. Wenn dynamische Module nicht erforderlich sind, fügen Sie die Define -DJANET_NO_DYNAMIC_MODULES den Compiler -Optionen hinzu.
Weitere Informationen finden Sie im Einbettungsbereich auf der Website.
Fühlen Sie sich frei, Fragen zu stellen und sich der Diskussion über die Janet Zulip -Instanz anzuschließen
Es ist ungefähr die gleiche Geschwindigkeit wie die meisten interpretierten Sprachen ohne JIT -Compiler. Enge, kritische Schleifen sollten wahrscheinlich in C oder C ++ geschrieben werden. Die Programme sind in der Regel etwas schneller als in einer Sprache wie Python, da die langsame objektorientierte Abstraktion mit vielen Hash-Tisch-Lookups entmutigt und die späten Bindung explizit macht. Alle Werte werden standardmäßig in einer 8-Byte-Darstellung untergebracht und auf dem Haufen zugewiesen, mit Ausnahme von Zahlen, Nils und Booleschen. Die PEG -Engine ist ein spezialisierter Dolmetscher, mit dem String- und Pufferdaten effizient verarbeitet werden können.
Der GC ist einfach und in der Welt stoppt, aber GC-Knöpfe sind in der Kernbibliothek freigelegt und separate Fäden haben isolierte Haufen und Müllsammler. Daten, die zwischen Threads geteilt werden, werden auf die Referenz gezählt.
Ymmv.
Es kann existieren, es darf nicht. Wenn Sie eine große Sprachfunktion vorschlagen möchten, eröffnen Sie ein Problem, aber es wird wahrscheinlich so geschlossen, dass "nicht implementiert" wird. Oft machen solche Merkmale auf Kosten von 5 anderen eine Nutzung einfacher, indem sie die Sprache komplizierter machen.
Neben der Dokumentation unter https://janet-lang.org gibt es derzeit keine Spezifikation.
Nein. Hier gibt es keine Cons -Zellen.
Nein. Es ähnelt oberflächlich Clojure, weil ich LISPs mag und die Ästhetik mag. Intern ist Janet überhaupt nicht wie Clojure, Schema oder gemeinsames Lisp.
Nein, sie sind unveränderliche Arrays und Hash -Tische. Versuchen Sie nicht, sie wie die Vektoren und Karten von Clojure zu verwenden, stattdessen funktionieren sie gut als Tischschlüssel oder andere Kennungen.
In gewissem Maße ja. Es ist jedoch nicht die empfohlene Abstraktionsmethode, und die Leistung kann darunter leiden. Trotzdem können Tabellen verwendet werden, um veränderliche Objekte mit Vererbung und Polymorphismus herzustellen, bei denen Objektmethoden mit Schlüsselwörtern implementiert werden.
( def Car @{ :honk ( fn [self msg] ( print " car " self " goes " msg)) })
( def my-car ( table/setproto @{} Car))
( :honk my-car " Beep! " )Normalerweise einer der wenigen Gründe:
Wahrscheinlich, wenn diese Sprache eine gute Schnittstelle zu C hat, muss der Programmierer möglicherweise zusätzliche Arbeiten erledigen, um Janets internes Speichermodell dem der gebundenen Sprache zuzuordnen. Janet verwendet auch setjmp / longjmp für nicht-lokale Renditen intern. Dieser Ansatz ist jetzt bei vielen Programmierern unbezahlt und spielt nicht immer gut mit anderen Sprachen, die Ausnahmen oder Stack-Unwinding haben.
Stellen Sie sicher, dass Ihr Terminal ANSI -Fluchtcodes unterstützt. Die meisten modernen Terminals werden diese unterstützen, aber einige ältere Terminals, Windows -Konsolen oder eingebettete Terminals tun dies nicht. Wenn Ihr Terminal keine ANSI -Escape -Codes unterstützt, führen Sie die Reply mit dem -n -Flag aus, das die Farbausgabe deaktiviert. Sie können das -s -Flag auch ausprobieren, wenn weitere Probleme auftreten.
Janet ist nach dem fast allwissenden und freundlichen künstlichen Wesen am guten Ort benannt.