ジャネットは、システムスクリプト、表現力豊かな自動化、およびユーザースクリプト機能を備えたCまたはC ++で記述された拡張プログラムのプログラミング言語です。
ジャネットは、優れたシステムスクリプト言語、または他のプログラムに埋め込む言語を作成します。それはその点でルアとgnuのというなそうです。機能が組み込まれており、LUAよりも豊富なコア言語がありますが、Gnu GuileやPythonよりも小さいです。ただし、PythonやGuileよりも埋め込んだりポートしたりする方がはるかに簡単です。
言語を試すためのREPLと、スクリプトファイルを実行する機能があります。このクライアントプログラムはコアランタイムとは別にあるため、ジャネットは他のプログラムに組み込むことができます。 https://janet-lang.orgでブラウザでジャネットをお試しください。
提供されたすべての例プログラムの例ディレクトリを参照してください。
# 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 )ドキュメントは、REPLでローカルで入手できます。 (doc symbol-name)マクロを使用して、コアライブラリのシンボルのAPIドキュメントを取得します。例えば、
(doc apply)
apply関数のドキュメントを表示します。
デフォルトの環境ですべてのバインディングのリストを取得するには、 (all-bindings)関数を使用します。また、バインドされたシンボルを表示するためにREPLにいる場合、引数なしで(doc)マクロを使用することもできます。
GitHubまたはSourceHutでソースを取得できます。 Github Repoは公式リポジトリですが、SourceHutミラーは積極的に維持されています。
MakeFileは駐在不能であり、GNU風味のメイクを必要とします。
cd somewhere/my/projects/janet
make
make test
make repl
make install
make install-jpm-git実行可能なmake helpで利用可能なMake Targetsの詳細をご覧ください。
32ビット俳句ビルド命令は、UNIXのようなビルド命令と同じですが、 gcc-x86などの代替コンパイラを指定する必要があります。
cd somewhere/my/projects/janet
make CC=gcc-x86
make test
make repl
make install
make install-jpm-git FreeBSDビルド命令は、UNIXのようなビルド命令と同じですが、コンパイルするにはgmakeが必要です。または、 pkg install lang/janetでパッケージを直接インストールします。
cd somewhere/my/projects/janet
gmake
gmake test
gmake repl
gmake install
gmake install-jpm-git netBSDビルド命令は、FreeBSDビルド命令と同じです。または、 pkgin install janetでパッケージを直接インストールします。
cl.exeおよびlink.exeパス上にある必要がある)を実行し、Janetを使用してディレクトリにcdを実行します。build_winを実行してジャネットをコンパイルします。build_win testを実行して、すべてが機能していることを確認します。上記の手順に加えて、 .msiインストーラー実行可能ファイルを構築するには、次のことが必要です。
build_win distを実行します。今、あなたは.msiを持っている必要があります。 build_win installを実行して.msiをインストールするか、ファイル自体を実行できます。
ジャネットには、クロスプラットフォームビルドシステムであるMeson用のビルドファイルもあります。 MesonにはPython依存関係がありますが、Mesonは非常に完全なビルドシステムであり、既存のパイプラインに統合するのに便利で柔軟性があります。 Mesonは、Make FilesまたはBatchファイルよりもはるかに優れたIDE統合や、相互コンパイルのサポートも提供します。
せっかちなことでは、メソンを備えた建物は次のとおりです。以下のmeson setupに提供されるオプションは、Janet's 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 installジャネットはあなたが好きなほとんどすべての環境でハッキングすることができますが、IDE愛好家にとっては、Gnome Builderがおそらく優れたMeson統合を備えているため、おそらく最良の選択肢です。また、JanetのC APIのコード完成をすぐに提供します。これは、探索に非常に役立ちます。ただし、VSCODE、VIM、EMACS、およびAtomには、それぞれJanet Language用の構文パッケージがあります。
言語を試してみたい場合は、何もインストールする必要はありません。この場合、システムのどこにでもjanet実行可能ファイルを移動して実行することもできます。ただし、詳細については、詳細については、紹介をご覧ください。
バイナリに引数なしで呼び出されると、REPLが起動されます。 -hフラグを渡して使用情報を表示します。個々のスクリプトは./janet myscript.janetで実行できます。
探索しようとしている場合は、コマンド(all-bindings)をREPLに入力して、利用可能なすべてのマクロ、関数、および定数のリストを印刷できます。
$ 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
インストールされている場合は、 man janetを実行して使用情報を取得することもできます。
ジャネットは、ホストプログラムに非常に簡単に埋め込むことができます。通常のビルドは、ファイルbuild/janet.cを作成します。これは、Janetのすべてのソースを含む単一のCファイルです。このファイルは、 src/include/janet.hおよびsrc/conf/janetconf.hとともに、任意のCプロジェクトにドラッグしてコンパイルすることができます。ジャネットは、ほとんどのコンパイラで-std=c99でコンパイルする必要があり、動的モジュールをロードできるようにしたい場合は、数学ライブラリ-lm 、および動的リンカー、 -ldlにリンクする必要があります。動的モジュールが必要ない場合は、Define -DJANET_NO_DYNAMIC_MODULESコンパイラオプションに追加します。
詳細については、ウェブサイトの埋め込みセクションを参照してください。
お気軽に質問して、Janet Zulipインスタンスのディスカッションに参加してください
JITコンパイラがないほとんどの解釈言語とほぼ同じ速度です。タイトでクリティカルループは、おそらくCまたはC ++で記述する必要があります。プログラムは、多くのハッシュテーブルルックアップを備えたゆっくりとしたオブジェクト指向の抽象化の落胆と、遅延結合を明示的にするため、Pythonのような言語よりも少し速くなる傾向があります。すべての値は、デフォルトでは8バイトの表現でボックス化され、数字、nils、ブールリアンを除き、ヒープに割り当てられます。 PEGエンジンは、文字列およびバッファデータを効率的に処理できる特殊な通訳です。
GCはシンプルで世界を停止しますが、GCノブはコアライブラリに露出しており、個別のスレッドはヒープとゴミコレクターを分離しています。スレッド間で共有されるデータは参照カウントされます。
ymmv。
それは存在するかもしれません、そうではありません。主要な言語機能を提案したい場合は、先に進んで問題を開きますが、「実装されない」ため閉鎖される可能性があります。多くの場合、このような機能は、言語をより複雑にすることにより、他の5を犠牲にして1つのUSECASEをより簡単にします。
現在、https://janet-lang.orgのドキュメント以外に仕様はありません。
いいえ。ここには短所セルはありません。
いいえ。私はLispsが好きで、美学が好きなので、表面的にはClojureに似ています。内部的には、ジャネットはClojure、スキーム、または一般的なLISPのようではありません。
いいえ。それらは不変のアレイとハッシュテーブルです。 Clojureのベクトルやマップのようにそれらを使用しようとしないでください。代わりに、テーブルキーやその他の識別子としてうまく機能します。
ある程度、はい。ただし、推奨される抽象化方法ではなく、パフォーマンスが損なわれる可能性があります。とはいえ、テーブルを使用して、オブジェクトメソッドがキーワードで実装されている継承と多型を備えた可変オブジェクトを作成できます。
( def Car @{ :honk ( fn [self msg] ( print " car " self " goes " msg)) })
( def my-car ( table/setproto @{} Car))
( :honk my-car " Beep! " )通常、いくつかの理由の1つ:
おそらく、その言語がCとの良いインターフェースを持っている場合、プログラマーはジャネットの内部メモリモデルをバインド言語の内部メモリモデルにマッピングするためにいくつかの追加作業を行う必要があるかもしれません。ジャネットは、内部的にはローカルリターンにsetjmp / longjmpを使用しています。このアプローチは現在、多くのプログラマーに好意的ではなく、例外やスタック不定の他の言語で常にうまく機能するとは限りません。
端末がANSIエスケープコードをサポートしていることを確認してください。ほとんどの最新のターミナルはこれらをサポートしますが、一部の古いターミナル、Windowsコンソール、または埋め込まれた端子はそうではありません。端末がANSIエスケープコードをサポートしていない場合は、色の出力を無効にする-nフラグでREPLを実行します。さらに問題が発生した場合は、 -sフラグを試すこともできます。
ジャネットは、ほぼ全知で友好的な人工的な存在にちなんで名付けられました。