如何直接运行 Clojure 脚本文件

供稿:hz-xin.com     日期:2025-01-15
Scala,Groovy,Clojure Kotlin 分别解决了Java 的什么痛点

这三个,都和Java无关,只是碰巧都运行在JVM之上而已。他们都没有想过要取代Java,都是独立的语言,差异极大。
groovy是一门脚本语言,个人觉得没啥用处。
Scala是怪兽,人类历史上最有野心的编程语言。
clojure,是JVM上的lisp,并发支持的很好。是这个世界上你需要学习的最后一门语言。
同时,他们都不能替代Python或者Ruby或者PHP。
他们都不是来填坑的,都是来挖坑的。

Java 最初设计的时候,跨平台就是一个重要的目标,所谓「一次编写,到处运行」。而为了实现跨平台,就决定了不能像 c,c++ 那样直接把源代码编译成可执行文件,因为不同cpu,不同操作系统的指令封装格式是不一样的。
而为了实现跨平台,一般有两种方案,第一是直接执行源代码,第二是像现在 Java 这样编译成一个中间格式文件,即 class 文件,这两种方案各有优劣,现在说一下编译成中间代码的优点,class 文件相比较于 Java 源码文件,有两个优点:
class 文件内容设计的更加紧凑,方便 JVM 执行,也方便网络传输(最初 JAVA 的一个重要应用就是 applet,在当年网络不是很放大的年代,程序的体积还是要挺重要的)
方便其它语言执行。现在 JVM 上就有除了 Java 外大量的第三方语言,比如 scala,Clojure 等等。其它语言只要编译成 class 文件即可像 Java 一样在 JVM 上执行。

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

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

一、安装IDEA插件La Clojure。进行IDEA后,点左上角的IntelliJ IDEA, 选preferences, 然后左边选Plugins, 点Browse Repositories, 搜索Clojure, 下载La Clojure。

二、新建项目:
在workspace下建立clojure工程。输入 lein new groupId/artifactId。
比如输入 lein new hs.clojure/learn, 就会依照模版建立一个clojure工程。

三、导入IDEA:
直接导入IDEA不会被正确识别,因此需要在learn目录下再执行lein pom,生成相应的pom。然后在IDEA中import project,选择Import project from external model, 然后点Maven,一路点下去。

四、配置main函数:
在打开的IDEA工程中,打开src目录,在hs.clojure包中有learn.clj文件。
这个clojure文件中,并没有main函数,因此在IDEA中执行run, 什么也不会输出。
把这个文件的内容改一下
(ns hs.clojure.learn)

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

五、在IDEA中最上边的菜单中点Run, 选择Edit Configurations, 选中Run main function in the script namespace,点OK。
在Run菜单中执行Run "learn", 程序会打印出"Hello, World!"。
这时候,如果执行lein run, 会说“No :main namespace specified in project.clj”.
需要修改project.clj
(defproject hs.clojure/learn "0.1.0-SNAPSHOT"
:main hs.clojure.learn
:dependencies [[org.clojure/clojure "1.6.0"]])

保存后,执行lein run,输出"Hello, world!"

如何直接运行 Clojure 脚本文件
一、安装IDEA插件La Clojure。进行IDEA后,点左上角的IntelliJ IDEA, 选preferences, 然后左边选Plugins, 点Browse Repositories, 搜索Clojure, 下载La Clojure。二、新建项目:在workspace下建立clojure工程。输入 lein new groupId\/artifactId。比如输入 lein new hs.clojure\/learn, 就会依照模版建立一个...

如何直接运行 Clojure 脚本文件
针对启动 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 上面的执行效果才是...

电脑软件编程语言有哪些
它允许程序员指定计算机如何执行特定任务。主要编程语言分类:编程语言一般可分为以下几类:编译语言:将源代码一次性翻译成机器代码,然后由计算机直接执行。例子:C、C++、Java、Python解释语言:逐行执行源代码,无需编译。例子:JavaScript、Python(作为解释语言使用时)、PHP脚本语言:提供对其他程序(如 ...

编程分为哪几种
1. 机器级语言:用于直接控制计算机硬件的底层语言,如汇编语言和机器码。2. 高级语言:相对于机器级语言,更接近人类自然语言的编程语言,如C、C++、Java、Python等。3. 脚本语言:一种不需要编译的高级语言,如Python、JavaScript、Perl等,更适合用于快速开发和小规模计算任务。4. 面向对象编程语言:以...

如何评价clojure语言的设计?
JVM的启动速度问题影响了其在某些场景下的实用性,如编写小型脚本时。为了充分发挥Clojure的优势,开发者需要具备良好的Java知识,这增加了学习成本。API设计有时可能不符合直觉,但这也是Clojure坚持哲学一致性而非妥协于直觉的结果。弱类型带来的灵活性与错误发现时延并存,需要通过一定程度的测试来保证运行时...

scala、groovy、clojure、kotlin分别解决了java的什么
Groovy则定位为一个JVM上的脚本语言,旨在提供灵活性和DSL(Domain-Specific Language)支持。Groovy的突出特点是易于编写DSL,比如用于构建Gradle的构建脚本,其灵活性和DSL支持能力与Ruby类似,但相比Groovy,Scala在实现代数上的抽象结构方面可能更为困难。Clojure作为JVM上的Lisp,旨在解决Java语法与Lisp之间的...

App 测试工具大全,收藏这篇就够了
一、APP自动化测试工具 Appium 是一个开源、跨平台的自动化测试工具。它支持自动化测试iOS、Android和Windows桌面平台上的原生、移动Web和混合应用。开发者可以使用WebDriver兼容的任何语言编写测试脚本,如Java、OC、JS、PHP、Python、Ruby、C#、Clojure 和Perl。Appium是UI自动化测试的必选工具之一。Airtest ...

什么是web应用系统
用户只需要有浏览器即可,不需要再安装其他软件。一个Web应用程序是由完成特定任务的各种Web组件(web components)构成的并通过Web将服务展示给外界。在实际应用中,Web应用程序是由多个Servlet、JSP页面、HTML文件以及图像文件等组成。所有这些组件相互协调为用户提供一组完整的服务。

时间旅行,用50种不同语言编写了“Hello, World!”
Windows PowerShell(2006年):Windows PowerShell,微软开发的脚本语言,"Hello, World!"程序展示了语言的实用性和系统集成性。Clojure(2007年):Clojure,一种函数式编程语言,"Hello, World!"程序展示了语言的通用性和功能。Go(2009年):Go,一种并发式的编程语言,"Hello, World!"程序展示了语言...

java和python的优缺点(javapython区别)
Java虚拟机(JVM)是运行Java代码的理想化和便携式平台。程序员不必担心硬件细节,并且不必将代码移植到新平台,Java承诺“一次写入,到处编译(WORA)”。同时,JVM语言有很多,比如Groovy、Clojure、烂孝侍Scala、Python或者Jython。 Python起源于一种脚本语言,它的语法体现了一种可读性的理念,具有简单而规则的界限,鼓励简洁...