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。
向prim→class添加null会起作用(我已附上我的补丁),但与直接修补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是否是类型更可取: (= "nil" (str (type (.methodReturningVoid obj))))

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

评论由:alexmiller

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

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

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

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

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