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.Var 與 runtime.ReadEval API 從 Clojure 呼叫 Go 函式,或從 Go 呼叫 Clojure 函式。
Go 互操作性
互操作是 Glojure 的核心功能,提供對 Go 函式庫的存取方式,類似 Clojure 存取 Java 框架的方式。
標準函式庫支援
開箱即用,Glojure 為多個 Go 標準函式庫套件提供互操作支援,包括 fmt、net/http、os、time、sync 與 regexp。為避免與 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 直譯器