请在2024年Cloure状态调查!分享您的想法

欢迎!有关此机制的更多信息,请参阅关于页面。

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

Nathan,您是否计划提交一份已签署的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文档字符串的阅读理解是,方法声明必须指定一个参数列表和有效的返回类型。我预期所有这些都不会有效。

(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

但是代码似乎暗示了相反的情况,因为看到了针对pclasses的强制的额外分支为nil。
尽管我喜欢PL的 trivia,但我在Clojure的任何其他地方都没有遇到过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]])
在宏展开 gen-interface 时出现语法错误(REPL:1:1)。
无法从 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
参考: https://clojure.atlassian.net/browse/CLJ-1419(由 nathan7 报告)
...