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 ツール いいえ はい いいえ
実行方法 ツリーウォーク・インタープリタ ツリーウォーク・インタープリタ バイトコード・インタープリタ

Sources