Clojure{Script} 协议命名
Clojure{Script} protocol naming
命名 Clojure 协议的惯用方式是什么?
IProtocol
或 Protocol
,或者它们呈现不同的用例,为什么?
到目前为止,我在处理互操作性时使用 IProtocol
(ClojureScript 中的 Java 或 js/google-closure)。
我也想知道方法名称的命名约定:
-my-method
对比 my-method
。我在野外看到过这两种情况(在 ClojureScript 代码库中),但无法想出一个理由来解释何时使用其中一种。
那么,在 Clojure 和 ClojureScript 中命名抽象的惯用方式是什么?
是的,这是允许 java
调用 clojure
代码的一种方式。
例如,如果您创建 lein new app testapp
(lein
是 leiningen
广泛使用的 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
.
中使用的协议和接口的命名约定
命名 Clojure 协议的惯用方式是什么?
IProtocol
或 Protocol
,或者它们呈现不同的用例,为什么?
到目前为止,我在处理互操作性时使用 IProtocol
(ClojureScript 中的 Java 或 js/google-closure)。
我也想知道方法名称的命名约定:
-my-method
对比 my-method
。我在野外看到过这两种情况(在 ClojureScript 代码库中),但无法想出一个理由来解释何时使用其中一种。
那么,在 Clojure 和 ClojureScript 中命名抽象的惯用方式是什么?
是的,这是允许 java
调用 clojure
代码的一种方式。
例如,如果您创建 lein new app testapp
(lein
是 leiningen
广泛使用的 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
.