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

欢迎!请在关于页面了解如何使用本站的一些更多信息。

+2
错误

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

这阻碍了问题的调试,特别是当.addAlias调用不是由有意的别名操作发起,而是由于重新评估一个命名空间(这是东wood等工具采用的AST构建策略)时。

你考虑过改善这个消息吗?

1 个回答

+1

示例?修改建议?

期望的消息示例

`在命名空间 __ 中已存在别名 __ (旨在指代 __),别名为 __`

其中 `(旨在指代 __)` 是新部分。

修改建议

在这个Java方法中将`ns`参数作为消息的一部分使用。

其实用性在于它可以区分两种情况:

* 预期的别名仅与现有不同名称的条目重叠
* 正在对两个表示同一命名空间但内容不等的java.lang.Namespace对象进行比较(由于不正确的代码重新加载(代码重新加载问题,`eval`问题)
我假设这是一个第一种情况的一个例子

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设置别名

对我来说,这已经很明确了,我觉得提到尝试别名的命名空间也无助于解决问题。你能解释一下如何进入第二种情况吗?
你给出的例子正确地描述了我所说的“与现有不同名称的条目重叠”。

至于另一种情况,反映在https://github.com/clojure/tools.namespace/tree/e5a9a2abc5360cef57d6f97908b1ec9d5322597a#warnings-for-aliases中,其中有两个我叫“com.example.foo”的clojure.lang.Namespace对象相互竞争。
在那个例子中问题也很明显。
对于用户操作直接且细致的情况,这是(多少有点)明确的。我说“多少有点”,因为人们不一定知道clojure.lang.Namespace对象是什么,或者同一文件可能有两个这样的对象。

这并不总是这种情况:Eastwood之类的工具会在项目的顶级形式上执行`eval`(不那么直接,粒度也粗略)。

因此可能会出现此错误,并且会让你怀疑问题是由代码加载顺序不正确引起的,或者Eastwood实际上是否在放置重叠的定义别名。

因此,由于这些不完整的错误信息,调试Eastwood问题受到了 legitimate 的阻碍。
by
因此,这应该是你的原始问题,实际的问题,而不是一个在实现深处提出的解决方案。

东wood引发问题的顺序是什么?Eastwood能够避免或检测此情况吗?
by
我明白你的意图,但同时,这是一个相当常见的错误,但是它并不罕见。在某个时候,看到人们对它进行询问等情况都是相对常见的。

除了Eastwood之外的其他工具也使用类似的策略评估代码(参见https://github.com/clojure-emacs/refactor-nrepl/tree/71e057c413933e25f2ae5921f6aad4a262ae90ce "launch-missiles"警告),因此,一个人栈中的工具越多,就越容易获得这些错误,同时拥有完整的调试信息就越有用,这样可以让一个人抛弃错误的假设。

就我的观点而言,我可以深入研究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在用户命名空间中已经存在,正在别名foo

注意,在Clojure 1.10.0+中,堆栈跟踪的顶部行在这里不会被打印出来,所以您看不到“命名空间”(tools.namespace README中的示例更老)。说“别名bar(意图指代foo)在用户命名空间中已经存在,正在别名foo”在理解或处理这个问题上并没有提供额外的信息,对吧?
...