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的behavior造成了这个问题(当传nil参数时,它可能输出无效的类型名),因此我更喜欢这个修复,而不是仅仅是症状性的generate-interface修复。

0

评论者:jafingerhut

内森,你打算提交签名版的Clojure贡献者协议还是已经提交了?如果你还没有,请在此处查看详情:https://clojure.org/contributing

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

注意:我不能保证如果你的补丁签署了CA会被接受进入Clojure,但如果你没有签署,则一定不会被接受。

0

评论者:alexmiller

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

0
评论者:nathan7

安德鲁——我已经了解过这些。我的CA即将寄给理查德。 (填写完毕,已签名,已放入信封,只需等待那些该死的国际邮票的到来……)

亚历克斯·米勒——太好了!

问题演示,包括附件和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的文档字符串的理解,方法声明必须指定参数列表和有效的返回类型。我预计所有这些都将无效

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

0

评论者:nathan7

然而,代码似乎暗示了这一点,因为看到为pclasses明确的额外分支为nil。
尽管我喜欢PL trivia,但我还没有在其他地方的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的method specs的错误检查进行了增强。我不确定这是否在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报告)
...