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)
执行错误(InvalidStateException)在user/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
这对于直接、细粒度用户交互来说(somewhat)很清楚。我说“somewhat”,因为人们不一定知道clojure.lang.Namespace对象是什么,或者同一个文件可能存在两个这样的对象。

并不总是如此:Eastwood 等工具会在指定项目的顶级形式上执行 `eval` 操作(这种方式较不直接,粒度较粗糙)。

因此,可能会遇到这种错误,让人疑惑问题是否是由于加载代码的顺序不正确引起的,或者是 Eastwood 实际上放大了别名。

因此,这些问题调试受到那些不完整的错误信息的真正阻碍。
by
所以,你的原始问题应该是实际的物理问题,而不是实施方案中的提议解决方案。

Eastwood 引起问题的过程事件序列是什么?Eastwood 能避免或检测这种情况吗?
by
我理解你的意图,但与此同时,这是一种并不罕见要获得错误。相对而言,在某段时间内遇到它,看到人们询问它,等等,是很常见的。

Eastwood 之外的其他工具也使用类似策略 eval 代码(请见 https://github.com/clojure-emacs/refactor-nrepl/tree/71e057c413933e25f2ae5921f6aad4a262ae90ce "launch-missiles" 警告),因此,一个人的工具栈中的工具越多,就越容易遇到这些错误,并且拥有完整的调试信息就越有用,可以让人觉察到错误的假设。

顺便一提,我可以深入 Eastwood 获得修复(暂时作为内部分支):https://github.com/nedap/eastwood .

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

在这个时候,您还没有详细描述一个可重复的、可以复制实际问题的场景。没有这个,我们无法考虑其他可能的解决方案或测试并验证特定的更改是否解决了问题。您声称这个问题既常见又经常被报道。如果是这样,应该很容易指出其中一个讨论或描述场景,这正是我所需要的。

我尝试使用 tools.namespace 工具来重现这种类型的错误,但唯一成功的方法是在 repl 中使用 require,且在不改变这条消息的情况下并没有获得任何额外的信息。

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

请注意,在 Clojure 1.10.0+ 中,这里没有打印栈顶行,所以您看不到“命名空间”(在 tools.namespace 读取器中给出的示例更旧)。说“别名 bar (打算引用 foo) 在用户命名空间中已经存在,正在代理 foo”既不能提供额外的理解信息,也不能帮助解决该问题,对吗?
...