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 來檢視可能的補全。例如,takeCtrl+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/。