2011-10-10 90 views
2

是否可以在不进入REPL的情况下编译clojure源代码?如果一个大项目在那里,那么它是不可能的手动编译每个程序&然后使它的jar文件,如果我想编译和获取类文件的一些指令使软件?是否有可能在不进入REPL的情况下编译clojure源代码?

+1

为什么你需要使用'make',不能,例如,使用['leiningen'] (https://github.com/technomancy/leiningen)或'maven'? – skuro

+0

@skuro [http:// stackoverflow。com/questions/7686452/how-to-build-executable-jar-from-clojure-code-with-a-main-function-of-java-in-on]这是在windows上配置lein的方法,遵循相同的我无法正确配置它的指示集。 – vikbehal

+0

即使在'make'中,你也必须遵循相同的步骤,比如提供'-main'等功能。只有几乎没有其他clojure开发者使用这样的工具集,而有很多快乐的leiningen用户。我建议你发布你的leiningen配置并寻求帮助。 – skuro

回答

6

为了理解这些系统中有多少个可以工作,下面是一些没有repl的编译代码的最低代码。

假设你有一些类生成代码:

hello.clj:

(ns hello 
    (:gen-class 
    :methods [[sayHi [] String]])) 

(defn -sayHi [this] 
    (println "hello world")) 

你可以建立 “的Makefile” 出的Clojure代码

compile.clj:

(set! *compile-path* "./") 
(compile 'hello) 

然后,您只需将您的代码作为脚本调用即可。

$ java -cp ~/dj/lib/clojure.jar:./ clojure.main compile.clj 
$ ls 
compile.clj hello.clj   hello$loading__4505__auto__.class 
hello.class hello__init.class hello$_sayHi.class 

现在你的代码被编译,你可以像任何其他类文件访问:

$ java -cp ~/dj/lib/clojure.jar:./ clojure.main 
Clojure 1.3.0 
user=> (import 'hello) 
hello 
user=> (.sayHi (hello.)) 
"hello world" 
user=> 
+0

是否可以在不进入REPL的情况下调用hello.clj?像__java -cp clojure.jar clojure.main -i“hello.clj”-e'(hello)'__ – vikbehal

+0

是的,只需使用与编写编译脚本相同的技术即可。用你想运行的代码创建一个clojure文件,然后运行$ java -cp clojure.jar clojure.main runhello.clj – bmillare

+0

在文件中编写**(import'hello)(.sayHi(hello。))**,像你说的没有帮助,没有输出,没有错误 – vikbehal

2

我有一个使用多种语言的大型项目,并使用make作为启动所有其他组件的粘合剂,并且这种方法效果很好。你可能做得很好,可以打电话给Maven或Leiningen,而不是使用make来重新创建它们。

如果你正在寻找一个替代leiningen,因为它不是为你工作,或者你只是想使用别的东西,那么也许你会喜欢Clojure Maven plugin

个人而言,我不能说Leiningen的太高这是我个人的选择,虽然互联网上有很多人,但值得探索其他选择。

3

是的 - 你当然可以在不使用REPL的情况下编译和运行Clojure代码。使用load function在运行时

  • 加载Clojure的代码:

    一些选项来做到这一点。这将读取,编译和评估指定的Clojure代码,而不涉及任何REPL。

  • 包一切,因为使用Leiningen或Maven或任何其他合适的构建工具一个.jar - 那么你可以运行你的代码作为一个普通的Java应用程序,Clojure的代码将被编译和执行时
  • 该.jar运行
  • 从Java启动代码 - 编写一个启动Clojure编译器的Java应用程序,直接编译并执行Clojure代码。如果您将Clojure用作更大的Java应用程序的组件,这可能是一个明智的方法。
+0

如何才能我们在运行时加载一个没有任何REPL的文件?我们不需要这样做吗? __user =>(加载文件“filename.clj”)__? – vikbehal

+0

您可以从其他代码执行此代码,可能基于某种其他形式的用户输入(例如,选择Clojure文件以在GUI中运行)。 – mikera

相关问题