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

欢迎!请查看关于页面以获取更多的使用信息。

+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 __ ( intends to refer to __ ) already exists in namespace __, aliasing __`

其中`(intends to refer to __)`是新的部分。

建议的更改

将此Java方法的`ns`参数作为消息的一部分使用。

其实际用途是它可以区分两种情况

预期的别名简单重叠了现有的、名称不同的条目
正在进行两个java.lang.Namespace对象的比较,这两个对象代表的是同一命名空间,但在equals比较中并不相等(因为代码重新加载错误导致的,代码重新加载问题,eval问题)
我推测这可能是第一种情况的一个例子

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已在用户命名空间中存在,正在别名化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问题确实受到了阻碍。
所以,这应该是你最初的问题,实际的问题,而不是一个在实现深处提出的解决方案。

Eastwood导致问题的顺序事件是什么?Eastwood能否避免或探测这个场景?
我理解你指示的意图,但与此同时,这是一个非常常见的错误。它在某个时刻相对常见,人们会询问它,等等。

除了Eastwood之外的工具也采用类似策略进行代码的`eval`操作(见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 已在 user 命名空间中存在,正在别名 foo

请注意,在 Clojure 1.10.0+ 中,堆栈跟踪的第一行不会在此处打印,因此您看不到 "Namespace" 字样(tools.namespace readme 文档中的示例更旧)。说 "别名 bar(意指 foo)已在 user 命名空间中存在,别名 foo" 并没有提供额外的信息,对于理解或解决问题有帮助吗?
...