不进入REPL就可以编译clojure源代码吗?
不进入REPL就可以编译clojure源代码吗?如果有一个大项目,那么就不可能手动编译每个程序&然后将其制作成jar文件,就像我希望通过make软件中的一些指令集来编译和获取类文件一样?我有一个使用多种语言的大项目,并使用make作为胶水来启动所有其他组件,这非常有效。您最好使用make call maven或leiningen,而不是使用make重新创建它们 如果您正在寻找替代leiningen的产品,因为它不适合您,或者您只是希望使用其他产品,那么您可能会喜欢不进入REPL就可以编译clojure源代码吗?,clojure,Clojure,不进入REPL就可以编译clojure源代码吗?如果有一个大项目,那么就不可能手动编译每个程序&然后将其制作成jar文件,就像我希望通过make软件中的一些指令集来编译和获取类文件一样?我有一个使用多种语言的大项目,并使用make作为胶水来启动所有其他组件,这非常有效。您最好使用make call maven或leiningen,而不是使用make重新创建它们 如果您正在寻找替代leiningen的产品,因为它不适合您,或者您只是希望使用其他产品,那么您可能会喜欢 就我个人而言,我不能对莱宁根评
就我个人而言,我不能对莱宁根评价太高,这是我个人的选择,尽管互联网上有很多人,值得探索其他选择 是-您当然可以编译和运行Clojure代码,而无需使用REPL 执行此操作的一些选项:
- 在运行时加载Clojure代码。这将读取、编译和评估指定的Clojure代码,而不涉及任何REPL
- 使用Leiningen或Maven或任何其他合适的构建工具将所有内容打包为.jar,然后您可以将代码作为常规Java应用程序运行,Clojure代码将在.jar执行时编译并运行
- 从Java启动代码-编写一个Java应用程序,直接启动Clojure编译器编译并执行Clojure代码。如果将Clojure用作更大Java应用程序的组件,这可能是一种明智的方法
(ns hello
(:gen-class
:methods [[sayHi [] String]]))
(defn -sayHi [this]
(println "hello world"))
您可以用clojure代码构建“makefile”
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=>
为什么您需要使用
make
,而不能使用或maven
?@skuro[这是在windows上配置lein的方法,遵循相同的指令集,我无法正确配置它。即使在make
中,您也必须遵循相同的步骤,例如提供-main
函数等。只是,几乎没有其他clojure开发人员使用这样的工具集,而有很多人使用它leiningen用户。我建议您发布您的leiningen配置,并就此寻求帮助。我知道Make,但不知道clojure。听起来Make似乎不是完成此项工作的最佳工具;如果您仍然想使用它,请告诉我们您将使用哪些命令手动执行此操作,我们可以告诉您如何将它们委派给Make在运行时加载一个文件而不使用任何REPL?我们不需要这样做吗?user=>(加载文件“filename.clj”)?您可以从其他代码执行此代码,可能基于其他形式的用户输入(例如,选择要在GUI中运行的Clojure文件)。是否可以调用hello.clj而不进入REPL?比如u java-cp Clojure.jar Clojure.main-i“hello.clj”-e'(hello)u是的,只需使用与编写编译脚本相同的技术。使用要运行的代码创建clojure文件,然后运行$Java-cp clojure.jar clojure.main runhello.cljwriting(导入“hello”)(.sayHi(hello.))在一个文件中,像你说的那样运行是没有帮助的,没有输出,没有错误我的类向repl输出一个字符串。要打印,你需要实际调用print。你需要重写hello。cljI已经对进行了更改,以便在从命令行运行时打印。