Clojure 编程/入门
本页将引导您完成设置可用的 Clojure 环境所需的步骤。您将
- 安装 Clojure
- 安装几个标准的 Clojure 增强功能
- 配置 Clojure 以与 IDE 或文本编辑器一起使用
完成这些步骤后,您就可以开始编码了。
为了试用 Clojure,无需进行安装,只需将您的(相当新的)网络浏览器指向 http://www.try-clojure.org/。在那里,您可以与 REPL(读取-评估-打印循环)交互,以了解 Clojure 交互式环境的感觉。
要超越初级阶段,您需要自己的安装。以下部分提供了各种系统的安装说明。此外,请查看 Clojure wiki 上的官方入门页面:http://dev.clojure.org/display/doc/Getting+Started
使用 Clojure 最简单的方法是从这里下载 ClojureW:http://bitbucket.org/kasim/clojurew/get/tip.zip 只需将其解压缩到您选择的目录中,然后在该目录中运行
clojurew/bin/clj
对于平台特定的安装,请遵循以下说明
对于 Windows 用户来说,最简单的安装选项是 Clojure Box。Clojure Box 的视频安装指南可在 http://vimeo.com/9219062 找到。注意:Clojure Box 不再维护,最后一个版本支持 Clojure 1.2,它对 1.3 的支持不太好 2012-02-17
最新的替代方案是 Lisp Cabinet,它支持 Clojure,至少到 1.5.1 版本。2013-06-04
运行 Mac OS X 的用户可以使用 MacPorts 自动安装 Clojure。如果 MacPorts 尚未安装,请先访问 macports.org 并按照那里的说明进行安装。
安装好 MacPorts 后,可以使用以下命令安装 Clojure
sudo port install clojure +rlwrap
命令中的 "+rlwrap" 部分可以省略(或更改为 "+readline),但建议保留,因为它将包含 JLine 和 rlwrap 以在 REPL 中提供更好的历史记录支持。使用 MacPorts 安装好 Clojure 后,可以使用以下命令进入 REPL
clj
或运行脚本
clj myscript.clj
如果以这种方式安装 Clojure,则以下与创建“clj”脚本和使用 JLine 或 rlwrap 增强 REPL 相关的步骤无需执行。
您也可以使用 homebrew 来轻松安装 Clojure。要通过 homebrew 安装 Clojure,请先通过 homebrew 网页 [1] 下载 homebrew 并按照那里的指南进行安装。
安装好后,可以使用以下命令通过 homebrew 安装 Clojure
brew install clojure
无需 sudo。要进入 REPL,只需在终端中输入“clj”。
在基于 Debian 的系统上,安装 Clojure 最简单的方法是运行
sudo apt-get install clojure1.2
这将安装 Clojure jar 和一个 bash 脚本,以简化命令行调用。它的访问方式与其他方法略有不同。要运行 Clojure 脚本,只需调用
clojure script-name.clj arguments to script
不带脚本名称和参数的调用将打开 REPL。
注意:这将安装 1.0 版本。要安装更新版本的 Clojure,您必须使用以下方法之一
在不支持 apt-get 的系统上,或者如果您需要比 1.0 更新的版本,使用 Clojure 最简单的方法是下载可在此处获得的 zip 文件:这里。但是,Clojure 正在积极开发中,您可能希望下载并从源代码构建。
您需要 Git 来下载最新的源代码。要编译,您需要 Java 开发工具包 (javac) 以及 Maven (mvn) 或 Ant (ant)。以下示例使用 ant 运行构建,但可以改用 mvn。
您可以使用以下命令下载最新的代码
git clone git://github.com/clojure/clojure.git
然后使用 Ant 编译
cd clojure ant
或使用 Maven
cd clojure mvn package -DskipTests
目前有许多预打包的选项可用于安装 Clojure,包括
- Cljr
- 提供 Clojure REPL 和包管理器。
- Dejour
- 包含以下内容的软件包:Clojure、clojure-contrib、JLine 和启动脚本。
- labrepl
- 包含多个库以及练习的 Web 应用程序包。
- ClojureX
- 包括 Clojure、clojure-contrib、JLine 和一个功能非常全面的启动脚本(该脚本有一段时间没有维护,但自 2011 年 4 月起再次处于积极开发中)。
您可以使用以下命令启动 Clojure REPL
java -cp clojure-1.6.0.jar clojure.main
或
java -jar clojure-1.6.0.jar
要退出,请按
- Ctrl+C 在 Windows 上
- Ctrl+D 在 UNIX、Linux 和 Mac OS X 上
或键入
(System/exit 0)
有关更多使用选项
java -cp clojure-1.6.0.jar clojure.main --help
如果遇到错误,请使用 "-cp ./clojure-1.3.0.jar" 或将当前目录 "." 添加到 CLASSPATH 中。
您可以使用以下命令启动评估循环
java -cp clojure.jar clojure.main
或
java -jar clojure.jar
您可以使用以下命令获取使用选项
java -cp clojure.jar clojure.main --help
在本节中,我们将介绍如何安装一些 Clojure 的标准增强功能。您可以使用 rlwrap 或 JLine 与 Clojure REPL 一起使用,以获得一些功能,例如能够按向上箭头键检索上一个命令。
在 Ubuntu 和某些版本的 OSX 上,jline 1.0 存在一些问题,检索上一行时不会考虑提示符创建的偏移量,因此建议使用 jline 0.9.94。将 jar 文件复制到 clojure 目录。然后你可以运行
java -cp jline-VERSION.jar:clojure.jar jline.ConsoleRunner clojure.main
如果您使用的是 Ubuntu,您可以像这样安装 JLine 库
sudo apt-get install libjline-java libjline-java-doc
运行 'dpkg -L libjline-java' 以检查库的名称。在 Ubuntu 8.0.4 上,您将看到类似以下内容
$ dpkg -L libjline-java /. /usr/share/java /usr/share/java/jline-VERSION.jar
然后运行
java -cp /usr/share/java/jline-VERSION.jar:clojure.jar jline.ConsoleRunner clojure.main
如果您想从命令行运行脚本
echo '(println "Hello, World")' > hello-world.clj java -cp clojure.jar clojure.main hello-world.clj
clj 脚本是一个方便的脚本,用于启动您的 Clojure 应用程序。以下每个方法都依赖于已安装的 jline 库。
有一个 bash 脚本 包含在 Contrib 中。
对于 Windows 用户,以下是建议的 clj.bat BATCH 文件
:: Setup:
::
:: 1. Change the constants to match your paths
:: 2. Put this clj.bat file on your PATH
::
:: Usage:
::
:: clj # Starts REPL
:: clj my_script.clj # Runs the script
:: clj my_script.clj arg1 arg2 # Runs the script with arguments
@echo off
:: Change the following to match your paths
set CLOJURE_DIR=D:\clojure-1.2.0
set CLOJURE_JAR=%CLOJURE_DIR%\clojure-1.2.0.jar
set CONTRIB_JAR=%CLOJURE_DIR%\clojure-contrib-1.2.0.jar
set JLINE_JAR=%CLOJURE_DIR%\jline-0.9.94.jar
if (%1) == () (
:: Start REPL
java -cp .;%JLINE_JAR%;%CLOJURE_JAR%;%CONTRIB_JAR% jline.ConsoleRunner clojure.main
) else (
:: Start some_script.clj
java -cp .;%CLOJURE_JAR%;%CONTRIB_JAR% clojure.main %1 -- %*
)
注意:如果 clojure 安装到包含空格的路径,则需要将变量所在的路径用引号括起来。因此,
java -cp %CLOJURE_DIR%\jline-VERSION.jar;%CLOJURE_JAR% jline.ConsoleRunner clojure.main
将变成
java -cp "%CLOJURE_DIR%\jline-VERSION.jar;%CLOJURE_JAR%" jline.ConsoleRunner clojure.main
为了增强 Unix 变体下的 Clojure REPL,一个非常有用的工具是 rlwrap
。
它为 Clojure 交互式 shell 添加了以下功能。
- Tab 键补全
- 括号匹配
- 跨 Clojure 会话的历史记录
- 根据您的 readline .inputrc 设置,使用 Vi 或 Emacs 绑定
第一步是构建和安装 rlwrap
。它也可能作为您 GNU/Linux 发行版的软件包库的一部分提供。确保您的路径中存在 rlwrap
版本 0.30 或更高版本(之前的版本在处理多行提示时存在问题)。
[cljuser:~]% rlwrap -v rlwrap 0.30 [cljuser:~]%
将以下 bash 脚本保存为 clj
,并在将其设为可执行文件后将其添加到您的路径中
#!/bin/sh
breakchars="(){}[],^%$#@\"\";:''|\\"
CLOJURE_DIR=~/clojure
CLOJURE_JAR="$CLOJURE_DIR"/clojure.jar
if [ $# -eq 0 ]; then
exec rlwrap --remember -c -b "$breakchars" \
-f "$HOME"/.clj_completions \
java -cp "$CLOJURE_JAR" clojure.main
else
exec java -cp "$CLOJURE_JAR" clojure.main $1 -- "$@"
fi
请注意,此脚本使用的是 rlwrap
而不是 JLine。~/.clj_completions
文件是 rlwrap
用于提供 Tab 键补全的文件。
另外,请注意,脚本中的 clojure.jar
文件应该指的是 ant 或 maven 构建的 jar 文件的名称。ant 构建的是 clojure.jar
。
以下 Clojure 程序可用于生成补全文件
(def completions (keys (ns-publics (find-ns 'clojure.core))))
(with-open [f (java.io.BufferedWriter. (java.io.FileWriter. (str (System/getenv "HOME") "/.clj_completions")))]
(.write f (apply str (interpose \newline completions))))
要为所有标准 Clojure 命名空间生成补全(不仅仅是 'closure'),请将该代码的第一行替换为以下定义。
(def completions (mapcat (comp keys ns-publics) (all-ns)))
现在您就可以使用了。以下是 ~/.inputrc
中的设置
set editing-mode vi tab: complete set completion-ignore-case on set blink-matching-paren on
对于 Vi 键绑定,用户可以使用 %
在交互式 shell 中跳转到匹配的括号。对于 Emacs 绑定,键是 'M-C-f' ('forward-sexp') 和 'M-C-b' ('backward-sexp')。
使用 clj
调用 REPL
[cljuser:~]% clj Clojure user=> (de --> tab Desktop/ defmethod defstruct deref dec defmulti delay derive definline defn delay? descendants defmacro defn- destructure user=> (def --> tab definline defmacro defmethod defmulti defn defn- defstruct user=> (take- --> tab take-nth take-while user=> (take-
此 REPL 还记得您创建的符号
[cljuser:~]% clj Clojure user=> (def foo 10) #'user/foo user=> (def foobar 20) #'user/foobar user=> (def foo-next 30) #'user/foo-next user=> (fo --> tab foo foo-next foobar for force user=> (fo
快乐 REPLing!
clojure.lang.Repl 将运行它之前列出的所有文件,然后进入提示符。因此,我更新了我的 clj 脚本以接受一个 .cljrc.clj 文件,其中包含我的设置。
(set! *print-length* 50) (set! *print-level* 10)
Clojure contrib 是一个常见的 Clojure 库。许多项目都依赖于它,因此它应该是您安装的第一个库之一。它目前只能以源代码的形式获取,因此请按照以下步骤进行检出
git clone git://github.com/richhickey/clojure-contrib.git
在 clojure-contrib 子目录中键入 "mvn package" 以使用 Apache Maven 进行构建。将新构建的 clojure-contrib.jar 从 "target" 子目录添加到启动脚本中的类路径
java -cp $CLOJURE_JAR:$CONTRIB_JAR clojure.main
或者跳过构建 clojure-contrib.jar,而是将 clojure-contrib/src/main/clojure 添加到您的类路径。
请参阅 Clojure wiki 上的 [2] 部分。
请参阅 Clojure 文档中的说明。
使用 Vim 编辑 Clojure 代码的最先进技术是 VimClojure 插件(最近与 Gorilla 插件合并,并且依赖于启用了 Ruby 的 Vim(可以在 此处 找到包含 Ruby 支持的 Windows 版 vim)。
使用 VimClojure 设置后,您将拥有
- 语法高亮显示(包括彩虹括号)和缩进
- Vim 中的 REPL 缓冲区(具有命令历史记录、高亮显示和缩进)
- 从您的程序中评估代码的能力
- 文档查找、全方位补全等等
Gorilla 正在积极开发中(尤其是为了消除 Ruby 依赖),但非常稳定且有用。
VimClojure 和 Gorilla 都由 Meikel Brandmeyer 创建和维护。
关于这些插件的一些注意事项
- 可以查看两个(过时的)屏幕截图:VimClojure 和 Gorilla。
- 可以在以下位置找到一个更更新的屏幕截图:安装 VimClojure
- 安装说明包含在插件页面中。请注意,Gorilla 附带一个文件gorilla.jar运行 Gorilla 时,该文件需要在您的类路径中。
- 使用 Gorilla 的方法是:运行它(以便 REPL 服务器处于运行状态),然后在 Vim 中打开一个 Clojure 文件。\sr 将启动一个 REPL 缓冲区;\et 将评估光标下的表达式;请参阅:help gorilla.txt了解更多信息。
如果您使用的是上一节中的 VimClojure
插件,Ctrl-N
补全应该可以开箱即用,您不需要担心本节内容。
但是,如果您使用的是来自源代码的最新版 Clojure,API 可能有一些添加/更改。如果是这种情况,您将需要为 Clojure 生成更新的补全列表。可以使用 使用 rlwrap 增强 Clojure REPL 一节中的 Clojure 脚本创建它。生成后,此补全文件可以链接到您的 VimClojure 插件中,或者您可以更新您的 .vimrc
。请注意,补全生成器脚本已作为 VimClojure
插件的一部分提供。
拥有 ~/.clj_completions
文件后,请在您的 ~/.vimrc
中添加以下行。
au Bufenter,Bufnewfile *.clj setl complete+=k~/.clj_completions
使用此设置,您应该能够在插入模式下使用 Ctrl+N
来查看可能的补全。例如,take
Ctrl+N 将在下拉列表中显示 take-while
、take-nth
和 take
。
如果您不愿意或无法运行 Gorilla,还有两种其他方法可以从 Vim 访问 Clojure REPL。
Chimp 是 Gorilla 的前身。它使用 screen 将文本发送到正在运行的 REPL。它远不如 Gorilla 方便,但总比没有好。
这篇文章 描述了与 Chimp 完全相同的基本思想,但它是一个更轻量级的插件。
由于这两种方法都依赖于 Screen,因此它们本质上只能在类 Unix 系统(包括 Cygwin)上使用。
有一些用于Clojure开发的Eclipse插件,其中最突出的是Counterclockwise。
Enclojure项目提供了一个NetBeans插件,http://www.enclojure.org/。