Glojure: Go 用のホスト型 Clojure インタープリタ
Glojure は、Go プログラミング言語上で Clojure をホストするインタープリタです。従来の移植版とは異なり、Glojure は「ホスト型」言語であり、すべての Go の値が Glojure の値として使用でき、その逆も同様であるという双方向の関係を維持しています。これは、JVM 上の Clojure が Java と持つ関係を反映しています。
コア機能と実行モデル
Glojure は実行にツリーウォーク・インタープリタを使用します。現在は初期開発段階にあり(作者はバグ、機能不足、限定的なパフォーマンスが予想されると述べています)、すでに変換された Clojure コアライブラリの重要なサブセットをサポートしており、ホビープロジェクトには十分機能します。
主要な技術仕様
- ホスト要件: Go バージョン 1.19 以上が必要です(現在のインストールには go 1.24 が推奨されます)。
- 実行方法: ツリーウォーク・インタープリタ。
- 互換性: v1 リリースまでは後方互換性は保証されません。
- バージョン: 現在のバージョンは v0.3.0 です。
使用方法とデプロイメントのオプション
Glojure は、スタンドアロンのコマンドラインツールとして、または Go バイナリに直接埋め込んで使用できます。
スタンドアロン・コマンドラインツール (glj)
glj コマンドは、以下を含む標準的な Clojure 開発体験を提供します:
- インタラクティブ REPL: Vi および Emacs の編集モード、複数行編集、タブ補完、および永続的な履歴機能を備えています。
- 直接評価:
-eフラグにより、シェルから式を直接評価できます。 - スクリプティング:
.gljスクリプトをスタンドアロンのプログラムとして実行する機能。
Go アプリケーションへの埋め込み
Glojure は、Go アプリケーション内でスクリプティング・エンジンとして使用でき、スクリプト可能な設定やプラグイン・システムを提供できます。これにより、開発者は Go のパフォーマンスと Clojure の表現力を組み合わせることができます。開発者は、glj.Var および runtime.ReadEval API を使用して、Clojure から Go 関数を呼び出し、Go から Clojure 関数を呼び出すことができます。
Go との相互運用性
相互運用性(Interop)は Glojure の主要な機能であり、Clojure が Java フレームワークにアクセスするように、Go ライブラリへのアクセスを提供します。
標準ライブラリのサポート
Glojure は、標準で fmt, net/http, os, time, sync, および regexp を含む多数の Go 標準ライブラリパッケージへの相互運用性を提供します。Clojure の名前空間構文(/ を使用)との曖昧さを避けるため、スラッシュを含む Go パッケージ名は変換されます。例えば、net/http は Glojure では net:http になります。
相互運用性の拡張
追加の Go パッケージを公開するには、開発者は gen-import-interop ツールを使用してパッケージマップを生成できます。生成された .go ファイルをアプリケーションにインポートすることで、目的のパッケージのエクスポートを Glojure のパッケージマップに追加できます。
技術的な違いと比較
型マッピング
Glojure は Clojure の型を以下のように Go の型にマッピングします:
| Clojure 型 | Glojure 型 | 備考 |
|---|---|---|
long |
int64 |
|
double |
float64 |
|
float |
float32 |
|
byte |
byte |
Go の byte は符号なしです。JVM の byte は符号付きです |
short |
int16 |
|
int |
int |
Go の int はプラットフォーム依存です (32/64-bit) |
char |
lang.Char |
タグ付き rune (32-bit) vs JVM 16-bit |
BigInt |
*lang.BigInt |
*big.Int をラップ |
BigDecimal |
*lang.BigDecimal |
*big.Float をラップ |
Ratio |
*lang.Ratio |
*big.Rat をラップ |
他の Go-Clojure 移植版との比較
| 側面 | Glojure | Joker | let-go |
|---|---|---|---|
| ホスト型 | はい | いいえ | いいえ |
| 拡張可能な Go 相互運用性 | はい | いいえ | いいえ |
| 並行処理 | はい | はい (GIL あり) | はい |
| Clojure ツール | いいえ | はい | いいえ |
| 実行方法 | ツリーウォーク・インタープリタ | ツリーウォーク・インタープリタ | バイトコード・インタープリタ |