原文地址:http://a0z.me/blog/2015/03/09/setup-clojure-on-mac/java
Clojure是運行在JVM上的語言,因此依賴一個Java運行環境。雖然在UNIX平臺上有Oracle JDK和OpenJDK之分,但對於進行基於JVM的開發而言,仍舊推薦使用Oracle JDK,好在OS X爲咱們提供了這樣的環境。Clojure對Java版本並無特別的要求,因而只要正確設置Java的相關環境變量,Clojure就能正常運行。bash
運行java
和javac
命令檢查相應的版本,以肯定這兩個命令都可以正常運行便可。app
bash$ java -version java version "1.7.0_60" Java(TM) SE Runtime Environment (build 1.7.0_60-b19) Java HotSpot(TM) 64-Bit Server VM (build 24.60-b09, mixed mode) $ javac -version javac 1.7.0_60
對於Clojure而言,Homebrew並非必要的;然而咱們仍然能夠經過Homebrew來安裝Leiningen。maven
Clojure是一個運行在JVM上的語言,說到底,它的核心就是一個jar
包。
能夠在Clojure的官網上下載到最新的穩定版,也就是Clojure 1.6。編輯器
把其中的clojure-1.6.0.jar
移動到咱們已有的路徑下:函數
bash$ cd clojure/ $ sudo mkdir /usr/local/lib/clojure $ sudo cp cojoure-1.6.0.jar /usr/local/lib/clojure
而後進入剛剛建立的目錄,咱們能夠先嚐試一下進入REPL
:工具
bash$ java -cp clojure.jar clojure.main
在進入的交互式命令行中,能夠用經典的Lisp語法嘗試輸入一些運算,以及調用一些熟悉的Java函數:測試
Clojure(println "Clojure is awesome!") (+ 2 5) (System/exit 0)
clj
Script若是每次都要切換目錄,輸入一大串命令來運行Clojure REPL,這簡直太麻煩了。好在咱們有另外一種解決方案:clj
腳本。ui
clj
腳本是對Clojure的調用,可讓咱們快速進入REPL,也能夠直接經過clj
命令來運行寫好的簡單Clojure程序。this
我把clj
腳本存放在/usr/local/bin/
目錄下:
bash$ sudo touch /usr/local/bin/clj
而後用最喜好的編輯器打開這個文件,輸入下面內容:
#!/bin/sh # Parts of this file come from: # http://en.wikibooks.org/wiki/Clojure_Programming/Getting_Started#Create_clj_Script BREAK_CHARS="\(\){}[],^%$#@\"\";:''|\\" CLOJURE_DIR=/usr/local/lib/clojure CLOJURE_JAR=$CLOJURE_DIR/clojure.jar CLASSPATH="$CLOJURE_DIR/*:$CLOJURE_JAR" while [ $# -gt 0 ] do case "$1" in -cp|-classpath) CLASSPATH="$CLASSPATH:$2" shift ; shift ;; -e) tmpfile="/tmp/`basename $0`.$$.tmp" echo "$2" > "$tmpfile" shift ; shift set "$tmpfile" "$@" break # forces any -cp to be before any -e ;; *) break ;; esac done if [ $# -eq 0 ] then exec rlwrap --remember -c -b $BREAK_CHARS \ -f "$HOME"/.clj_completions \ java -cp $CLASSPATH clojure.main else exec java -cp $CLASSPATH clojure.main $1 -- "$@" fi
而後給它加上權限:
bash$ sudo chmod +x /usr/local/bin/clj
這樣就能夠經過運行clj
命令來進入REPL,同時能夠運行clj xxx.clj
來測試寫好的簡單的Clojure程序。是否是很方便呢?
clj命令針對的是小型Clojure程序的調試,若是想用Clojure作上規模的項目,就須要解決各類庫和依賴的問題,同時還須要遵循規範的項目目錄結構、打包Jar進行部署等問題。
Leiningen是一個命令行工具,用來解決Clojure項目的包管理、依賴、打包、部署等問題。關於Leiningen的使用,請參考這篇教程。下面介紹它的安裝。
Leiningen官網有介紹安裝方法,而在OS X上,有強大的Homebrew,就能夠利用Homebrew進行安裝。
bash$ brew install leiningen
rlwrap
Plugin在運行REPL的時候,會常常遇到輸入很長的路徑、文件名、包名、函數名的狀況,默認的REPL並不像bash同樣能有自動補全功能,而rlwrap
插件則提供了這個功能,因此這是個很是方便又十分必要的插件。
一樣是利用Homebrew安裝:
$ brew install rlwrap
rlwrap須要配置,而一部分的配置文件已經寫在上面的clj中了,接下來要利用一段Clojure程序生成一個文件:
Clojure; generating the completion file (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中全部的命名空間,把上述第一行改成: (def completions (mapcat (comp keys ns-publics) (all-ns)))
在clj中運行以上代碼,就能夠生成~/clj_completions
文件。
同時,還要添加~/.inputrc
文件:
set editing-mode vi tab: complete set completion-ignore-case on set blink-matching-paren on
接下來,打開clj,體驗命令自動補全在Clojure中帶來的快感吧!
Clojure~» clj Clojure 1.6.0 user=> (re<tab> re-find read-string ref-min-history repeat reset! re-groups reader ref-set repeatedly reset-meta! re-matcher realized? refer repl resolve re-matches record? refer-clojure repl-caught resource re-pattern reduce reify repl-exception resources re-quote-replacement reduce-kv release-pending-sends repl-prompt rest re-seq reduced rem repl-read restart-agent read reduced? remove repl-requires resultset-seq read-instant-calendar reductions remove-all-methods replace reverse read-instant-date ref remove-method replace-first reversible? read-instant-timestamp ref-history-count remove-ns replicate read-line ref-max-history remove-watch require
在當前的1.6版本中,並不須要特別配置clojure_contrib,若是在老版本(1.3或更早)的項目中,請單獨配置並管理clojure_contrib。
Clojure支持各類文本編輯器和IDE:
我嘗試過用Vim那套配置寫Clojure,感受並非很暢快。幾經周折,選擇了用IntellJ IDEA,而做爲一個成熟的IDE,這並不須要特別配置些什麼,只須要在裏面安裝一個插件便可。
簡單的Clojure配置就是這樣,接下來就能夠嘗試者作一些Clojure程序啦!
我在這裏先寫一個,由於REPL中並無相似exit
的命令,因此我就寫了這麼個函數:
Clojure(defn exit [] (System/exit 0))
把這行代碼保存到~/.clojure.clj
文件裏,這樣在每次退出REPL時候,輸入(exit)
便可。
最後在上一張圖,這是用Clojure寫的Processing程序:
祝Happy Hacking with Clojure!