プログラミング
Jolt: Chez Schemeで実装されたClojureコンパイラ
Jolt: Clojure compiler implemented with Chez Scheme (jolt-lang.github.io)
要約
Joltは、Clojureで書かれ、自身をコンパイルする自己ホスト型Clojureコンパイラです。ClojureコードをChez SchemeなどのSchemeランタイムで実行可能な形式に変換し、スタンドアロン実行ファイルも生成できます。JVMに依存せず、Clojureの多くの機能を維持しつつ、Scheme上で動作する点が特徴です。
全文翻訳
Joltとは?
自己ホスト型コンパイラはClojureを読み込み、ホストに依存しないIRに解析し、Schemeを出力して実行します。Chez上でネイティブに、またはJavaScriptにコンパイルされたGambit上で実行できます。コンパイラはClojureで書かれており、自身をコンパイルします。
スタンドアロンバイナリ
joltはプロジェクトを事前にコンパイルし、ランタイム、標準ライブラリ、アプリ、およびその依存関係を単一の自己完結型実行ファイルにまとめます。実行にChezもJVMもソースコードも不要です。
リアルな並行性
future/promise/agent/pmapは共有ヒープ上のOSスレッドで実行され、JVMのセマンティクスに一致します。core.asyncはチャネルとgoブロックを提供します。
完全な数値タワー
正確な整数とbignum、正確な有理数((/ 1 2) ⇒ 1/2)、およびflonum doubles。=はカテゴリを認識し、==は値の等価性です。
永続データ構造
Clojureの値セマンティクスを持つ不変のベクトル(32ウェイTrie)、consリスト、およびHAMTマップ/セット。Transientsは変更可能なスクラッチコレクションです。
Clojure互換
Lazy/無限シーケンス、トランスデューサー、デストラクチャリング、マルチメソッド、プロトコル/レコード、メタデータ、名前空間、ランタイムeval、および完全なリーダー。
クイックスタート
自己完結型のjoltバイナリをインストールします。ランタイム、コンパイラ、標準ライブラリがバンドルされているため、他にインストールするものはありません。
Homebrew
brew install jolt-lang/jolt/jolt
またはインストールスクリプト(Linux / macOS)
curl -sL https://raw.githubusercontent.com/jolt-lang/jolt/main/install | bash
jolt -e '(+ 1 2)' # => 3
またはクローンから実行(Chez Schemeが必要) - ビルドステップなし、ブートストラップシードはチェックインされています:
git clone --recurse-submodules https://github.com/jolt-lang/jolt.git
cd jolt
bin/jolt -e '(+ 1 2)' # => 3
使い方
式を評価する
$ bin/jolt -e '(->> (range 10) (filter even?) (map (fn [x] (* x x))) (reduce +))' # 120
$ bin/jolt -e '(/ 1 2)' # 1/2
プロジェクトを実行する
bin/jolt run -m myapp.core # deps.ednを解決してから -main を実行
bin/jolt -M:test [args] # エイリアスの:main-optsを実行
bin/jolt path # 解決されたソースルートを表示
スタンドアロンバイナリをコンパイルする
bin/jolt build -m myapp.core -o myapp # 単一の自己完結型実行ファイル
./myapp arg1 arg2 # どこでも実行可能; argsは-mainに渡される
--opt は最適化ビルド用、--dev は非最適化ビルド用
nREPL
bin/jolt --nrepl-server # deps.ednを自動解決し、.nrepl-portを書き込む
# CIDER / Calva / Cursive を .nrepl-port ファイル経由で接続し、
# varを再定義すると次の呼び出しでそれが反映される - 再起動不要
ライブプロセスに対して開発する: REPL駆動開発を参照してください。
インストール、ライブラリの作成、ホスト間相互運用性に関するドキュメントをお読みください。
Clojureとの違い
JoltはClojureセマンティクスをターゲットとしていますが、JVMではなくScheme上で実行されます。
ほとんどのポータブルClojureは変更なく実行されます - 永続コレクション、数値タワー、遅延シーケンス、トランスデューサー、マルチメソッド、プロトコル/レコード、アトム、future/agent/pmap、core.async、ランタイムeval、および完全なリーダーはすべてJVM上と同じように動作します。
真の相違点:
側面 違い
Java相互運用性 JVMがないため、一般的なJava相互運用性、リフレクション、gen-class/proxyはありません - java.*のシム化されたサブセットが利用可能で、それに加えてC FFIがあります。
BigDecimal 利用できません(decimal? は常にfalseです); 数値タワーの残りは一致します。
正規表現 java.util.regexではなくirregexによってコンパイルされます - 一般的なパターンは機能しますが、一部のJava固有の機能は異なります。