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的一部分被支持的。
...