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)在 user/eval151 (REPL:1)。
别名s在用户命名空间中已存在,正在别称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之外的工具,也使用类似策略评估代码(见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)在user/eval1664(REPL:1)。
    别名bar在namespace user中已存在,别名foo

请注意,在Clojure 1.10.0+中,这里的堆栈顶部行未打印,因此您看不到“Namespace”(工具(namespace) README中的示例较旧)。说“别名bar(打算引用foo)在namespace user中已存在,别名foo”不会在理解或解决这个问题时提供任何额外的信息,对吗?
...