内容提要
本文介绍Clojure入门工具与环境。Clojure运行于JVM,需先安装Java和Clojure。核心是REPL(读取-求值-打印-循环),支持交互式编程,可边写边测代码,类似热重载。推荐用Leiningen启动nREPL服务器,让编辑器通过协议连接。Neovim用户可配置Conjure插件,用快捷键求值;再安装nvim-paredit实现结构化编辑,用Slurp、Barf、Drag等操作括号,提升效率。
延伸解读
REPL:不只是命令行,更是交互式编程的入口
文章强调REPL(读取-求值-打印-循环)是Clojure开发的核心工具,它允许边写代码边求值,类似前端的热重载。通过REPL,开发者可以即时测试函数、查看库返回的数据格式,而无需重启整个程序。作者还提到1988年太空中的Lisp程序死锁案例,说明REPL甚至能用于远程调试运行中的系统。因此,与REPL打好关系是学习Clojure的关键一步。
Leiningen与nREPL:编辑器集成的桥梁
文章推荐使用Leiningen启动REPL,它会同时启动nREPL服务器,并通过.nrepl-port文件告知编辑器连接端口。nREPL是一套通信协议,使得编辑器(如Neovim的Conjure插件)能直接发送代码到REPL求值,并将结果返回显示在代码旁。这种集成让交互式编程更流畅,避免了手动复制粘贴代码到终端的繁琐。
结构化编辑:用Paredit驯服括号
针对Lisp代码中大量的括号,文章介绍了nvim-paredit插件,它基于Tree-sitter提供结构化编辑操作,如Slurp(吞)、Barf(吐)和Drag(拖拽),能快速调整代码层级。例如,通过快捷键可以轻松将(+ a b)改为(- (+ a b) c)。虽然需要适应,但熟练掌握后编辑Lisp代码的速度可能超过普通代码。文章还提到了移动和选择元素的快捷键,如W、E、B和af、if等。
Q&A
Clojure 的 REPL 是什么?它有什么作用?
REPL 全称是 Read-Eval-Print-Loop(读取-求值-打印-循环),它读取用户输入,求值,打印结果,然后循环。REPL 是 Clojure 交互式编程的核心,允许你边写代码边测试,类似热重载,还能用于查询运行中程序的状态。
如何让 Neovim 与 Clojure REPL 集成?
使用 Leiningen 启动 nREPL 服务器(lein repl),然后在 Neovim 中安装 Conjure 插件。Conjure 会读取项目目录下的 .nrepl-port 文件来连接服务器。安装后,打开 .clj 文件即可看到连接提示,并可用快捷键如 \ee 对表达式求值。
Leiningen 是什么?它在 Clojure 开发中有什么作用?
Leiningen 是 Clojure 生态中最常用也最容易上手的工具,专注于项目自动化和声明式配置。你可以用它创建项目、运行项目、运行测试、编译项目等。启动 REPL 时,lein repl 会同时启动 nREPL 服务器,方便编辑器连接。
什么是结构化编辑?在 Neovim 中如何实现?
结构化编辑是指基于代码结构而非纯文本进行编辑,特别适合 Lisp 的括号嵌套。在 Neovim 中可以通过 nvim-paredit 插件实现,它基于 Tree-sitter,提供 Slurp、Barf、Drag 等操作,让你高效地移动和调整括号内的元素。
Paredit 中的 Slurp 和 Barf 操作是什么?
Slurp(吞)和 Barf(吐)是 Paredit 中用于调整列表元素位置的操作。Slurp 将相邻元素吞入当前列表,Barf 将列表内元素吐出。它们都有方向:向前(forwards)和向后(backwards)。例如,向前吞用 >),向后吞用 <(,向前吐用 <),向后吐用 >(。
在 Conjure 中如何对表达式求值?有哪些常用快捷键?
常用快捷键包括:\ee 对光标所在形式求值;\eb 对整个 Buffer 求值;\er 对最外层形式求值;\ls 水平分割打开历史记录;\lv 垂直分割打开历史记录。更多操作可用 :help conjure 查看。