文章摘要
Glojure是一个基于Go语言的Clojure解释器,提供对Go库的便捷访问,类似于Clojure对Java框架的支持。该项目处于早期开发阶段,存在功能不完整和性能限制,但已成功用于个人项目并支持核心Clojure库的重要子集。
文章总结
好的,这是根据您的要求,对原文主要内容进行的中文重述,已保留关键细节并删减了与主题无关的内容。
Glojure:基于Go的Clojure解释器
Glojure 是一个运行在 Go 语言之上的 Clojure 解释器。它允许用户像 Clojure 轻松调用 Java 框架一样,便捷地访问 Go 语言的标准库和第三方库。
项目状态:Glojure 目前处于早期开发阶段,可能存在 Bug、功能缺失和性能限制。在 v1.0 版本发布前,不保证向后兼容性。尽管如此,它已在一些个人项目中被成功使用,并能运行经过转换的核心 Clojure 库的很大一部分。
核心特性:与大多数其他 Go 语言实现的 Clojure 不同,Glojure 是一种“托管”语言。这意味着所有 Go 的值都可以直接作为 Glojure 的值使用,反之亦然。
安装与使用
前提条件:需要安装 Go 1.19 或更高版本。
安装:通过 go install 命令安装,要求 Go 版本至少为 1.24。
bash
$ go install github.com/glojurelang/glojure/cmd/glj@latest
使用方式:Glojure 提供两种使用方式:
作为独立命令行工具 (
glj):- 启动交互式 REPL(读取-求值-输出循环)。
- 直接执行表达式:
glj -e '(println "Hello, World!")'。 - 运行 Clojure 脚本:
glj hello.glj World。 - REPL 支持 Vi/Emacs 编辑模式、多行编辑、Tab 补全、持久化历史记录等功能。
嵌入到 Go 应用程序中:
- 可以将 Glojure 作为脚本语言嵌入,用于添加可配置的脚本、允许用户通过 Clojure 插件扩展应用,或混合使用 Go 的性能和 Clojure 的表达力。
- 通过
runtime.ReadEval函数执行 Clojure 代码。 - 可以轻松实现 Go 函数与 Clojure 函数的互相调用。
互操作性 (Interop)
Glojure 默认内置了对许多 Go 标准库包的互操作支持。包名中的 / 会被替换为 : 以避免歧义。例如,net/http 包在 Glojure 中通过 net:http 访问。
默认支持的包包括:bytes, context, errors, flag, fmt, io, math, net/http, os, regexp, strings, time 等 20 多个常用包。
访问更多 Go 包:如果需要访问默认列表之外的 Go 包,可以使用 gen-import-interop 工具生成一个“包映射”文件,然后在自己的 Go 程序中导入该文件。
与 Clojure 的差异
Glojure 在数字类型上与 Clojure 有所不同,例如:
* Clojure 的 long 对应 Go 的 int64。
* Clojure 的 double 对应 Go 的 float64。
* Clojure 的 char 对应 Glojure 的 lang.Char 类型(基于 Go 的 rune,32位),而 JVM 的 char 是 16 位的。
与其他 Go 语言 Clojure 移植版的比较
| 方面 | Glojure | Joker | let-go | | :--- | :--- | :--- | :--- | | 托管语言 | 是 | 否 | 否 | | 可扩展的 Go 互操作 | 是 | 否 | 否 | | 并发支持 | 是 | 是 (带GIL) | 是 | | 执行方式 | 树遍历解释器 | 树遍历解释器 | 字节码解释器 |
评论总结
根据评论内容,总结如下:
主要观点与论据:
Glojure的维护与进展
- 评论3指出Glojure的维护已迁移至新仓库(gloathub/glojure),且与原仓库保持同步。
- 评论7认为Clojure方言(dialects)是最令人兴奋的部分,进展迅速且正接近功能对等。
关键引用: - "glojure maintenance has moved here: https://github.com/gloathub/glojure"
- "dialects are IMO the most exciting thing about clojure. they are making progress quickly and reaching parity."
技术实现与性能
- 评论4询问REPL的实现方式(编译到Go执行还是自带VM),并指出多数Go REPL因需编译而速度慢。
- 评论8担忧树遍历解释器(tree walking interpreter)的性能问题。
关键引用: - "How does the repl work? Does it compile to Go, then execute? Or does it ship with a full vm?"
- "since this is tree walking interpretator, won't it be quite slow?"
与其他方案的比较
- 评论5推荐Lisette.run作为Go上的类型化函数式编程方案,认为Go的运行时、工具链和生态值得利用。
- 评论6认为这是最有前途的Go托管Clojure实现,因其具备完整的互操作性。
关键引用: - "There’s also typed fp on Go: https://lisette.run/"
- "this is the most promising Clojure hosted on Go... the only one with full proper interop."
平衡性说明:
- 正面观点:强调Clojure方言的进展、互操作性的优势,以及Go生态的吸引力。
- 负面/质疑观点:关注REPL性能、解释器效率,以及与其他Go函数式方案的比较。
- 中立信息:提供历史讨论链接、维护迁移等事实性更新。