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

示例?建议的更改?

期望的示例消息

`Alias __ (打算引用 __) 已在命名空间 __ 中存在,别名化 __`

其中 `(打算引用 __)` 是新部分。

建议的更改

将此 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
所以,这才是您最初的问题,实际上是问题,而不是深植于实现中的建议解决方案。

Eastwood导致问题的脉冲序列是什么?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 及以上版本中,不会显示堆栈顶部的行,因此您看不见 "Namespace"(tools.namespace 中的示例早已是旧版本)。说 "别名 bar(本应引用 foo)已经在用户命名空间中存在,别名 foo" 对于理解或解决问题并没有提供更多的信息,对吧?
...