2024年 Clojure 调查问卷中分享您的想法!

欢迎!有关如何使用本站的信息,请参阅关于页面。

0
core.logic
*摘要:* 存在一个模式 {{(definterface IFoo)}} 并且随后使用 {{IFoo}} 作为类型标记以进行高效的 {{(instance? IFoo x)}} 检查。此模式不具有平台无关性,可能会阻止在 CLJS 上(CLJS 不支持 {{definterface}} 根据 [ http://dev.clojure.org/jira/browse/CLJS-1190 ])提升对 core.logic 的支持。

*背景:*
我在调查将 core.logic 的一部分迁移到 CLJS(特别是:core.logic.fd)的可能性时,注意到了接口作为类型标记的使用。

问题是,CLJS 中没有 {{definterface}}(据我所知;尝试运行 {{(definterface IFoo)}} 在 CLJS repl 中失败,但在 CLJ repl 中运行成功)。

我已经开始尝试寻找一个平台无关的标记接口模式的替代方案,但在着手实际编码之前,我想知道是否有使用这种模式的具体原因。我还想知道是否已经有了替换这种模式的计划。

*补救措施:*
理想情况下,应该实现一个跨平台的实现方法。如果不能这样,可以定义一个适用于 CLJS 并以牺牲一些性能为代价的方法。

一种可能的变化是,将标记接口替换为标记协议,并将 {{instance?}} 的一次实例替换为 {{satisfies?}} 的一次实例。

以下在 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 报告)
...