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`问题)
by
我认为这是一个第一类情况的例子

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

对我来说这似乎很清楚,我不确定提及尝试的别名命名空间会有所帮助。你能解释一下你如何陷入第二种情况吗?
by
您的大纲正确地描述了我所说的"[...]与现有不同名称的条目重叠"。

至于其他情况,可以在https://github.com/clojure/tools.namespace/tree/e5a9a2abc5360cef57d6f97908b1ec9d5322597a#warnings-for-aliases 中看到,其中有两个竞争的"com.example.foo" clojure.lang.Namespace对象。
by
在那个情况下,问题似乎也很明确。
by
这是(某种程度上)明确的,因为这是直接、细粒度的用户交互。我说“某种程度上”,因为人们不一定知道clojure.lang.Namespace对象是什么,或者同一天可能会存在两个相同的文件。

并不总是如此:像Eastwood这样的工具会在给定项目的顶级形式上执行`eval`操作(不如直接、不如细致)。

因此,可能会遇到这个错误,这让人们开始怀疑错误是由于加载代码顺序不正确导致的,还是Eastwood实际上放置了重叠的别名。

因此,调试Eastwood的问题确实受到了这些不完整错误信息的阻碍。
所以,这应该是你的原始问题,真正的问题,而不是实现深处的提议解决方案。

Eastwood引起这个问题的原因顺序是什么?Eastwood能避免或检测这个场景吗?
我理解你的指示意图,但与此同时,这是一个并不罕见的问题。这种情况相对常见,人们会询问它,等等。

除了Eastwood之外的工具也使用类似策略的eval代码(见https://github.com/clojure-emacs/refactor-nrepl/tree/71e057c413933e25f2ae5921f6aad4a262ae90ce "launch-missiles" 警告),所以一个人的工具栈中的工具越多,就越容易遇到这些错误,而且拥有完整的调试信息就越有用,这样可以帮助人们摒弃错误的假设。

供参考,我可以在Eastwood中深入挖掘并找到一个修复方法(目前只是内部分支):https://github.com/nedap/eastwood

所以,这个ask.clojure.org请求并不是为了获得我已经拥有的特定工具的修复方法;它是要求在调试类似问题(在某个不同的时间或由不同的人)时避免类似的痛苦。
如果这让你感觉我固执己见,但我在尝试有条理地解决问题(“这是发生的,这是我所缺少的必要信息”)而不是从一个解决方案(“只需更改一些代码”)开始,以确保我们是在做正确的事情。

截至目前,您尚未描述一个详细、可重复的场景来重现实际的问题。没有这一点,我们无法进行以下操作:a) 考虑其他可能的解决方案或b) 测试和验证某个特定更改是否解决了问题。您声称这个问题既常见又被广泛报道。如果是这样,应该很容易指向这些讨论之一或描述场景,这正是我所寻求的。

我曾尝试使用tools.namespace工具来重现这种错误,唯一的方法是在REPL中使用require,重新改变这一信息并不会给我带来更多额外的信息。

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

请注意,在Clojure 1.10.0及以后的版本中,堆栈跟踪的顶部行不会在这里打印出来,因此您看不到“命名空间”(tools.namespace的README.txt中的示例较老)。说“别名bar(本应指代foo)在user命名空间中已存在,正在别名foo”在理解或解决问题时并没有提供更多信息,对吗?
...