使Clojure类可以通过main方法和脚本

时间:2016-02-09 22:49:14

标签: clojure

我想创建可以通过main方法和脚本运行的Clojure类。在这两种情况下我都不需要命令行参数。目前,我有这样的事情:

(ns my-namespace.core
  (:gen-class))

(defn -main
  [& args]
  (println "Hi"))

; I'd like to have something like (when (in-script?) (-main))
(-main)

在这种形式下,它可以作为脚本运行,但作为一个类运行它会两次显示Hi,这并不奇怪。

我希望找到一些方法来区分类似于Python的成语if __name__ == "__main__":。但我只发现旧discussion提到这一点。不幸的是,那里描述的*command-line-args*方法似乎没有用。无论是作为类还是作为脚本运行,我都有nil

那么有没有办法在运行时找出Clojure文件是作为脚本运行还是通过main方法运行?

2 个答案:

答案 0 :(得分:2)

我建议只创建一个只调用core/-main

的script.clj ns

答案 1 :(得分:1)

简短的回答是否定的。

Clojure只有一种编译和运行代码的方法。如果从REPL运行程序或者在没有连接REPL的情况下运行它,程序的加载方式没有区别。 Clojure严格来说是一种编译语言虽然你可以在从REPL开始时选择从main以外的函数开始,或者如果你希望它可以传递main不同的参数不同。

我的主要工作项目中有一个名为dev的函数,我在这些情况下运行(dev比main短)。当主要启动时,也可以检查程序中是否存在nrepl连接,尽管这远离正常的Clojure实践。

作为深思熟虑的东西,考虑到你可以在程序运行两天之后将REPL轻松连接到程序,而不是在主程序启动之前连接REPL。