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参数时输出无效的类型名称),因此我更倾向于这个修复而非仅仅对症下药的generate-interface修复。

0

评论由:jafingerhut发表

纳森,你打算提交一份签署的Clojure贡献者协议,还是已经提交了?如果没有,请在此处提供详细信息:https://clojure.org/contributing

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

注意:我不能承诺如果你签署CA,你的补丁就会被接受进入Clojure,只能保证如果你不签署CA,补丁就不会被接受。

0

由 alexmiller 发表评论

请添加一个如何发生这种情况的示例以及当前的错误。

0
_由 nathan7_ 发表评论

安迪——是的,我查阅了相关内容。我的CA正在进行中,将很快完成。(填写完毕,已签名,放入信封中,只等待那些该死的国际邮票的到来……)

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的文档字符串的理解是,方法声明必须指定参数列表和有效的返回类型。我希望所有这些都无效。

(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发表

代码似乎暗示了否则,因为它看到了被明确设置为nil的额外分支。
尽管我喜欢PL trivia,但我还没有在Clojure的任何地方遇到"void",因此看到它在这里很令人惊讶。
保持最小意外原则似乎比对nil是否为类型进行学究式分析更可取: (= "nil" (str (type (.methodReturningVoid obj))))

0

由 alexmiller 发表评论

要查找依赖的术语的地方有两个,即文档字符串和https://clojure.org/documentation页面。实现细节只是那样。

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

0

评论由:nathan7发表

那么verage吗?

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 []]])
在(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
by
参考资料:https://clojure.atlassian.net/browse/CLJ-1419(由nathan7报告)
...