2024年Clojure现状调查!中分享你的想法。

欢迎!请查看关于页面获取更多关于这个平台的信息。

0 投票
Clojure

最近,我在我所在公司的项目中发现了一个bug。

基本上,发生的情况是在测试的命名空间内部,我们引入了两个不同的命名空间,我们在这里称它们分别为first-ns和second-ns。

first-ns和second-ns都定义了一个同名spec,例如:

(ns first-ns)
(s/def :same/name
    int?)

(ns second-ns)
(s/def :same/name
    string?)

我的问题是,是否存在一种方式让Clojure编译器针对这种情况发出关于名称冲突的警告?在包含数百个spec的大型代码库中,这种情况偶尔会发生,并可能导致希格斯幽灵(Heisenbug)。唯一的解决方案是将spec的命名空间设置为其定义文件的相同ns吗?

1 答案

0 投票

选择
 
最佳答案

Specs有意设置为可在注册表中重写,因为你在REPL中经常这样做。

不过,在这种情况下发出警告可能是有用的,或者有类似于*warn-on-spec-replace*的设置来执行此操作。


编辑了
编辑:不好意思,我发现测试文件的末尾有个注释块。

谢谢,Alex!

很抱歉打扰你,但我对尝试实现 *warn-on-spec-replace* 感兴趣,但我找不到在 clojure.spec.alpha 中执行测试的方法,因此无法测试我的实现。

你能告诉我如何在那个项目中运行测试吗?
所有的 contrib 项目都是使用 Maven 构建的,你应该可以使用 `mvn clean test` 运行测试,使用 `mvn clean package` 打包 jar 文件,或者使用 `mvn install` 安装本地快照。

顺便说一下,我们可能不会再发布更多版本的 clojure.spec.alpha,因为我们正在为 clojure.spec-alpha2 仓库中的下一个版本做 spec 的开发。不过,这两个中的变更可能是相似的。
谢谢你,Alex!我在这里提交了一个与此相关的问题:[https://clojure.atlassian.net/projects/CLJ/issues/CLJ-2578](https://clojure.atlassian.net/projects/CLJ/issues/CLJ-2578)
...