What does the - (minus) symbol in front of function name within Clojure mean?
我无法理解以下内容。 在Clojure中定义主要功能(基于Leinigen生成的代码)时,在功能名称
我去了clojure.com上的原始文档,并发现了
给定以下代码...
1 2 3 4 5 6 7 8 9 | (defn -main "I don't do a whole lot ... yet." [& args] (println"Hello, World!")) (defn main "I don't do a whole lot ... yet." [& args] (println"Hello, World!")) |
我得到以下输出...
1 2 3 4 5 6 7 8 9 10 11 12 13 | (main) Hello, World! => nil (-main) Hello, World! => nil Loading src/clojure_example/core.clj... done (main) Hello, World! => nil (-main) Hello, World! => nil |
我没有发现任何区别。 两种功能的输出相同。 任何帮助表示赞赏!
首先,放在一边。
关于宏
1 | (defn ^:private foo [args] ...) |
但是,这仅是向用户提示不应使用这些功能。测试等可以轻松解决此弱的"私有"限制。由于麻烦,我从不使用所谓的"私有"函数(有时我会使用元数据
Clojure程序中的"主要"功能
在Java中,总是通过在所选类中调用" main"函数来启动程序
1 2 3 4 5 | class Foo public static void main( String[] args ) { ... } } |
然后
1 2 | > javac Foo.java ; compile class Foo > java Foo ; run at entrypoint Foo.main() |
Clojure选择命名初始函数
您可以在
使用Clojure Deps和CLI工具,名称
如果使用的是Leiningen,它会更加灵活,并允许其覆盖程序的
在Leiningen项目中,如下所示的条目指示您键入
1 2 | ; assumes a `-main` function exists in the namespace `demo.core` :main ^:skip-aot demo.core |
所以在这样的程序中:
1 2 3 4 5 6 7 8 9 10 11 | (ns demo.core ) (defn foo [& args] (newline) (println"*** Running in foo program ***") (newline)) (defn -main [& args] (newline) (println"*** Running in main program ***") (newline)) |
我们得到正常的行为:
1 2 3 | ~/expr/demo > lein run *** Running in main program *** |
但是,我们可以用另一种方式调用程序:
1 2 3 | > lein run -m demo.core/foo *** Running in foo program *** |
使
1 | :main ^:skip-aot demo.core/foo |
并得到行为:
1 2 3 | ~/expr/demo > lein run *** Running in foo program *** |
因此,默认情况下,具有名为
请记住,每个名称空间都可以有自己的
最后,
所有clojure函数都是"静态的"(下面的题述)。在函数名称中放置-作为第一个字符不会对函数的行为产生任何影响。使用
现在我考虑的不是真正的"按惯例"。由于无法使用标准工具进行配置。这是clojure.main将寻找的唯一名称。
https://clojure.org/reference/repl_and_main
实际上,所有clojure函数都是Java对象AFunction的实例,带有实例方法