命名Clojure协议的惯用方法是什么?
IProtocol
或Protocol
,或者他们提出了不同的用例,为什么?
到目前为止,我在处理互操作性时使用IProtocol
(ClojureScript中的Java或js / google-closure)。
我也想知道方法名称的命名约定:
-my-method
vs my-method
。我已经在野外看到了(在ClojureScript代码库中),并且无法提出解释何时使用其中一个的理由。
那么,在Clojure和ClojureScript中命名抽象的惯用方法是什么?
答案 0 :(得分:0)
是的,这是允许java
调用clojure
代码的方式。
例如,如果您创建lein new app testapp
(lein
是leiningen
广泛使用的clojure项目自动化工具的命令行界面),您可能会在core.clj中看到一行< / p>
(ns testapp.core
(:gen-class))
(defn -main
"Comment line"
[&args]
(println "Hello, World!"))
这里ns
是一个宏,可以更容易地定义命名空间和其他东西。
这里重要的是(:gen-class)
。让我们解开宏:
> (macroexpand-1 '(ns testapp.core (:gen-class)))
(do
....
(clojure.core/gen-class :name "testapp.core" :impl-ns testapp.core :main true)
....)
此代码将告诉编译器为名为&#34; testapp.core&#34;的类生成字节代码。这个类标记为&#34;:main true&#34;。此标记将在类中创建静态公共main
函数的声明,因此jvm
可以启动调用main
函数的程序。根据java语言约定,程序入口点应该被称为main
。您可以向gen-class
(请参阅文档)添加不同的方法来声明类型或参数并返回值,但是,正如我可以假设的那样,将java
静态类型的方法与{{1}分开是有用的。用于防止名称崩溃的函数。因此clojure
允许您定义用于命名java类实现的gen-class
。默认值为&#34; - &#34;。因此,您创建了一个函数:prefix
,并在-main
代码中看起来像java
。
我们可以改变它
testapp.core.main
当您将代码编译为jar并使用(ns testapp.core
(:gen-class :prefix my-prefix-))
运行时,您将获得
java -jar
好的,我们忘了重命名我们的实现:
Exception in thread "main" java.lang.UnsupportedOperationException:
testapp.core/my-prefix-main not defined
编译并运行:
(defn my-prefix-main [&args] (println "Hello, World!"))
P上。 S.我无法告诉您"Hello, World!"
中使用的协议和接口的命名约定。