Clojure {Script}协议命名

时间:2015-08-30 15:58:28

标签: clojure protocols naming clojurescript

命名Clojure协议的惯用方法是什么? IProtocolProtocol,或者他们提出了不同的用例,为什么?

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

我也想知道方法名称的命名约定: -my-method vs my-method。我已经在野外看到了(在ClojureScript代码库中),并且无法提出解释何时使用其中一个的理由。

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

1 个答案:

答案 0 :(得分:0)

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

例如,如果您创建lein new app testappleinleiningen广泛使用的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!" 中使用的协议和接口的命名约定。