对于大多数的脚本编程语言来说, 提供有现成的分别进入控制台与执行脚本文件的命令. 例如 Scala, Python 默认进入控制台(REPL), 接文件路径为参数则执行脚本文件. 还有分别进入控制台和执行脚本的命令是: irb 与 ruby, groovsh 与 groovy, php -a 与 php, perl -de1 和 perl. 可以 Clojure 本身就没有 clojure 这样的命令. 当我们试图在 Mac 下用 brew install clojure 安装时, 得到的提示是没有 clojure, 应该用 brew install leiningen
去安装 leiningen, 它是一个类似于 Scala sbt 的工具.
所以启动 Clojure REPL 的命令就是 lein repl
, 其实还有一个办法来启动 Clojure 的控制台, 因为 Clojure 也是构筑于 JVM 之上的, 所以也能像启 Groovy/Scala 一样通过 java
指令加载 jar 文件来启动. 去官网 http://clojure.org/ 下载 Clojure 安装包(例如: ), 解压, 假定它的 jar 文件是 ~/Developers/clojure-1.8.0/clojure-1.8.0.jar
, 那么也可以用命令 java -jar ~/Developers/clojure-1.8.0/clojure-1.8.0.jar
进到 Clojure 控制台.
进到 Clojure 的提示符 user=>
下就可以测试 Clojure 代码了, 那么如何加载一个写在 clj
文件里的代码呢? 我们可以在 Clojure 控制台下用方法 load-file
. 假定 ~/hello.clj 文件的内容是
(+ 1 2)
在 Clojure 控制台下
user=> (load-file "~/hello.clj")3
这只是相当于我们在控制台输入 (+ 1 2)
, 也看到了 3, 其实我们在 ~/hello.clj
中并没有打印输出结果. 所以如果真正是执行 ~/hello.clj
应该是什么也看不到了, 我们需要准确的执行 clojure 脚本文件的方法.
在此我们也顺道温习一下 Clojure 与 Java 的简单互操作, 创建了文件 ~/interop.clj
, 内容如下:
(+ 1 2 3) (println (. Math PI)) (println (. Math abs -3)) (println (. "foo" toUpperCase)) (println Math/PI) (println (Math/abs -5)) (println (.toUpperCase "bar")) (def n1 (new Integer "42")) (println n1) (let [n2 (Integer. "53")] (println n2))
针对启动 Clojure 控制台的不同我们同样有两种方式执行 Clojure 脚本文件
一: 通过 clojure-x.x.x.jar 来执行 Clojure 脚本
➜ ~ java -jar ~/Developers/clojure-1.8.0/clojure-1.8.0.jar ~/interop.clj
3.141592653589793
3
FOO
3.141592653589793
5
BAR
42
53
上面的执行效果才是正确的, 其中 (+ 1 2 3)
没有 print 是不会有输出的.
把它编制成一个 bash 脚本 clojure
就是
#!/bin/bash java -jar ~/Developers/clojure-1.8.0/clojure-1.8.0.jar $@
$@
的意思是传什么给这个 clojure
脚本, 它就原原本本的送到 clojure-1.8.0.jar
的主程序. 然后把 clojure
用 chmod +x clojure
改成可执行. 再来看下
➜ ~ vi clojure
➜ ~ ./clojure
Clojure 1.8.0
user=> ^D
➜ ~ ./clojure ~/interop.clj
3.141592653589793
3
FOO
3.141592653589793
5
BAR
42
53
没参数时进入控制台, 有参数时当成文件加载执行
二: lein 通过 exec 插件执行 clojure 脚本
lein 的插件安装可以参考 lein-exec . 全局安装的话只要在 ~/.lein/profiles.clj
中添加一行
{:user {:plugins [[lein-exec "0.3.6"]]}}
再次启动 lein
就会自动下载相应的插件依赖, 并加入了 exec
任务, 用 lein help exec
查看这个插件的具体命令使用方法. 简单的用来加载外部 clj
文件的指令是
➜ ~ lein exec ~/interop.clj
3.141592653589793
3
FOO
3.141592653589793
5
BAR
42
53
执行结果是一致的.
不仅如此, Clojure 也能用作系统脚本语言, 像其他脚本语言一样. 下载 https://raw.github.com/kumarshantanu/lein-exec/master/lein-exec 放在 PATH 下, 并改成可执行.
之后只要在 clj
脚本第一行写上
#!/usr/bin/env lein-exec
或
#!/bin/bash lein-exec
就可以用 Clojure 快乐的写系统脚本了.
另外, 如果 clj
文件是放在一个 lein
项目中, 应该是可以通过 lein
任务来执行主函数中的代码的.
附: 在我目前的 ~/.lein/profiles.clj
文件中已用到了三个插件
{:user {:plugins [[venantius/ultra "0.4.1"] [lein-iclojure "1.2"] [lein-exec "0.3.6"] ]}}
分别是 控制台着色, 代码提示, 和执行插件.