Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
不进入REPL就可以编译clojure源代码吗?_Clojure - Fatal编程技术网

不进入REPL就可以编译clojure源代码吗?

不进入REPL就可以编译clojure源代码吗?,clojure,Clojure,不进入REPL就可以编译clojure源代码吗?如果有一个大项目,那么就不可能手动编译每个程序&然后将其制作成jar文件,就像我希望通过make软件中的一些指令集来编译和获取类文件一样?我有一个使用多种语言的大项目,并使用make作为胶水来启动所有其他组件,这非常有效。您最好使用make call maven或leiningen,而不是使用make重新创建它们 如果您正在寻找替代leiningen的产品,因为它不适合您,或者您只是希望使用其他产品,那么您可能会喜欢 就我个人而言,我不能对莱宁根评

不进入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应用程序的组件,这可能是一种明智的方法

为了了解这些系统中有多少在底层工作,这里提供了一些在不使用repl的情况下编译代码所需的最低限度的代码

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

hello.clj:

 (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已经对进行了更改,以便在从命令行运行时打印。