2024 Clojure状态调查!中分享您的想法。

欢迎!请参阅关于页面以获取更多有关如何使用此功能的信息。

0
core.logic
*摘要:* 存在一个模式,即使用{{(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。

1 答案

0
参考资料: https://clojure.atlassian.net/browse/LOGIC-170(由alex+import报告)
...