`
songry
  • 浏览: 84791 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

Clojure-JVM上的函数式编程语言(12)编译 作者: R. Mark Volkmann

阅读更多

 原帖地址:http://java.ociweb.com/mark/clojure/article.html#Compiling

 作者:R. Mark Volkmann

 译者:RoySong

 

编译(compiling)

    当Clojure源文件做为脚本执行时,它们将在运行时被编译为java字节码。它们同样可以提前编译为java字节码(AOT)。

这改善了Clojure应用的启动时间,并生产了可以运用于java中的.class文件。以下是推荐的步骤:

  1. 为将进行编译的源文件选择一个命名空间,比如,com.ociweb.talk
  2. 在同一个目录下面创建"src "和"classes "目录
  3. 在源文件中需要有一个和命名空间最后一部分名字相同的源文件,比如:talk.clj,这个文件被称为主源文件
  4. 将源文件放在"src "目录下命名空间对应的目录中,比如:主源文件应该在 src/com/ociweb/talk.clj
  5. 在主源文件的头部定义命名空间并包含:gen-class命名空间指令。比如: (ns com.ociweb.talk (:gen-class))
  6. 在主源文件中,采用load函数根据相对路径来加载同一命名空间内的其他函数。比如: more.clj在 src/com/ociweb下的子目录 "talk "中,就采用(load "talk/more")
  7. 对于除了主源文件的其他源文件,采用in-ns函数来设置所属的命名空间。比如:在 more.clj的头部添加 (in-ns 'com.ociweb.talk)
  8. 将"src "和"classes "目录添加到REPL的classpath中。如果一个脚本用来运行REPL,那么需要修改这个脚本
  9. 启动一个REPL
  10. 使用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);
    }
}
 

    下面是构建和运行它的步骤:

  1. 首先切换当前目录到包含src和 classes的目录下
  2. 通过键入"clj "来启动一个REPL
  3. 键入"(compile 'com.ociweb.clj.Demo) "
  4. 退出REPL(ctrl-d或者ctrl-c)
  5. 键入"javap -classpath classes com.ociweb.clj.Demo "来查看已生成类中的方法
  6. 键入"javac -cp classes Main.java "
  7. 键入"java -cp .:classes:path /clojure.jar Main.java ",在win平台下用分号替代冒号
  8. 获得的输出应该是"Hello, Mark! "

    实际上还有更多的高级编译特性,你可以去 http://clojure.org/api/ 查看gen-class宏的API文档,同样也可以

http://clojure.org/compilation/ 看看。

分享到:
评论

相关推荐

    函数式编程语言:Clojure.zip

    史上最全编程语言全套教程,共99门...函数式编程语言 壳编程语言 常见编程语言 并行编程语言 数据分析编程语言 数据库查询语言 系统编程语言 脚本编程语言 逻辑编程语言 面向对象编程语言 等所有常见的变成语言系列教程

    Clojure入门教程- Clojure – Functional Programming for the JVM中文版

    - **Clojure**是一种运行在Java虚拟机(JVM)上的动态编程语言,它继承了Lisp家族的强大功能,同时结合了现代编程语言的优点,如面向对象编程和函数式编程。 #### 二、Clojure的特性 - **函数式编程**: Clojure强调...

    来源clojure-toolbox.com___下载.zip

    1. **Clojure编程语言**:Clojure是一种基于Lisp的函数式编程语言,运行在Java虚拟机(JVM)上。它强调 immutability(不可变性)、concurrency(并发性)和functional programming(函数式编程)特性。 2. **函数...

    clojure-utils, 各种小型但方便的clojure实用程序函数库.zip

    clojure-utils, 各种小型但方便的clojure实用程序函数库 各种小型但方便的Clojure实用程序函数库特别关注:Clojure.java - 用于从Java调用Clojure的实用工具函数的Java类arrays.clj - 操作Java数组core.clj - 应该在...

    Scala与Clojure函数式编程模式:Java虚拟机高效编程1

    Scala和Clojure都是现代函数式编程语言,它们都运行在Java虚拟机(JVM)上,能够利用Java的生态系统和资源。Scala是一种多范式语言,结合了面向对象和函数式编程的特点,提供了强大的类型系统和模式匹配功能。...

    Clojure脚本:函数式编程的现代演绎

    Clojure是一种运行在Java虚拟机(JVM)上的动态函数式编程语言,它属于Lisp家族。Clojure的设计哲学强调了函数作为一等公民的地位,以及数据的不可变性,这些特性使得Clojure在处理并发编程和数据密集型应用时表现...

    clojure-1.5.1.jar

    clojure-1.5.1.jar

    clojure-sha-3-源码.rar

    Clojure是一种基于Lisp的现代函数式编程语言,它运行在Java虚拟机(JVM)上,充分利用了Java平台的强大功能。SHA-3,全称为Secure Hash Algorithm 3,是美国国家标准与技术研究所(NIST)发布的一种密码散列函数标准...

    基于Java平台的多语言混合编程.pdf

    5. Clojure:基于JVM的动态类型语言,支持函数式编程和基于宏的 metabrogramming。 Java平台的多语言混合编程的未来发展趋势是: 1. 软件项目的未来在于混合语言编程,Java仍将是JVM生态系统中的重要组成部分。 2....

    clojure-basics-源码.rar

    Clojure是一种基于Lisp的函数式编程语言,它运行在Java虚拟机(JVM)上,充分利用了Java的生态系统。这个“clojure-basics-源码.rar”压缩包很可能是包含了一些基本Clojure编程概念的示例代码或者教程。虽然没有具体...

    clojure-1.6.0-RC3.zip

    Clojure是一种基于Lisp的函数式编程语言,它运行在Java虚拟机(JVM)上,充分利用了Java生态系统的优势。这个压缩包很可能是Clojure 1.6.0-RC3的源代码发布,开发者可以下载、编译和测试以确保其稳定性和兼容性。 ...

    clojure-must-watch-源码.rar

    Clojure是一种功能强大的Lisp方言,它在Java虚拟机(JVM)上运行,并且具有丰富的函数式编程特性。这个压缩包"clojure-must-watch-源码.rar"似乎包含了与Clojure相关的源代码,可能是为了帮助学习者深入理解Clojure...

    CS1807-U201814745-朱槐志函数式编程1

    《函数式编程原理》课程报告 一、函数式语言家族成员调研 1. Lisp Lisp是一种古老的函数式编程语言,其主要特点是使用S-表达式(Symbolic Expression)表示数据和程序。Lisp的数据结构核心是列表,而列表是通过...

    Scala与Clojure函数式编程

    Scala与Clojure都是运行在Java虚拟机(JVM)上的语言,它们都支持函数式编程范式。Scala是一种多范式的编程语言,提供了面向对象和函数式编程的特性。Clojure是一种Lisp方言,同样运行在JVM上,它拥有丰富的函数式...

    Clojure入门介绍: Clojure - Functional Programming for the JVM

    Clojure入门介绍: Clojure - Functional Programming for the JVM

    函数式编程初探共2页.pdf.zip

    8. **函数式编程语言**:一些语言天生就是函数式的,如Haskell、Lisp和Clojure;还有一些语言虽然不是纯函数式的,但支持函数式编程特性,如Python、JavaScript和Scala。 9. **monads(范畴论)**:在高级函数式...

    clojure1.3.0及资料

    Clojure是一种基于Lisp的函数式编程语言,它运行在Java虚拟机(JVM)上,充分利用了Java的生态系统。Clojure的设计目标是提供一种静态类型的、并发的、内存安全的语言,同时保持Lisp的简洁性和灵活性。在这个压缩包...

    clojure-1.5.0.zip

    该版本为稳定版,将zip文件解压,放到某个指定目录,cd进入这个目录,执行以下命令即可java -cp clojure-1.5.0.jar clojure.main。...当今最主流的运算平台JVM,把函数式编程语言引入JVM也是新方向。

    并行编程语言:Clojure.zip

    史上最全编程语言全套教程,共99门...函数式编程语言 壳编程语言 常见编程语言 并行编程语言 数据分析编程语言 数据库查询语言 系统编程语言 脚本编程语言 逻辑编程语言 面向对象编程语言 等所有常见的变成语言系列教程

    programming-clojure-3rd

    《Programming Clojure 第三版》是一本深入探讨Clojure编程语言的专业书籍,旨在帮助开发者全面理解和掌握这门基于Lisp的现代函数式编程语言。Clojure是由Rich Hickey设计的,它运行在Java虚拟机(JVM)上,同时也...

Global site tag (gtag.js) - Google Analytics