不需要进入REPL,是否有可能编译Clojure源代码?

5

是否可以在不进入REPL的情况下编译Clojure源代码?如果存在一个大型项目,则不可能手动编译每个程序,然后将其制作成jar文件,例如,如果我希望通过一些 make 软件中的指令编译并获取类文件怎么办?


1
为什么需要使用 make,而不能使用 leiningenmaven - skuro
@skuro 这是关于如何在Windows上配置lein的问题,遵照相同的指示集,我无法正确地进行配置。 - vikbehal
即使在 make 中,您也必须遵循相同的步骤,例如提供 -main 函数等。只是,几乎没有其他Clojure开发人员使用这样的工具集,而有许多快乐的Leiningen用户。我建议您发布您的Leiningen配置并寻求帮助。 - skuro
我知道Make,但不熟悉Clojure。听起来Make可能不是最适合这项工作的工具;如果你仍然想使用它,请告诉我们你将如何手动完成它,我们可以告诉你如何委派给Make。 - Beta
可能是如何在Clojure中创建可执行文件?的重复问题。 - Craig Stuntz
3个回答

8
为了更好地理解这些系统的底层工作原理,以下是一些最基本的代码,可以在没有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=> 

1
有没有可能在不进入REPL的情况下调用hello.clj?比如__java -cp clojure.jar clojure.main -i "hello.clj" -e '(hello)' __ - vikbehal
1
是的,只需使用我在编写编译脚本时使用的相同技术即可。创建一个包含您要运行的代码的Clojure文件,然后运行$ Java -cp clojure.jar clojure.main runhello.clj。 - bmillare
在文件中编写**(import 'hello) (.sayHi (hello.))**并像你说的那样运行并没有帮助,没有输出,也没有错误。 - vikbehal
我的类将一个字符串输出到repl。要打印,您需要实际调用print。您需要重写hello.clj。 - bmillare
1
我已经做出了更改,以便在从命令行运行时打印。 - bmillare

4

是的 - 您可以在不使用REPL的情况下编译和运行Clojure代码。

有几种选项可以实现这一点:

  • 在运行时加载Clojure代码,使用load function。这将读取、编译和评估指定的Clojure代码,而无需使用任何REPL。
  • 将所有内容打包为.jar文件,使用Leiningen或Maven或其他适当的构建工具 - 然后您可以像运行常规Java应用程序一样运行您的代码,当执行.jar文件时,Clojure代码将被编译和运行
  • 从Java中启动代码 - 编写一个Java应用程序,直接启动Clojure编译器来编译和执行Clojure代码。如果您正在将Clojure作为更大的Java应用程序的组件使用,则这可能是一个明智的方法。

我们如何在运行时加载文件而不需要任何REPL?难道我们不需要这样做吗?user=> (load-file "filename.clj")? - vikbehal
1
你可以从其他代码执行此代码,也许基于某种其他形式的用户输入(例如,在 GUI 中选择要运行的 Clojure 文件)。 - mikera

3
我有一个大型项目,使用多种语言,并使用make作为启动所有其他组件的粘合剂,这很有效。您可以考虑让make调用maven或leiningen,而不是使用make重新发明它们。
如果您正在寻找leiningen的替代方案,因为它对您没有用,或者您只是希望使用其他东西,那么也许您会喜欢Clojure Maven插件
就我个人而言,我对Leiningen评价很高,这是我的个人选择,尽管互联网上有很多人,值得探索其他选项。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接