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

欢迎!请查看 关于 页面以获取更多关于这个站点如何工作的信息。

+2
错误

https://github.com/clojure/clojure/blob/653b8465845a78ef7543e0a250078eea2d56b659/src/jvm/clojure/lang/Namespace.java#L224-L225,异常信息中未包含 ns 参数。

这阻碍了调试能力,尤其是在 .addAlias 调用不是由有意的别名引入,而是由于重新评估一个命名空间(这是工具如 https://github.com/jonase/eastwood 所使用的 AST 构建策略)。

您考虑过改进错误消息吗?

1 个答案

+1

示例?建议的更改?

期望的错误信息示例

`别名 __ (打算引用 __) 在命名空间 __ 中已存在,别名 __`

其中 `(打算引用 __)` 是新增的部分。

建议的修改

在此 Java 方法的 `ns` 参数部分使用消息。

其实际作用是可以帮助区分两种情况

* 打算的别名与已存在的不同名称的条目发生了重叠
* 比较的是两个 java.lang.Namespace 对象,代表相同的命名空间但不相等(`.equals` 比较),这是因为不正确的代码重新加载(代码重新加载问题,`eval` 问题)
我认为这是一个第一类情况的例子

user=> (require 'clojure.set)
nil
user=> (require 'clojure.string)
nil
user=> (alias 's 'clojure.set)
nil
user=> (alias 's 'clojure.string)
执行错误(IllegalStateException)在用户/eval151(REPL:1)。
别名 s 在命名空间 user 中已存在,别名 clojure.set

对我来说这已经很明白了,我不确定提及尝试别名的命名空间是否有帮助。你能解释一下您如何进入第二种情况吗?
你的例子正确描述了我所说的 "[...] 与已存在的不同名称的条目重叠"。

至于第二种情况,它反映在 https://github.com/clojure/tools.namespace/tree/e5a9a2abc5360cef57d6f97908b1ec9d5322597a#warnings-for-aliases 中,那里有两个相互竞争的 "com.example.foo" clojure.lang.Namespace 对象。
在这种情况下,问题似乎也很清楚。








Eastwood导致问题的具体事件序列是什么?Eastwood可以避免或者检测这种情况吗?






by
如果不是坚持己见,我的目的是尝试有逻辑地工作解决这个问题(“发生了这样的事情,但我缺少这些必要的信息”)而不是从解决方案开始(“只改变一些代码”)来确保我们正在做正确的事情。

截至目前,您还没有描述一个详细、可复现的情景来重现实际问题。没有这些,我们没有任何方式去考虑其他可能的解决方案或测试和验证特定的更改是否解决了问题。你声称这个问题很普遍,且经常被报道。如果是这样,应该很容易指出一篇这样的讨论或在描述情景中提到它,这就是我所需要的。

我试图用tools.namespace工具重复这种类型的错误,唯一的方法是在REPL中使用require,而改变这条消息不会提供任何额外的信息。

  user=> (require '[foo :as bar])
  执行错误(IllegalStateException)在用户/eval1664(REPL:1)。
  别名bar在用户命名空间中已存在,别名为foo

注意在Clojure 1.10.0+中,堆栈的第一行不会打印出来,因此您看不到“命名空间”(工具命名空间readme中的示例较旧)。说“别名bar(指代foo)在用户命名空间中已存在,别名为foo”在理解或解决问题时没有提供任何额外的信息,对吧?
...