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

欢迎!请参阅关于页面了解更多此工作的信息。

0
ClojureScript
修改标签

在ClojureScript 1.10.844之前,我可以通过以下方式可靠地判断符号sym(在宏展开时间)是否指的是一个协议:

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

CLJS-3276提交起,这在我的代码中不再起作用。据我所知,defprotocol仍然附加此数据,并且cljs.core 仍然内部使用这种方法。有没有更好的或者受支持的检测一个符号是否指向协议的方法?我非常希望能够重新引入此行为,或者有其他可靠的检测方法。

1 答案

0

我很好奇你为什么需要问这个问题?

此用例的目的是在某个我们编写的工具被误用时抛出编译时错误(基本上,“您只能注册协议!”)。

该工具的API与transit的序列化和反序列化处理程序的声明式结构的API非常相似,但它是基于协议而不是原始类型/记录构建的。

由于在CLJS中协议没有被实现,而`satisfies?`是一个宏,当提供非协议时,它会愉快地默默回答荒谬的问题并返回`false`,因此一个合理的编译时错误,可以保护开发者免犯错误,非常有用。

如果你有问题,请指出。

编辑
如果你指的为什么这甚至是问题,我认为是因为我不清楚`:protocol-symbol`是一个实现细节还是支持API的组成部分。如果是前者,我想知道是否还有其他机制作为分析器API的一部分得到支持。
...