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

欢迎!有关这部分是如何工作的更多信息,请参阅关于页面。

0
ClojureScript
重标记

在 Clojurescript 1.10.844 及之前,我可以通过检查以下内容来可靠地判断符号 sym(在宏展开时)是否指代协议:

(:protocol-symbol (cljs.analyzer.api/resolve &env sym))

CLJS-3276 提交以来,这种方法在我代码中不再有效。据我所知,defprotocol 仍然附加了这个数据,而 cljs.core 也是如此内部使用这种方法。是否有更好的/支持的检测符号是否引用协议的方法?我非常希望这种行为会被重新引入,否则希望有其他可靠的方法。

1 答案

0

我想知道你为什么提出这个问题?

by
用例是在我们的特定工具被误用时抛出编译错误(基本上,“只可以注册协议!”)。

该工具的API与transit的声明性结构中的序列化和反序列化处理程序的API非常相似,但它是根据协议构建的,而不是直接类型或记录。

由于在CLJS中协议没有得到实现,并且`satisfies?`是一个宏观,它在接收到非协议时可以欣然无声地用`false`回答无聊的问题,因此为了防止程序员错误而有一个合理的编译时错误非常有用。

如果你有其他意思,请见谅。
by
编辑了 by
如果你指的是为什么它甚至是一个问题,我想是因为我不太清楚`:protocol-symbol`是否是实现细节还是支持API的一部分。如果是前者,我想了解一下是否有其他机制作为分析器API的一部分得到支持。
...