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的行为(它可以在传递null参数时输出无效的类型名称),因此我更喜欢这个修复,而不仅仅是对症下药的generate-interface修复。

0

评论者:jafingerhut

内森,你打算提交 signed Clojure Contributor's Agreement 吗,或者已经提交了?如果还没有,详细信息在这里:https://clojure.org/contributing

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

注意:我不能保证你的补丁会在 Clojure 中被接受,如果你签署了 CA,我只能保证如果没有签署则不会被接受。

0

评论者:alexmiller

请添加一个如何发生和当前错误的示例。

0
评论者:nathan7

艾德尼——我已经阅读了相关内容。我的 CA 将很快开始送往 Rich。(填写完毕,已签名,已经在信封里,只需等待那些该死的国际邮票的到来...

亚历克斯·米勒——哎!

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

由:nathan7

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

0

由:nathan7

哎呀,由于我对情况的理解错误,我的两个补丁都相当有问题。
我完全忘记了asm-type需要一个符号,而不是一个字符串。
修改asm-type肯定是个坏主意,那个检查只是看是否应该推迟到prim- outils。
向prim-Tool添加nil是可行的(我也附上了我的补丁),但与只需要修补gen-interface相比,这似乎相当不优雅。
(顺便说一句:我在探索Clojure代码库中玩得非常开心!谢谢了,人们!)

0

评论者:alexmiller

我阅读 gen-interface 的文档字符串时认为,方法声明必须指定参数列表和有效的返回类型。我预计所有这些都将无效

(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" 作为返回类型,那么我认为答案是 No。如果工单是请求改进上述失败情况的错误报告,我认为我们可以考虑,但它的优先级将非常低。

0

由:nathan7

代码似乎表明的是相反的,因为有针对 pclass 被设置为 nil 的明确额外分支。
尽管我喜欢 PL 幽默,但我还没有在 Clojure 的其他地方遇到过 void,而且在这里看到它让我感到惊讶。
维护最小惊奇原则似乎比是否 nil 是一个类型教条更可取

0

评论者:alexmiller

要查找依赖的词语,有两个地方要查看:文档字符串和 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
by

评论者: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 []]])
宏展开gen-interface时出现意外错误(ClassFormatError)(REPL:1:1)。
类名在类文件clj1419/IFail的描述器中含有非法字符。

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

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