原文地址: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!