在OS X上配置Clojure開發環境

原文地址:http://a0z.me/blog/2015/03/09/setup-clojure-on-mac/java

圖片描述

Clojure環境依賴

Java

Clojure是運行在JVM上的語言,因此依賴一個Java運行環境。雖然在UNIX平臺上有Oracle JDK和OpenJDK之分,但對於進行基於JVM的開發而言,仍舊推薦使用Oracle JDK,好在OS X爲咱們提供了這樣的環境。Clojure對Java版本並無特別的要求,因而只要正確設置Java的相關環境變量,Clojure就能正常運行。bash

運行javajavac命令檢查相應的版本,以肯定這兩個命令都可以正常運行便可。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

Homebrew

對於Clojure而言,Homebrew並非必要的;然而咱們仍然能夠經過Homebrew來安裝Leiningen。maven

Clojure核心組件

Clojure

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程序。是否是很方便呢?

Leiningen

clj命令針對的是小型Clojure程序的調試,若是想用Clojure作上規模的項目,就須要解決各類庫和依賴的問題,同時還須要遵循規範的項目目錄結構、打包Jar進行部署等問題。

Leiningen是一個命令行工具,用來解決Clojure項目的包管理、依賴、打包、部署等問題。關於Leiningen的使用,請參考這篇教程。下面介紹它的安裝。

Leiningen官網有介紹安裝方法,而在OS X上,有強大的Homebrew,就能夠利用Homebrew進行安裝。

bash$ brew install leiningen

Clojure擴展組件

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

關於clojure_contrib

在當前的1.6版本中,並不須要特別配置clojure_contrib,若是在老版本(1.3或更早)的項目中,請單獨配置並管理clojure_contrib。

Clojure Editor/IDE

Clojure支持各類文本編輯器和IDE:

  • Emacs
  • Vim
  • Sublime Text
  • Atom
  • IntelliJ IDEA
  • Eclipse

我嘗試過用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!

相關文章
相關標籤/搜索