原帖地址:http://java.ociweb.com/mark/clojure/article.html#Compiling
作者:R. Mark Volkmann
译者:RoySong
编译(compiling)
当Clojure源文件做为脚本执行时,它们将在运行时被编译为java字节码。它们同样可以提前编译为java字节码(AOT)。
这改善了Clojure应用的启动时间,并生产了可以运用于java中的.class文件。以下是推荐的步骤:
- 为将进行编译的源文件选择一个命名空间,比如,
com.ociweb.talk
- 在同一个目录下面创建"
src
"和"classes
"目录
- 在源文件中需要有一个和命名空间最后一部分名字相同的源文件,比如:
talk.clj,这个文件被称为主源文件
- 将源文件放在"
src
"目录下命名空间对应的目录中,比如:主源文件应该在 src/com/ociweb/talk.clj
- 在主源文件的头部定义命名空间并包含
:gen-class命名空间指令。比如:
(ns com.ociweb.talk (:gen-class))
- 在主源文件中,采用
load函数根据相对路径来加载同一命名空间内的其他函数。比如:
more.clj在
src/com/ociweb下的子目录
"talk
"中,就采用(load "talk/more")
- 对于除了主源文件的其他源文件,采用
in-ns函数来设置所属的命名空间。比如:在
more.clj的头部添加
(in-ns 'com.ociweb.talk)
- 将"
src
"和"classes
"目录添加到REPL的classpath中。如果一个脚本用来运行REPL,那么需要修改这个脚本
- 启动一个REPL
- 使用
compile函数来编译指定命名空间中所有的源文件,格式是
(compile 'namespace
)。比如:
(compile 'com.ociweb.talk)
每个函数会产生一个独立的.class文件,这些.class文件会被写入到"classes
"文件夹下面对应命名空间的目录结构下面。
如果编译过的命名空间中拥有一个叫做-main的函数,那么它就能够作为一个Java应用运行。命令行参数会作为参数传递
给这个函数。比如,如果talk.clj包含一个
叫做-main的函数,那么它就可以像下面这样运行:
java -classpath path/classes:path/clojure.jar com.ociweb.talk args
Java调用Clojure
AOT编译过的Clojure函数(如果它们被标注为静态static)能够被java应用调用。在:gen-class
:methods指令中可以
设置元数据关键字:static为true就能够标注为静态了。
:methods指令同样指定了函数参数和返回值的java类型。
语法如下:
(ns namespace
(:gen-class
:methods [#^{:static true} [function-name [param-types] return-type]]))
让我们看一个例子,下面是一个在src/com/ociweb/clj目录下的
Demo.clj源文件:
(ns com.ociweb.clj.Demo
(:gen-class
:methods [#^{:static true} [getMessage [String] String]]))
# Note the hyphen at the beginning of the function name!
(defn -getMessage [name]
(str "Hello, " name "!"))
下面是一个java源文件Main.java,在
src和
classes同样的目录下:
import com.ociweb.clj.Demo; // class created by compiling Clojure source file
public class Main {
public static void main(String[] args) {
String message = Demo.getMessage("Mark");
System.out.println(message);
}
}
下面是构建和运行它的步骤:
- 首先切换当前目录到包含
src和
classes的目录下
- 通过键入"
clj
"来启动一个REPL
- 键入"
(compile 'com.ociweb.clj.Demo)
"
- 退出REPL(ctrl-d或者ctrl-c)
- 键入"
javap -classpath classes com.ociweb.clj.Demo
"来查看已生成类中的方法
- 键入"
javac -cp classes Main.java
"
- 键入"
java -cp .:classes:path
/clojure.jar Main.java
",在win平台下用分号替代冒号
- 获得的输出应该是"
Hello, Mark!
"
实际上还有更多的高级编译特性,你可以去 http://clojure.org/api/
查看gen-class宏的API文档,同样也可以
去http://clojure.org/compilation/
看看。
分享到:
相关推荐
clojure-utils, 各种小型但方便的clojure实用程序函数库 各种小型但方便的Clojure实用程序函数库特别关注:Clojure.java - 用于从Java调用Clojure的实用工具函数的Java类arrays.clj - 操作Java数组core.clj - 应该在...
clojure-1.5.1.jar
Clojure入门介绍: Clojure - Functional Programming for the JVM
该版本为稳定版,将zip文件解压,放到某个指定目录,cd进入这个目录,执行以下命令即可java -cp clojure-1.5.0.jar clojure.main。...当今最主流的运算平台JVM,把函数式编程语言引入JVM也是新方向。
clojure-cheatsheet, 用于Emacs的Clojure Cheatsheet 用于Emacs的难以置信方便的 Clojure Cheatsheet,更新为 Clojure,打包成简单,快速,可以搜索的离线形式: 状态准备使用基于 Clojure 1.7.0.安装如果你连接到 ...
Clojure是一个JVM的动态函数式语言,最近发布了1.0版本,版本中Clojure提供了一个健壮的代码。Clojure是一套发展快速的新的编程语言,特别是,它为多核计算做了新的解决方案。在今后的软件设计中无论使用Clojure语言...
clojure-csv, 从Clojure读取和写入CSV文件的库 csvclojure CSV是一个用于读取和写入CSV文件的小型库。 主要功能:接受两个常见行终止符。CSV字段内的引号和转义符是正确的句柄。解析时支持在CSV字段中嵌入未转义的行...
java运行依赖jar包
clojure 1.8.0
Clojure是一种LISP风格的语言,运行在JVM上。Clojure的一大特色就是其并发机制,它支持不可变的数据结构(Clojure是来自于可持久化的数据结构)。Clojure还有一个特色是软件事务存储(Software Transactional Memory...
clojure-sha-3-源码.rar
clojure-must-watch-源码.rar
Clojure的。 采用类似于草书的方法静态分析代码。 •••••• 总览 该项目的目标是为所有编辑人员带来适用于Clojure的出色编辑工具。 它旨在与您一起工作,以帮助您导航,识别和修复错误,执行重构等等! 你会...
Fork of http://code.google.com/p/clojure-jsr223/ that loads the Clojure runtime lazily. Copyright (c) 2009 Armando Blancas. All rights reserved. The use and distribution terms for this software are ...
clojure-style-guide:Clojure编程语言的社区编码风格指南
clojure-basics-源码.rar
Clojure入门教程- Clojure – Functional Programming for the JVM中文版
clojure编程语言的语法基础。 如何安装 确保安装了bash,curl,rlwrap和java以下工具。 您可以通过运行以下命令来安装它们: sudo apt install curl rlwrap default-jdk 。 使用以下命令下载clojure安装脚本: ...
clojure-1.6 java jvm
初级java笔试题迭代Clojure介绍工作坊 Clojure 编程的实用、动手介绍,有史以来最好的 JVM 语言 :-) 是一种面向 JVM 和浏览器的现代 Lisp 语言 (),专为并发性、简单性和生产力而设计。 Clojure 我们在交互式 Web ...