Clojure REPL哲学和实用程序应用程序

对不起,很长的帖子,但这个论坛总是要求用例:-).

我经常被要求为我的组织编写实用程序应用程序(GUI和命令行).我最常用Java和最近的Scala编写这些文件.

Clojure(和其他Lisps)中的“哲学”似乎以REPL为中心,我不得不同意它是一个很好的开发环境,但我显然无法生成需要用户“安装Clojure和Clojure-contrib的实用程序,然后将该实用程序解压缩到硬盘驱动器上的目录中,使用以下类路径从命令行启动Clojure,…“.用户并不关心该实用程序是用Clojure编写的.他们只想指向并点击或最多输入“java -jar Utility.jar – ?”在命令行上.

我的问题围绕编译并将应用程序分成许多名称空间/文件.

我知道main方法必须在包含(gen-class …)命令的Clojure文件中(或ns命令中的:gen-class子句).我是否对其他Clojure文件执行相同的操作,还是将它们保留为包装在JAR中并由主文件加载的源代码?如何在开发期间从REPL测试其他文件?

我一直在使用leiningen,cake和maven来构建自包含的JAR(包含解压缩的clojure.jar,clojure-contrib.jar和commons-cli.jar文件),但到目前为止我一直在编写我的代码file作为主要方法.

最佳答案 无论您是将.clj编译为.class还是让Clojure在运行时动态执行它,都取决于您.总的来说,我发现在开发过程中更容易避免使用AOT并且只是将AOT用作性能助推器,以便在运行时编译.clj的成本没有意义(有限的环境,如Google App Engine或实用程序的启动时间)很关键).对于将运行很长时间的服务器进程,AOT编译没有太大的优势.

在开发时间使用AOT类有许多复杂性,这些特定于不同的开发环境.

AOT的一个缺点是您的编译类可能与Clojure的未来版本不兼容,并且这比您的clj文件不兼容更可能.随着时间的推移,这可能变得更加重

点赞