问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

如何直接运行 Clojure 脚本文件

发布网友 发布时间:2022-04-26 14:19

我来回答

2个回答

热心网友 时间:2022-06-29 01:36

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

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

热心网友 时间:2022-06-29 01:37

一、安装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!"
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
什么牌子洗发水香味好闻持久 有哪些留香久的香氛洗发水值得入手? 香味持久的洗发水有哪些? 洗发水香味最持久排行 家装适合什么地板 客厅地板装修什么地板好 我家装修是北欧风格,想选一款与家里装修风格相匹配的地板,有何推荐? 什么样的装修用什么样的地板好 镇域 村镇 集体建设用地的区别 农村宅基地的升值之路:农民的生存保障还是财富陷阱? 这个大灯熏黑会影响亮度吗 汽车大灯贴改色膜后会影响照明吗? 软水器的作用??? 这样的大灯如果贴熏黑膜对亮度影响明显吗,大概降低百分之多少亮度? 科鲁兹大灯熏黑影响照明度吗 汽车大灯熏黑贴纸是否会影响大灯的照明亮度,透光性能如何。(只是在灯罩外面加贴透明的熏黑贴纸 不改灯) 汽车大灯熏黑后,对车灯的亮度有影响么? 关于破解版安卓游戏的一个问题 怎么样破解安卓手机收费的那些游戏 安卓gameloft游戏不能安装(破解游戏冲突)求解决办法。 - 信息提示 魅族x5安卓5.0系统不能玩破解游戏不能用游戏修改器,同一个游戏没修改过的就可以玩,破解版的就闪退 mysql如何创建数据表 安卓4.2.2版本不能玩破解的游戏吗 安卓系统玩破解游戏一定要ROOT吗? - 信息提示 安卓手机是不是必须ROOT才能运行破解过的游戏、。 游戏破解版安卓7.1不能玩,怎样修改可以玩 手机安装不了破解版游戏怎么办 华为手机为什么玩不了破解版游戏? 尾灯贴TPU熏黑膜影响倒车吗 为什么要选择Clojure 大灯贴膜影响照明吗 贴上汽车尾灯膜的话,会有哪方面的影响? 软水机的作用是什么?有人了解吗? clojure和scala的强弱类型,是解释型还是编译类型? 大灯增亮膜,用起来的效果怎么样? 为何Java程序员学习Clojure有优势? 大灯贴膜影响光线吗? 全自动软化水装置的工作程序 相比Scheme 与 Common Lisp,Clojure 有哪些坑 尾灯熏黑有什么坏处,喷漆还是贴膜比较好 Scala,Groovy,Clojure Kotlin 分别解决了Java 的什么痛点 软化水装置的产水量怎么算 clojure中怎么定义文件数组 汽车大灯改色影响透光吗? 汽车大灯贴膜对灯有坏处吗? 在Clojure里我应当使用什么web框架 车灯贴膜到底好不好用?请教下大家! Clojure中Vector和List的区别及其相关函数