Glojure:在 Go 上的托管 Clojure 直譯器

Glojure 是一個在 Go 程式語言上實作 Clojure 的直譯器。與傳統的移植不同,Glojure 是「托管」語言,意味著它維持雙向關係,所有 Go 值都可以作為 Glojure 值使用,反之亦然,類似 Clojure 在 JVM 上與 Java 的關係。

核心功能與執行模型

Glojure 使用樹狀遍歷直譯器來執行。雖然目前仍處於早期開發階段——作者指出可能會有錯誤、缺少功能以及效能受限——但它已支援相當多的轉換後核心 Clojure 函式庫,足以用於業餘專案。

主要技術規格

  • 主機需求: 需要 Go 1.19 或以上(目前安裝使用 go 1.24)。
  • 執行方式: 樹狀遍歷直譯器。
  • 相容性: 在 v1 正式版之前不保證向後相容。
  • 版本: 目前版本為 v0.3.0。

使用方式與部署選項

Glojure 可以作為獨立的命令列工具部署,或直接嵌入 Go 可執行檔中。

獨立命令列工具 (glj)

glj 指令提供標準的 Clojure 開發體驗,包括:

  • 互動式 REPL: 支援 Vi 與 Emacs 編輯模式、多行編輯、Tab 完成與持久化歷史記錄。
  • 直接求值: -e 旗標允許直接在 shell 中求值表達式。
  • 腳本執行: 能以 .glj 檔案作為獨立程式執行。

嵌入於 Go 應用程式

Glojure 可作為 Go 應用程式內的腳本引擎,提供可腳本化的設定或外掛系統。這讓開發者能結合 Go 的效能與 Clojure 的表達力。開發者可以透過 glj.Varruntime.ReadEval API 從 Clojure 呼叫 Go 函式,或從 Go 呼叫 Clojure 函式。

Go 互操作性

互操作是 Glojure 的核心功能,提供對 Go 函式庫的存取方式,類似 Clojure 存取 Java 框架的方式。

標準函式庫支援

開箱即用,Glojure 為多個 Go 標準函式庫套件提供互操作支援,包括 fmtnet/httpostimesyncregexp。為避免與 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 位)
char lang.Char 標記的 rune(32 位) vs JVM 16 位
BigInt *lang.BigInt 包裝 *big.Int
BigDecimal *lang.BigDecimal 包裝 *big.Float
Ratio *lang.Ratio 包裝 *big.Rat

與其他 Go‑Clojure 移植的比較

項目 Glojure Joker let-go
托管 Yes No No
可擴充的 Go 互操作 Yes No No
並行性 Yes Yes (with GIL) Yes
Clojure 工具支援 No Yes No
執行方式 Tree-walk interpreter Tree-walk interpreter Bytecode Interpreter

摘要: Glojure 是一個早期階段的直譯器,將 Clojure 托管於 Go,實現 Go 值與 Clojure 程式碼之間的無縫雙向互操作。

標題: Glojure:在 Go 上的托管 Clojure 直譯器

Sources