您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

Python习惯用法“如果__name__ =='__main__'”的clojure等效项是什么?

Python习惯用法“如果__name__ =='__main__'”的clojure等效项是什么?

从命令行一遍又一遍地运行Clojure脚本不是惯用的。REPL是更好的命令行。Clojure是一个Lisp,通常会启动Clojure并使该实例永远运行,并与其交互而不是重新启动它。您可以一次更改一个正在运行的实例中的功能,然后运行它们并根据需要戳它们。摆脱繁琐而缓慢的传统编辑/编译/调试周期是Lisps的一大特色。

您可以轻松编写函数来执行诸如运行单元测试之类的功能,并且只要想运行它们就可以从REPL调用这些函数,否则就忽略它们。在Clojure中clojure.contrib.test- is,通常会使用,将测试函数添加名称空间中,然后再使用clojure.contrib.test-is/run-tests它们来运行它们。

不从命令行运行Clojure的另一个很好的理由是,JVM的启动时间可能过长。

如果您真的想从命令行运行Clojure脚本,则可以使用多种方法。有关某些讨论,请参见Clojure邮件列表

一种方法是测试命令行参数的存在。foo.clj在当前目录中给出以下内容

(ns foo)

(defn hello [x] (println "Hello," x))

(if *command-line-args*
  (hello "command line")
  (hello "REPL"))

根据如何启动Clojure,您将获得不同的行为。

$ java -cp ~/path/to/clojure.jar:. clojure.main foo.clj --
Hello, command line
$ java -cp ~/path/to/clojure.jar:. clojure.main
Clojure 1.1.0-alpha-SNAPSHOT
user=> (use 'foo)
Hello, REPL
nil
user=>

src/clj/clojure/main.clj在Clojure的来源,如果你想看到这是如何工作的。

另一种方法是将代码编译成.class文件,然后从Java命令行调用它们。给定一个文件foo.clj

(ns foo
  (:gen-class))

(defn hello [x] (println "Hello," x))

(defn -main [] (hello "command line"))

创建一个目录来存储编译的.class文件认为./classes。您必须自己创建此文件夹,Clojure不会创建它。还要确保您设置$CLASSPATH包括./classes和带有源代码的目录;我假设foo.clj它在当前目录中。因此,从命令行:

$ mkdir classes
$ java -cp ~/path/to/clojure.jar:./classes:. clojure.main
Clojure 1.1.0-alpha-SNAPSHOT
user=> (compile 'foo)
foo

classes目录中,您现在将有一堆.class文件。要从命令行调用代码-main认情况下运行函数):

$ java -cp ~/path/to/clojure.jar:./classes foo
Hello, command line.

clojure.org上有很多有关编译Clojure代码的信息。

python 2022/1/1 18:42:53 有484人围观

撰写回答


你尚未登录,登录后可以

和开发者交流问题的细节

关注并接收问题和回答的更新提醒

参与内容的编辑和改进,让解决方法与时俱进

请先登录

推荐问题


联系我
置顶