如何直接运行 Clojure 脚本文件

对于大多数的脚本编程语言来说, 提供有现成的分别进入控制台与执行脚本文件的命令. 例如 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 项目

lein new myapp; cd myapp

使用默认模板创建了一个 lein 项目 myapp, 并进到项目目录. 在当前项目的  project.clj 中加上

:main myapp.core

编辑 src/core.clj 文件, 内容如下:

(ns myapp.core)

(defn -main [& args]
  (println "Hello, World!"))

可以运行 lein run 了

➜ myapp lein run
Hello, World!

附: 在我目前的  ~/.lein/profiles.clj 文件中已用到了三个插件

{:user {:plugins [[venantius/ultra "0.4.1"]
                  [lein-iclojure "1.2"]
                  [lein-exec "0.3.6"] ]}}

分别是 控制台着色, 代码提示, 和执行插件.

类别: Clojure. 标签: . 阅读(63). 订阅评论. TrackBack.

Leave a Reply

Be the First to Comment!

avatar
wpDiscuz