跳转到内容

Clojure 编程/入门

来自维基教科书,开放世界中的开放书籍

本页将引导您完成设置可用的 Clojure 环境所需的步骤。您将

  1. 安装 Clojure
  2. 安装几个标准的 Clojure 增强功能
  3. 配置 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 BoxClojure Box 的视频安装指南可在 http://vimeo.com/9219062 找到。注意:Clojure Box 不再维护,最后一个版本支持 Clojure 1.2,它对 1.3 的支持不太好 2012-02-17

最新的替代方案是 Lisp Cabinet,它支持 Clojure,至少到 1.5.1 版本。2013-06-04

使用 MacPorts

[编辑 | 编辑源代码]

运行 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

[编辑 | 编辑源代码]

您也可以使用 homebrew 来轻松安装 Clojure。要通过 homebrew 安装 Clojure,请先通过 homebrew 网页 [1] 下载 homebrew 并按照那里的指南进行安装。

安装好后,可以使用以下命令通过 homebrew 安装 Clojure

   brew install clojure

无需 sudo。要进入 REPL,只需在终端中输入“clj”。

Debian GNU/Linux 和衍生系统

[编辑 | 编辑源代码]

在基于 Debian 的系统上,安装 Clojure 最简单的方法是运行

   sudo apt-get install clojure1.2

这将安装 Clojure jar 和一个 bash 脚本,以简化命令行调用。它的访问方式与其他方法略有不同。要运行 Clojure 脚本,只需调用

   clojure script-name.clj arguments to script

不带脚本名称和参数的调用将打开 REPL。

注意:这将安装 1.0 版本。要安装更新版本的 Clojure,您必须使用以下方法之一

安装 JAR

[编辑 | 编辑源代码]

在不支持 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

[编辑 | 编辑源代码]

使用 1.6.0 版本

[编辑 | 编辑源代码]

您可以使用以下命令启动 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 中。

使用旧版本(直到 1.2.1)

[编辑 | 编辑源代码]

您可以使用以下命令启动评估循环

   java -cp clojure.jar clojure.main

   java -jar clojure.jar

您可以使用以下命令获取使用选项

   java -cp clojure.jar clojure.main --help

增强环境

[编辑 | 编辑源代码]

在本节中,我们将介绍如何安装一些 Clojure 的标准增强功能。您可以使用 rlwrap 或 JLine 与 Clojure REPL 一起使用,以获得一些功能,例如能够按向上箭头键检索上一个命令。

使用 JLine 增强 Clojure REPL

[编辑 | 编辑源代码]

下载 JLine.

在 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 脚本

[编辑 | 编辑源代码]

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

使用 rlwrap 增强 Clojure REPL

[编辑 | 编辑源代码]

为了增强 Unix 变体下的 Clojure REPL,一个非常有用的工具是 rlwrap

它为 Clojure 交互式 shell 添加了以下功能。

  1. Tab 键补全
  2. 括号匹配
  3. 跨 Clojure 会话的历史记录
  4. 根据您的 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 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 添加到您的类路径。

编辑器/IDE

[编辑 | 编辑源代码]

各种 IDE 的官方说明

[编辑 | 编辑源代码]

请参阅 Clojure wiki 上的 [2] 部分。

请参阅 Clojure 文档中的说明

使用 Vim 编辑 Clojure 代码的最先进技术是 VimClojure 插件(最近与 Gorilla 插件合并,并且依赖于启用了 Ruby 的 Vim(可以在 此处 找到包含 Ruby 支持的 Windows 版 vim)。

使用 VimClojure 设置后,您将拥有

  • 语法高亮显示(包括彩虹括号)和缩进
  • Vim 中的 REPL 缓冲区(具有命令历史记录、高亮显示和缩进)
  • 从您的程序中评估代码的能力
  • 文档查找、全方位补全等等

Gorilla 正在积极开发中(尤其是为了消除 Ruby 依赖),但非常稳定且有用。

VimClojure 和 Gorilla 都由 Meikel Brandmeyer 创建和维护。

关于这些插件的一些注意事项

  • 可以查看两个(过时的)屏幕截图:VimClojureGorilla
  • 可以在以下位置找到一个更更新的屏幕截图:安装 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 来查看可能的补全。例如,takeCtrl+N 将在下拉列表中显示 take-whiletake-nthtake

从 Vim 与 REPL 交互的其他方法

[编辑 | 编辑源代码]

如果您不愿意或无法运行 Gorilla,还有两种其他方法可以从 Vim 访问 Clojure REPL。

Chimp 是 Gorilla 的前身。它使用 screen 将文本发送到正在运行的 REPL。它远不如 Gorilla 方便,但总比没有好。

这篇文章 描述了与 Chimp 完全相同的基本思想,但它是一个更轻量级的插件。

由于这两种方法都依赖于 Screen,因此它们本质上只能在类 Unix 系统(包括 Cygwin)上使用。

有一些用于Clojure开发的Eclipse插件,其中最突出的是Counterclockwise


Enclojure项目提供了一个NetBeans插件,http://www.enclojure.org/

华夏公益教科书