*摘要:* 存在一个模式,即使用{{(definterface IFoo)}},然后使用{{IFoo}}作为一个类型标记进行有效的{{(instance? IFoo x)}}检查。这种模式不是平台无关的,并且可能会阻碍在CLJS上改进对core.logic的支持(CLJS不支持{{definterface}},详见[
http://dev.clojure.org/jira/browse/CLJS-1190])。
*背景:*
我正在研究将core.logic的部分内容移植到CLJS(特别是:core.logic.fd)的可能性,并注意到作为类型标记使用接口。
问题在于CLJS中没有{{definterface}}(据我所知;在CLJS repl中尝试执行{{(definterface IFoo)}}会失败,但可以在CLJ repl中工作)。
我开始寻找标记接口模式的一个平台无关的替代方案,但在实际编码之前,我想了解是否有具体的原因使用这种模式。我还想知道是否已经制定了替换此模式的计划。
*补救措施:*
理想情况下,可以实施一种跨平台方法来达到这个目的。如果不能,那么可以定义一种用于CLJS的备选方法,这可能会牺牲一些性能。
可能的更改是用标记协议替换标记接口,并用{{satisfies?}}替换{{instance?}}。
以下在Clojure中似乎是等效的
{{; 接口}}
{{(definterface IFoo)}}
{{(definterface IBar)}}
{{(deftype T [] IFoo)}}
{{(instance? IFoo (T.)) ; true}}
{{(instance? IBar (T.)) ; false}}
{{; 协议}}
{{(defprotocol IFoo)}}
{{(defprotocol IBar)}}
{{(deftype T [] IFoo)}}
{{(satisfies? IFoo (T.)) ; true}}
{{(satisfies? IBar (T.)) ; false}}
然而,协议版本也适用于ClojureScript。