Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/firebase/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Clojure&;之间共享协议;ClojureScript_Clojure_Clojurescript - Fatal编程技术网

如何在Clojure&;之间共享协议;ClojureScript

如何在Clojure&;之间共享协议;ClojureScript,clojure,clojurescript,Clojure,Clojurescript,我在交叉命名空间中有一个协议: (ns xxx.shared.interfaces) (defprotocol ITimer (seconds [timer] "Return time in seconds since timer began")) 我有一个Clojure的实现: (ns xxx.time (:require [xxx.shared.interfaces :refer [ITimer]])) (defrecord Timer [start-nanos] ITim

我在交叉命名空间中有一个协议:

(ns xxx.shared.interfaces)

(defprotocol ITimer
  (seconds [timer] "Return time in seconds since timer began"))
我有一个Clojure的实现:

(ns xxx.time
  (:require [xxx.shared.interfaces :refer [ITimer]]))

(defrecord Timer [start-nanos]
  ITimer
  (seconds [timer] (double (/ (- (System/nanoTime) (:start-nanos timer))
                              1000000000))))
问题是,当我在某些Clojure代码中使用此代码时,需要使用
xxx.time
命名空间和
:refere:all
它抱怨找不到
seconds

Unable to resolve symbol: seconds in this context
首先,是否有可能以这种方式共享协议

第二,你知道我该怎么做吗

第三,这真的是进行这种代码共享的好方法吗?理想情况下,我也希望共享该记录,但它依赖于Java代码,因此我需要将其分解为一个函数。这样做会更好吗


谢谢

秒数
是在
xxx.shared.interfaces
中定义的,所以这就是您需要的
:需要
/
:使用
可以调用它:

(ns foo
  (:require [xxx.shared.interfaces :refer [seconds]]))

;; (seconds ...) will now work
为了详细说明,一个
defprotocol
表达式创建了一个保存协议的Var、JVM端的一个底层JVM接口(在ClojureScript端没有对应的接口)以及每个协议方法的一个Var。然后可以通过这些变量调用协议方法,就像调用任何其他Clojure函数一样


当您为记录/类型实现协议时,就像您在
xxx.time
命名空间中所做的那样,如果您实际上不调用这些方法,您甚至不需要引入这些变量(与提供实现不同)。类似地,需要调用协议方法但不太关心调用它们的特定对象类型的名称空间只需要引入协议定义名称空间并使用相关变量,而不需要
:需要任何实现名称空间。

至于代码共享问题,我要说的是,共享任何作为共享代码工作的东西都是好的,分解协议方法的特定于平台的实现无疑是使更多代码可共享的有效方法。这是否值得,可能取决于实际避免了多少重复。无论如何,如上所述,最初的问题与共享无关。