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

欢迎!请参阅关于页面以获取更多关于如何使用本站的信息。

0
错误

以下是不合法的,当在gen-class或gen-interface上调用时应产生错误

(gen-interface :name clj1419.IFail :methods [[myMethod java.lang.String]]) ;; 没有参数,抛出错误 (gen-interface :name clj1419.IFail :methods [[myMethod []]]) ;; 没有返回类型 (gen-interface :name clj1419.IFail :methods [[myMethod]]) ;; 没有参数或返回类型

第一个示例会抛出错误。第二个和第三个示例不抛出错误,但会生成无效的类,请使用以下命令验证

(.getMethods clj1419.IFail) ClassNotFoundException java.lang. java.net.URLClassLoader$1.run (URLClassLoader.java:366)

添加检查以防止这些错误。

14 个回答

0

评论由:nathan7发表的

我已经实施了两项修复,并将它们作为补丁附件提供。

0

评论由:nathan7发表的

我认为这里的问题是asm-type的行为(它将nil参数传递时可以输出一个无效的类型名),因此我更喜欢这个修复方案,而不是纯粹针对symptomatic generate-interface的修复。

0

评论由:jafingerhut发表的

内森,你计划提交签名的Clojure贡献者协议,还是已经有了?如果您还没有,请在此处提供详细信息: https://clojure.org/contributing

非贡献者的补丁不能被提交到Clojure。

注:我不能保证您签了CA后其中任何补丁会被接受到Clojure,只保证不签CA的话就不会被接受。

0

评论者:alexmiller

请添加一个示例,说明这种情况以及当前的错误。

0
_评论者:nathan7_

Andy — 是的,我已阅读了相关内容。我的CA即将寄给Rich。(已填写,已签署,放在信封里,只需等待那些该死的国际邮票的到来…)

Alex Miller — 哎呀!

问题的演示,包括附件和gist: https://gist.github.com/nathan7/3a7e3a09e458f1354cbb
0

评论由:nathan7发表的

以下是编译器崩溃的日志(也已添加到gist中)

0

评论由:nathan7发表的

啊呀,我的两个补丁都出问题了,因为我对情况有误解。
我完全忘记了asm-type需要一个符号,而不是一个字符串。
修改asm-type肯定是个坏主意,那个检查只是看它是否应该延迟到prim->class。
将nil添加到prim->class将有效(我已附上我的补丁),但与修复gen-interface相比,它显得不那么优雅。
(顺便说一句:我正在享受探索Clojure代码库的乐趣!谢谢大家!)

0

评论者:alexmiller

我对gen-interface的docstring的理解是,方法声明必须指定参数列表和有效的返回类型。我预期这些都将无效。

(gen-interface :name clj1419.IFail :methods [[fail nil]]) (gen-interface :name clj1419.IFail :methods [[fail [] nil]]) (gen-interface :name clj1419.IFail :methods [[fail []]])

"nil"不是一个有效的类型 - 您可以使用"void"来完成这个任务,并且它运行良好

(gen-interface :name clj1419.IFail :methods [[fail [] void]])

如果这个工单(如标题所述)是一项允许省略返回类型或使用"nil"作为返回类型的请求,那么我认为答案是_negative。如果这个工单是一个改善上述失败案例的错误报告的请求,那么我认为我们可以考虑,但它的优先级非常低。

0

评论由:nathan7发表的

代码似乎暗示了不同的结果,因为

在pclasses中有一个明确的额外分支为nil。


尽管我喜欢PL trivia,但我还没有在其他任何地方遇到void,在这里看到它我很惊讶。
维持最小惊讶原则似乎比关于nil是否是类型的问题来得更恰当:(= "nil" (str (type (.methodReturningVoid obj))))

0

评论者:alexmiller

查找依赖词的两个地方是docstrings和https://clojure.org/documentation页面。实现细节只是这样的。

"nil"不是一个类型。"void"是一个文档化的类型标识符,表示没有返回值 - https://clojure.org/java_interop#Java Interop-Aliases

0

评论由:nathan7发表的

那么,在asm-type中进行更好的错误检查如何?

0

评论者:alexmiller

我已经根据我对这个工单应该是什么的理解更新了标题和描述,即增强gen-class和gen-interface的方法规范的错误检查。我不确定这是否在asm-type中或是在更早的阶段。

0

评论者:alexmiller

至 1.10 版本,这些都现在会引发错误

`
user=> (gen-interface :name clj1419.IFail :methods [[myMethod java.lang.String]])
在 (REPL:1:1) 处展开 gen-interface 时出现语法错误。
不知道如何从 clojure.lang.Symbol 创建 ISeq。

user=> (gen-interface :name clj1419.IFail :methods [[myMethod []]])
在 (REPL:1:1) 处展开 gen-interface 时发生意外错误 (ClassFormatError)。
类名称在类文件 clj1419/IFail 的描述符中包含非法字符

user=> (gen-interface :name clj1419.IFail :methods [[myMethod]])
在 (REPL:1:1) 处展开 gen-interface 时发生意外错误 (ClassFormatError)。
类名称在类文件 clj1419/IFail 的描述符中包含非法字符
`

0
参考: https://clojure.atlassian.net/browse/CLJ-1419 (由 nathan7 报告)
...