返回资讯中心
外部精选
软件工程
#开发者实时流

Jonquil 发布 DrRacket 风格 Lisp 编辑器,支持七种方言

来源标题:A DrRacket style editor for Clojure with some Lisp Machine inspired features

开源项目 Jonquil 推出一款 DrRacket 风格的编辑器,支持 Jolt、Clojure、ClojureScript、jank、Basilisp、babashka 等七种 Lisp 方言,采用 EPL-2.0 协议。用户在顶部编辑代码、点击 Run 即可在下方 REPL 查看结果,Stop 能真正终止死循环程序。在 Jolt 上程序运行于编辑器自身运行时,检查器和调试器可直接查看真实值。

Hacker News 最新yogthos2026/11/13 · 今天14 分钟阅读

以下正文由 AI 翻译自 Hacker News 最新(原文版权归原站所有),可能存在偏差,重要内容请以原文为准。

Alpha · macOS (Apple Silicon) · Linux 从源码构建 · 开源,EPL-2.0

Jonquil 是一款 DrRacket 风格的编辑器,支持 Jolt、Clojure、ClojureScript、jank、Basilisp 和 babashka。在上方编辑代码,按 Run 运行,在下方的 REPL 中查看结果,而 Stop 能真正停掉失控的程序。在 Jolt 上它更进一步:你的程序运行在编辑器自身的运行时上,因此检查器和调试器能看到它的真实值。

Stop 能真正停止——即使是一个从不主动让出的循环也能被中断

7 种 Lisp,一个窗口:Jolt、Clojure、jank、Basilisp……

运行

为你使用的每一种 Lisp 提供 DrRacket 式循环,而在 Jolt 上,还提供 Lisp Machine 的工具。

六种方言配置会为当前打开的文件选择运行时。Jolt 可在进程内或进程外运行,jank 和 ClojureScript 由 Jonquil 为你启动,其余的则通过 nREPL 连接。

Describe Key、位置列表、控制台中的呈现(presentation)、Save World、进程面板:这些灵感来自 MIT CADR 和 Symbolics Genera,作用于你程序的实时值。

一个插件就是一个 Clojure 文件,包含命令、按键、钩子和 agent 工具。agent 可以通过 MCP 驱动窗口,而方言配置就是接入下一种 Lisp 的插口。

Run 会求值编辑器中的所有内容,REPL 提示符求值一行,而 Stop 即使在程序陷入循环空转时也能将其终止。这就是 DrRacket 式循环,适用于每一种方言。

Emacs 用与你编写代码不同的 Lisp 来扩展。Jonquil 用 Clojure 写在 Jolt 上,你的 Jolt 代码运行在同一个运行时上,因此这些工具看到的是真实值,而不是编辑器自己的值。

在 Jolt 上:断点、Step Into、Over 和 Out、Break on error,以及上一个错误的各栈帧和其中所有局部变量。Retry、Edit and retry 和 Define and retry 可在每一种方言中重新拾起一次失败的求值。

带文档预览的补全、快速文档、跳转到定义和重命名,都会向活动运行时查询,无论它是哪种 Lisp。命令面板会列出每条命令及其按键。

jonquil --mcp 在无窗口的情况下通过 MCP 提供六个工具。加上 --window 后,agent 可以打开、编辑、保存和运行标签页,你可以在一旁观看,共二十个工具。

terminal $ claude mcp add jonquil -- jonquil --mcp /path/to/project

方言与运行时

Jonquil 为当前打开的文件选择一种方言配置,状态栏会显示是哪一种,以及运行时是否已就绪。

Jonquil 自身的 Lisp,也是断点、单步和 Break on error 所需的 Lisp。deps.edn 项目中的程序会通过 nREPL 在进程外运行,因此崩溃或调用 System/exit 的程序只会拖垮一个子进程,而不是 Jonquil。散放的单个文件则在 Jonquil 自己的进程中运行。

连接到你的 JVM 用 clojure -M:serve 启动服务器,或任何会写入 .nrepl-port 的东西,Jonquil 会在第一次 Run 时连接。完整文档中的 ClojureDocs 示例可以直接运行。

shadow-cljs、node 或浏览器标签页 在 shadow-cljs 项目中,Jonquil 会连接到你的 watch。在其他地方,它自己启动 ClojureScript,运行在 node 上或浏览器标签页中。

jank,由 Jonquil 为你启动 打开一个 .jank 文件,Jonquil 会在第一次 Run 时为该窗口启动它自己的 jank repl。

Python 上的 Clojure Basilisp 的服务器会在你启动它的文件夹中写入 .nrepl-port,因此只写 {:dialect :nrepl} 就够了。Run、REPL、快速文档和补全都能用;错误会以 Python traceback 的形式出现。

;; 在项目文件夹中 ;; $ basilisp nrepl-server ;; .jonquil.edn {:dialect :nrepl}

babashka,或任意 nREPL 让项目指向你启动的任意 nREPL 服务器,无论在本机还是另一台主机上。功能取决于服务器提供什么,控制台会说明它做不到什么。

连接到正在运行的应用 就像 CIDER 作用于活动进程:Jonquil 会连接到你已经在运行的 ClojureDart 应用,从不启动、停止或向它发信号。应用会把端口写入 NREPL.lock,Jonquil 读取它。

;; 在添加了 nREPL 的分支上运行应用 ;; $ clj -M:cljd flutter ;; 然后打开一个 .cljd 文件并按 Run。 ;; Jonquil 读取 NREPL.lock,从不写入它。

导览

这里的每一张截图都是由 Jonquil 自己的文档工具从真实应用中捕获的。点击任意一张可放大查看。

单文件插件 一个插件可以添加命令和按键、在保存、Run 和出错时挂上钩子,以及提供 agent 可调用的工具。每个上线的版本都会被保留,因此你可以查看它的历史并回退。

~/.config/jonquil/plugins/wrap-when.clj (p/defplugin {:id :wrap-when :doc "将光标处的表单包裹在 (when ...) 中。" :effects #{} :commands [{:id :wrap-when/wrap :scope :editor :edit (fn [snapshot] (p/wrap-form snapshot "(when " ")"))}]})

为下一种 Lisp 留出空间 方言就是一份配置:它的文件长什么样、如何着色、由哪个求值器运行。一份配置的端口文件,就是连接式运行时所需的大部分内容。

需要时的 Parinfer 默认关闭。打开 Smart 后,每个打开的括号会在你输入时自动闭合,把正文行反缩进会把闭括号拉上来,缩进则会把它拉回去。Cmd/Ctrl+Shift+M 循环切换主题:light、dark、solarized、navy 和 auto。

Jonquil 移植了 DrClojure 的想法,并沿用了它纯粹做文本分析的代码:分词器、括号、智能缩进、格式化器。前端是基于直接 FFI 的 GTK4,在 Jolt 中重建,项目所需的 Jolt 修复也已提交到上游。

已签名并公证,适用于 macOS 26 或更新版本上的 Apple Silicon Mac。GTK 内置于应用之中,因此它可以立即打开并运行文件。要运行项目(一个含 deps.edn 的文件夹),还需安装 Jolt 和 git。Intel Mac 和 Linux 需从源码构建。

快速上手 源码在 GitHub

Alpha 软件。部分方言仍属实验性,Known limits 列出了每种运行时的粗糙之处。

正文由 探How 从来源站点 RSS 同步,内容未经改写;遇到排版缺失或需要图片、视频时请以原文为准。

打开原文
去社区讨论 →