请分享您的想法,参加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问题确实受到了阻碍。
by
所以,这应该是你最初的问题,实际的问题,而不是实现中深层次的解决方案。

东木导致问题的具体事件序列是什么?东木能避免或检测这种场景吗?
by
我理解你的意图,但同时,这也是一个非常常见的错误。在某个时刻遇到它,看到人们询问它等,是非常常见的。

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

FYI,我可以深入研究Eastwood并找到一个修复方案(现在仅作为一个内部的分支):https://github.com/nedap/eastwood .

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

到目前为止,您还没有描述一个详细、可重现的场景来复制实际问题。没有这个,我们无法a)考虑其他可能的解决方案或b)测试和验证特定更改是否解决了问题。您声称这个问题是普遍的并且经常被报道。如果是这样,应该很容易指出这些讨论之一或描述该场景,这是我所需要的。

我尝试使用tools.namespace工具来重现这类错误,但到达那里的唯一方法是使用repl中的require,更改此消息并不会给我提供任何额外信息

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

请注意,在Clojure 1.10.0+中,堆栈顶部的第一行没有在此处打印,因此您看不到“命名空间”(tools.namespace的readme中的示例更旧)。说“别名bar(旨在指代foo)已在命名空间user中存在,别名化foo”在理解或解决问题的过程中并没有提供任何额外信息,对吧?
...