跳轉到內容

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/

華夏公益教科書