【问题标题】:Clojure REPL philosophy and utility applicationsClojure REPL 理念和实用程序应用程序
【发布时间】:2010-12-13 12:41:54
【问题描述】:

抱歉,帖子太长了,但这个论坛总是要求提供用例:-)。

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

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

我的问题集中在编译和将应用程序分成许多命名空间/文件。

我知道main 方法必须位于包含(gen-class...) 命令(或ns 命令上的:gen-class 子句)的Clojure 文件中。我是否对其他 Clojure 文件执行相同操作,还是应该将它们保留为打包在 JAR 中并由 main 文件加载的源代码?在开发过程中测试来自 REPL 的附加文件怎么样?

我一直在使用 leiningen、cake 和 maven 构建自包含的 JAR(包含解压的 clojure.jar、clojure-contrib.jar 和 commons-cli.jar 文件),但到目前为止我一直在编写我的代码在与main 方法相同的文件中。

【问题讨论】:

    标签: clojure executable-jar


    【解决方案1】:

    您可以自行决定是将 .clj 编译为 .class 还是让 Clojure 在运行时动态地编译。一般来说,我发现在开发过程中避免 AOT 更容易,并且在动态编译 .clj 的成本没有意义的情况下(如谷歌 App Engine 或启动时间有限的实用程序等有限环境)仅使用 AOT 作为性能提升器很关键)。对于会运行很长时间的服务器进程,AOT编译没有太大优势。

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

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

    【讨论】:

      【解决方案2】:

      当涉及到分离时,我会将它们保存在单独的命名空间/文件中:

      • 一个用于:gen-class 命名空间,包含-main 和所有其他类似Java 的东西。
      • 所有函数的另一个命名空间。

      理想情况下,您的 main 应该只包含对来自其他命名空间的函数的调用,或者可能包含一些用于评估或重新打包 args 的逻辑。

      您的问题似乎与逻辑代码和 ui 代码之间的分离非常相似。您可以将带有:gen-class 的命名空间视为您的程序提供给 Java 代码的接口,仅此而已。


      当涉及到实用程序(如命令行或 Swing 应用程序等)时,由于 JVM 启动时间,Java 通常会出现问题。

      现在,您可以通过让服务器应用程序一直在后台运行 REPL 来解决这个问题,并且说,以某种方式接收要评估的 s-expr,并返回结果。这可以作为一个简单的 Web 应用程序来完成,它接收一个 s-expr 作为 URL 参数,并返回结果。现在,有了这个,您可以使用普通的旧 Java 制作所有实用程序,甚至可以使用 wget 制作 bash,因为您所要做的就是访问一个 URL(假设带有 repl 的服务器正在后台运行)。

      这样的东西很有可能已经存在,所以如果有人知道 - cmets 非常受欢迎。

      哦,还有一件事,repl webapp 暴露的端口可能必须对外界关闭,以防止 Clojure 注入:D

      【讨论】:

      • 不能做 web 应用。我们在全国各地都有服务器——在防火墙之外,我需要在那里和我们的总部运行实用程序。 Java 应用程序的启动时间从来都不是问题;大多数是数据库实用程序,它们通过查询等做很多事情——数据库通常是瓶颈。不过,感谢您的回答。
      • @Ralph:好的,我添加了一条线,将仍然与您的问题相关的上部与不适用于您的情况的下部分开。
      猜你喜欢
      • 2014-09-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-08
      • 1970-01-01
      • 1970-01-01
      • 2015-02-24
      相关资源
      最近更新 更多