Clojure{Script} 协议命名

Clojure{Script} protocol naming

命名 Clojure 协议的惯用方式是什么? IProtocolProtocol,或者它们呈现不同的用例,为什么?

到目前为止,我在处理互操作性时使用 IProtocol(ClojureScript 中的 Java 或 js/google-closure)。

我也想知道方法名称的命名约定: -my-method 对比 my-method。我在野外看到过这两种情况(在 ClojureScript 代码库中),但无法想出一个理由来解释何时使用其中一种。

那么,在 Clojure 和 ClojureScript 中命名抽象的惯用方式是什么?

是的,这是允许 java 调用 clojure 代码的一种方式。

例如,如果您创建 lein new app testappleinleiningen 广泛使用的 clojure 项目自动化工具的命令行界面),您可能会在 core.clj一行

(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)
  ....)

此代码将告诉编译器为名为 "testapp.core" 的 class 生成字节码,并且此 class 标记为“:main true”。这个标记会在class中创建一个静态publicmain函数的声明,所以jvm可以启动一个调用main函数的程序。根据 java 语言约定,程序入口点应称为 main。您可以向 gen-class 添加不同的方法(请参阅文档)声明类型或参数和 return 值,但是,正如我所假设的那样,将 java 静态类型的方法与您的方法分开可能很有用clojure 防止名称崩溃的功能。所以 gen-class 允许你定义一个 :prefix 来命名你的 java class 实现。默认为“-”。所以你创建了一个函数 -main 并且在 java 代码中它看起来像 testapp.core.main.

我们可以改变它

(ns testapp.core
  (:gen-class :prefix my-prefix-))

当您将代码编译为 jar 并使用 java -jar 运行 时,您会得到

Exception in thread "main" java.lang.UnsupportedOperationException:
testapp.core/my-prefix-main not defined

好的,我们忘了重命名我们的实现:

(defn my-prefix-main [&args] (println "Hello, World!"))

编译并运行:

"Hello, World!"

P。 S. 我不能告诉你关于 clojure.

中使用的协议和接口的命名约定